A programmable endpoint declares what it may do.
Request
GET/v1/programmable-endpoints/ep_7Q4Authorization: Bearer ak_live_7Q4…
Response200 OK
{
"endpointRef": "ep_7Q4",
"accountRef": "acc_8xK2",
"holdingRef": "hld_USD",
"unit": { "kind": "fiat", "currency": "USD" },
"capabilityPosture": {
"receive": "external_and_internal",
"send": "outbound_enabled",
"lifecycle": "manual_retirement",
"purpose": "customer_balance",
"backing": "internal_ledger"
},
"locators": [
{ "form": "uk_sort_code_account", "display": "20-04 …7Q4" }
]
}Request
POST/v1/programmable-endpoints/ep_7Q4/lifecycleAuthorization: Bearer ak_live_7Q4…
Idempotency-Key: ce91-ep-7Q4
{
"operation": "suspend",
"reason": "compliance_hold"
}Response200 OK
{
"endpointRef": "ep_7Q4",
"previousPosture": "active",
"currentPosture": "suspended",
"currentStateVersion": 4
}A posture, dimension by dimension.
Operations
POST/v1/programmable-endpointsOpen a programmable endpoint.idempotent
GET/v1/programmable-endpointsList endpoints.
GET/v1/programmable-endpoints/{endpointRef}Read one endpoint and its posture.
POST/v1/programmable-endpoints/{endpointRef}/lifecycleSuspend or resume an endpoint.idempotent
POST/v1/receiving-endpointsOpen a receiving endpoint.idempotent
GET/v1/receiving-endpoints/currentRead the current receiving endpoint.
Posture is the contract
Every endpoint carries a capabilityPosture: what it may receive and send, how it retires, what backs it, and what it is for. Explore it dimension by dimension below, and read it before you trust an endpoint with value.
Open, list, read
POST /v1/programmable-endpoints opens one against an account owner; GET lists them and reads one by ref. A simpler receiving endpoint, POST /v1/receiving-endpoints, is available when all you need is somewhere for money to land.
Steered by lifecycle
You never edit an endpoint in place. You issue a lifecycle command — suspend or resume — and the response returns the previous and current posture with a new stateVersion. Open obligations block a command rather than stranding value.
When it fails
400invalid-InputThe transition is not allowed from the current posture.
404not-foundNo endpoint at that ref.
409conflict-…Open obligations must clear first, or the endpoint moved since you read it (stale stateVersion).
See endpoints elsewhere
