publ betaReference (MCP guide)
Open publ console

channel_points_handoff — Prepare an original-console point action

# channel_points_handoff — Prepare an original-console point action

Use this to select a human action after observing its current channel context and attempting the applicable prerequisites. An owner or delegate with MANAGE_MONETIZATION must be connected to the channel. The source hosted selected-channel allowlist requires the exact channelCode; account scope excludes this tool.

Inputs are strict: channelCode follows [the point reader](publ_channel_points_get.md), and action is a discriminated object. No amount, ratio, price, bank number, provision HTML, credentials, raw URL, requestId, dryRun or task identity is accepted.

| action.kind | Additional fields | Prerequisite observation / console destination |
| --- | --- | --- |
| setup | None | Stable setup preset; Channel Point home/onboarding container. |
| policy | None | Branding/context; policy settings. Does not read the settings form. |
| provisions | None | Branding/context; provision edit screen. Does not read provision contents. |
| create-product | None | Branding/context; charge-product list/modal. |
| edit-product, activate-product, deactivate-product, delete-product | action.publProductId, action.page, action.limit | Stable selected WEB product and parent page; product-list editor. |
| request-withdrawal | None | Attempt stable WEB ledger and source screen gate; a bounded source failure can still return the withdrawal request screen after access revalidation. |
| revise-withdrawal | action.ticketId, action.page, action.limit | Stable selected ticket and repeated parent; exact withdrawal detail screen. |

Identifiers are 1–256 characters with the reader's path/control exclusions. Page defaults to 1 and is a positive safe integer up to 1,000,000. Limit is 15/30/50/100 and defaults to 15.

```json
{"channelCode":"selected-channel-code","action":{"kind":"setup"}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"policy"}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"provisions"}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"create-product"}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"edit-product","publProductId":"observed-product-id","page":1,"limit":15}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"activate-product","publProductId":"observed-product-id"}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"deactivate-product","publProductId":"observed-product-id"}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"delete-product","publProductId":"observed-product-id"}}
```

```json
{"channelCode":"selected-channel-code","action":{"kind":"request-withdrawal"}}
```

Select the ticket from the explicit observed parent page:

```json
{"channelCode":"selected-channel-code","action":{"kind":"revise-withdrawal","ticketId":"observed-ticket-id","page":1,"limit":15}}
```

Successful preparation returns action_required / POINT_HUMAN_ACTION_REQUIRED, action, observed data, writesPerformed:false, humanAction.submitted:false and verification.confirmed:false / prerequisitesObserved:true / financialActionCompleted:false. It rechecks branding except for setup and checks selected context. This is human guidance, not a promise that the console permits the requested action. The source offers bank edits for REQUESTED tickets; the bridge does not execute or reserve them. Demo omits real console links.

For request-withdrawal, setup, create-product, policy or provisions, a bounded prerequisite failure can return action_required / POINT_WITHDRAWAL_CONSOLE_REQUIRED (withdrawal) or POINT_CONSOLE_REQUIRED (the other four actions) after a fresh channel/actor/permission/credential context comparison. Eligible error codes are UPSTREAM_HTTP_404, UPSTREAM_HTTP_5xx, UPSTREAM_UNREACHABLE, POINT_RESPONSE_UNVERIFIED and POINT_RESPONSE_TOO_LARGE. This covers applicable setup-preset, branding or ledger observations without requiring a verified financial state. The result contains the exact selected destination (home/onboarding, charge products, policy settings, provision edit or withdrawal request), action, prerequisiteError.code, eligibility:not-observed, writesPerformed:false, humanAction.submitted:false and verification.confirmed:false / prerequisitesObserved:false / channelAccessObserved:true / financialActionCompleted:false. No partial observed balance or invented financial data is returned.

Initial or repeated authentication/permission/context failures still reject. Currency, channel and identity mismatches are not part of this fallback. Selected-product actions and revise-withdrawal retain their original prerequisite failures; a selected product or ticket is never accepted through this unselected-screen exception.

Other preparation exceptions return the error envelope with screenId and environment, without channel, consoleUrl, observed, humanAction or the successful verification fields. writesPerformed:false is not an error-envelope guarantee. Resolve the reported failure before retrying.

Reader errors and handoff errors outside the bounded exception remain failures; missing branding never becomes inactive. After the person acts, repeat the corresponding get view. Do not call task_status/task_resume to replay a financial action: this tool creates no job. Issuance, correction, reclaim, waiver, purchase and financial submission remain with the person in the original service.

## Finance page and selected-record navigation

Successful finance reads keep the existing string `view` and additionally return
normalized `selection`. Successful observed human handoffs return their normalized
action as `selection`; unavailable-prerequisite fallbacks retain their prior shape.

`ledger-history` and `withdrawals` preserve the requested page and limit in the
single console address. Their `consoleView` reports the destination page, limit
and `exactMatch`. An empty API page beyond the observed total keeps its original
pagination and records while navigation explicitly opens the first parent list
at page1/limit15 with `exactMatch:false`. It is not the returned empty API page.
An empty first page remains an exact list destination. No second page is fetched.

Selected `product` reads and edit/activate/deactivate/delete-product handoffs keep
the verified parent page/limit. Their navigation relation is `parent` even when
that list page matches exactly: select the observed product row to open its editor.
No product modal deep link or completed financial action is inferred.
`withdrawal-detail` and revise-withdrawal instead open the exact observed ticket
route with target navigation and no list queries. Bank masking remains in place;
source bank-edit availability still depends on REQUESTED status.

The navigation boundary binds normalized selection, page/count/coverage, row identity, financial currency and the selected product or ticket projection. Mismatched selection, target, page, verification or destination suppresses the address. Unselected human destinations and missing-prerequisite fallbacks retain their existing source screens and financial-action boundaries.

## Inputs

| Field | Required here | Contract |
| --- | --- | --- |
| `action` | Yes | one of: `setup`, `create-product`, `edit-product`, `activate-product`, `deactivate-product`, `policy`, `provisions`, `request-withdrawal`, `revise-withdrawal` (by `kind`) |
| `action.publProductId` | Yes | When `action.kind` is `edit-product`: string; min length 1; max length 256 |
| `action.page` | No | When `action.kind` is `edit-product`: integer; maximum 1000000; greater than 0; default `1` |
| `action.limit` | No | When `action.kind` is `edit-product`: `15` or `30` or `50` or `100`; default `15` |
| `action.publProductId` | Yes | When `action.kind` is `activate-product`: string; min length 1; max length 256 |
| `action.page` | No | When `action.kind` is `activate-product`: integer; maximum 1000000; greater than 0; default `1` |
| `action.limit` | No | When `action.kind` is `activate-product`: `15` or `30` or `50` or `100`; default `15` |
| `action.publProductId` | Yes | When `action.kind` is `deactivate-product`: string; min length 1; max length 256 |
| `action.page` | No | When `action.kind` is `deactivate-product`: integer; maximum 1000000; greater than 0; default `1` |
| `action.limit` | No | When `action.kind` is `deactivate-product`: `15` or `30` or `50` or `100`; default `15` |
| `action.ticketId` | Yes | When `action.kind` is `revise-withdrawal`: string; min length 1; max length 256 |
| `action.page` | No | When `action.kind` is `revise-withdrawal`: integer; maximum 1000000; greater than 0; default `1` |
| `action.limit` | No | When `action.kind` is `revise-withdrawal`: `15` or `30` or `50` or `100`; default `15` |