{"openapi":"3.1.0","info":{"title":"Escrow Transfer API","description":"Send funds to a recipient who may not yet have a Solana wallet. The recipient's wallet is attached after they sign up. Backs the legacy movemoney 'send to phone' flow.","termsOfService":"http://cfxlabs.com/terms/","contact":{"name":"API Owner","url":"https://api.cfxlabs.net","email":"api@cfxlabs.com"},"version":"@VERSION@","summary":"CFX Escrow Transfer API"},"components":{"securitySchemes":{"ApiKeyAuth":{"name":"x-api-key","type":"apiKey","in":"header"},"ApiSecretAuth":{"name":"x-api-secret","type":"apiKey","in":"header"}},"schemas":{}},"paths":{"/v1/escrow-transfers":{"get":{"summary":"List Escrow Transfers","tags":["Escrow Transfer"],"description":"List escrows the calling customer owns. Filters compose (AND) and the customer scope is enforced server-side.","parameters":[{"schema":{"type":"string"},"in":"query","name":"ids","required":false,"description":"Comma-separated escrow ids"},{"schema":{"type":"string"},"in":"query","name":"statuses","required":false,"description":"Comma-separated statuses (PENDING,CREATED,RECIPIENT_SET,CLAIMED,CANCELLED,REJECTED,EXPIRED,FAILED)"},{"schema":{"type":"string"},"in":"query","name":"senderId","required":false},{"schema":{"type":"string"},"in":"query","name":"recipientId","required":false},{"schema":{"type":"string"},"in":"query","name":"recipientPhone","required":false},{"schema":{"type":"integer","minimum":1},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":500},"in":"query","name":"pageSize","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["items","hasNext","total","page","pageSize"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","legacyTransactionId","senderId","senderWallet","recipientId","recipientPhone","recipientWallet","tokenSymbol","amount","status","history","message","claimShortUrl","metadata","escrowStateAccount","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Escrow transfer external id (etr_…)","example":"etr_RD2of9vs3XFodUSd8T5hW"},"legacyTransactionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set only on rows backfilled from movemoney's escrow_transfer_transaction (snd_…)"},"senderId":{"type":"string","description":"Customer-scoped identity id of the sender"},"senderWallet":{"type":"string","description":"Sender Solana wallet address"},"recipientId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Customer-scoped identity id of the recipient — null until they sign up"},"recipientPhone":{"type":"string","description":"E.164 phone number","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"recipientWallet":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recipient Solana wallet — null until recipient signs up"},"tokenSymbol":{"type":"string","example":"MOVEUSD"},"amount":{"type":"string","description":"Big-number string"},"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]},"history":{"type":"array","items":{"type":"object","required":["status","at"],"properties":{"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]},"at":{"type":"string","description":"ISO 8601 timestamp"},"signature":{"type":"string","description":"Solana transaction signature"},"detail":{"type":"string"}},"title":"EscrowTransferHistoryEntry"}},"message":{"anyOf":[{"type":"string"},{"type":"null"}]},"claimShortUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Resolvable short URL the recipient is sent to claim the transfer (cfx-link host + short id). Null until the recipient-SMS phase mints it, or when the short-url base is unconfigured."},"metadata":{"type":"object","additionalProperties":{}},"escrowStateAccount":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"On-chain EscrowState PDA; populated once `create_escrow` has confirmed"},"expiresAt":{"type":"string","description":"ISO 8601 — auto-expiry timestamp"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"title":"EscrowTransfer"}},"hasNext":{"type":"boolean"},"total":{"type":"integer","minimum":0},"page":{"type":"integer","minimum":1},"pageSize":{"type":"integer","minimum":1}}}}}},"400":{"description":"The service cannot understand the request","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}},"post":{"summary":"Create Escrow Transfer Quote","tags":["Escrow Transfer"],"description":"Create an escrow transfer quote. The caller supplies the sender's self-custody `senderWallet`; the server allocates an on-chain nonce, builds the `create_escrow` transaction with PAYER + NONCE_AUTHORITY signature slots zeroed, and persists a PENDING row. The sender client signs the returned `unsignedTransaction` and POSTs it back to `/v1/escrow-transfers/{id}/accept` to accept the quote and broadcast.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["senderId","senderWallet","recipientPhone","tokenSymbol","amount"],"properties":{"senderId":{"type":"string","description":"Customer-scoped identity id of the sender"},"senderWallet":{"type":"string","description":"Sender's self-custody Solana public key (base58). The sender signs the returned `unsignedTransaction` with this wallet's key.","pattern":"^[1-9A-HJ-NP-Za-km-z]{32,44}$","example":"7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK"},"recipientPhone":{"type":"string","description":"E.164 phone number of the recipient","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"tokenSymbol":{"type":"string","description":"Token symbol — e.g. MOVEUSD, USDC","example":"MOVEUSD"},"amount":{"type":"string","description":"BigNumber-parseable human-decimal token amount (e.g. \"1.31\"), not raw base units","example":"1.31"},"message":{"type":"string","maxLength":280,"description":"Optional human-readable note from the sender"},"claimUrl":{"type":"string","description":"URL the recipient is sent to claim the transfer; shortened and embedded in the recipient SMS.","format":"uri"},"metadata":{"type":"object","additionalProperties":{}}}}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status","customerId","senderId","senderWallet","recipientPhone","tokenSymbol","amount","nonce","expiresAt","createdAt","unsignedTransaction"],"properties":{"id":{"type":"string","description":"Escrow transfer external id (etr_…)","example":"etr_RD2of9vs3XFodUSd8T5hW"},"status":{"type":"string","enum":["PENDING"]},"customerId":{"type":"string"},"senderId":{"type":"string"},"senderWallet":{"type":"string"},"recipientPhone":{"type":"string"},"tokenSymbol":{"type":"string"},"amount":{"type":"string","description":"Big-number string"},"nonce":{"type":"string","description":"Server-allocated per-sender on-chain nonce as decimal"},"expiresAt":{"type":"string","description":"ISO 8601 — escrow auto-expiry timestamp"},"createdAt":{"type":"string"},"unsignedTransaction":{"type":"string","description":"Base64-encoded v0 VersionedTransaction with all signature slots zeroed — the sender must sign and POST to /v1/escrow-transfers/{id}/accept"}},"title":"CreateEscrowTransferResponse"}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["SELF_SEND"]},"message":{"type":"string"}},"title":"SELF_SEND","description":"A service error has occurred"}]}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["SENDER_NOT_FOUND"]},"message":{"type":"string"}},"title":"SENDER_NOT_FOUND","description":"A service error has occurred"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["TOKEN_NOT_FOUND"]},"message":{"type":"string"}},"title":"TOKEN_NOT_FOUND","description":"A service error has occurred"}]}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NONCE_EXHAUSTED"]},"message":{"type":"string"}},"title":"NONCE_EXHAUSTED","description":"A service error has occurred"}]}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/{id}":{"get":{"summary":"Get Escrow Transfer","tags":["Escrow Transfer"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","legacyTransactionId","senderId","senderWallet","recipientId","recipientPhone","recipientWallet","tokenSymbol","amount","status","history","message","claimShortUrl","metadata","escrowStateAccount","expiresAt","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Escrow transfer external id (etr_…)","example":"etr_RD2of9vs3XFodUSd8T5hW"},"legacyTransactionId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Set only on rows backfilled from movemoney's escrow_transfer_transaction (snd_…)"},"senderId":{"type":"string","description":"Customer-scoped identity id of the sender"},"senderWallet":{"type":"string","description":"Sender Solana wallet address"},"recipientId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Customer-scoped identity id of the recipient — null until they sign up"},"recipientPhone":{"type":"string","description":"E.164 phone number","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"recipientWallet":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Recipient Solana wallet — null until recipient signs up"},"tokenSymbol":{"type":"string","example":"MOVEUSD"},"amount":{"type":"string","description":"Big-number string"},"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]},"history":{"type":"array","items":{"type":"object","required":["status","at"],"properties":{"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]},"at":{"type":"string","description":"ISO 8601 timestamp"},"signature":{"type":"string","description":"Solana transaction signature"},"detail":{"type":"string"}},"title":"EscrowTransferHistoryEntry"}},"message":{"anyOf":[{"type":"string"},{"type":"null"}]},"claimShortUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}],"description":"Resolvable short URL the recipient is sent to claim the transfer (cfx-link host + short id). Null until the recipient-SMS phase mints it, or when the short-url base is unconfigured."},"metadata":{"type":"object","additionalProperties":{}},"escrowStateAccount":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"On-chain EscrowState PDA; populated once `create_escrow` has confirmed"},"expiresAt":{"type":"string","description":"ISO 8601 — auto-expiry timestamp"},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"title":"EscrowTransfer"}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/{id}/accept":{"post":{"summary":"Accept Escrow Transfer Quote","tags":["Escrow Transfer"],"description":"Accept a quote by submitting the fully-signed `create_escrow` transaction (built server-side, signed by the sender client-side). Kicks off `createEscrowTransferWorkflow` and schedules the 10-day expire fallback.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["signedTransaction"],"properties":{"signedTransaction":{"type":"string","description":"Base64-encoded fully-signed v0 transaction — the sender signs the `unsignedTransaction` returned by the create-quote call and submits it here to accept."},"claimUrl":{"type":"string","description":"URL the recipient is sent to claim the transfer; shortened and embedded in the recipient SMS.","format":"uri"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"A duplicate request with this idempotency key is already in progress","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/{id}/recipient":{"post":{"summary":"Attach Recipient Wallet","tags":["Escrow Transfer"],"description":"Called after the recipient signs up — kicks off `updateEscrowRecipientWorkflow`, which uses the update authority to bind the wallet on chain.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["recipientId","recipientWallet"],"properties":{"recipientId":{"type":"string","description":"Customer-scoped id of the newly-onboarded recipient"},"recipientWallet":{"type":"string","description":"Recipient's Solana wallet address"},"claimUrl":{"type":"string","description":"URL the recipient is sent to claim the transfer; shortened and embedded in the recipient SMS.","format":"uri"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"A duplicate request with this idempotency key is already in progress","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/{id}/claim":{"post":{"summary":"Claim Escrow Transfer","tags":["Escrow Transfer"],"description":"Recipient claims the transfer. Funds are released by the release authority.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["claimerId"],"properties":{"claimerId":{"type":"string","description":"Must match the row's recipientId"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"A duplicate request with this idempotency key is already in progress","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/{id}/reject":{"post":{"summary":"Reject Escrow Transfer","tags":["Escrow Transfer"],"description":"Recipient rejects; funds return to sender.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["actorRole"],"properties":{"actorRole":{"type":"string","enum":["RECIPIENT","AUTHORITY"]}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"A duplicate request with this idempotency key is already in progress","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/{id}/cancel":{"post":{"summary":"Cancel Escrow Transfer (Sender)","tags":["Escrow Transfer"],"description":"Sender-initiated recall of an escrow that has not yet been claimed. Kicks off `cancelEscrowTransferWorkflow`; the release authority cancels the on-chain escrow and the row transitions to `CANCELLED`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["senderId"],"properties":{"senderId":{"type":"string","description":"Customer-scoped id of the sender requesting recall. Must match the row's senderId; otherwise the workflow fails non-retryably."}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["PENDING","CREATED","RECIPIENT_SET","CLAIMED","CANCELLED","REJECTED","EXPIRED","FAILED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"403":{"description":"A service error has occurred","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["FORBIDDEN"]},"message":{"type":"string"}},"title":"FORBIDDEN","description":"A service error has occurred"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"A duplicate request with this idempotency key is already in progress","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/requests":{"get":{"summary":"List Escrow Transfer Requests","tags":["Escrow Transfer"],"description":"List escrow transfer requests the calling customer owns. Filter by `senderId` (requests this identity sent) or `recipientPhone` (requests addressed to this phone). Filters compose (AND) and the customer scope is enforced server-side.","parameters":[{"schema":{"type":"string"},"in":"query","name":"senderId","required":false,"description":"Filter to requests sent by this identity id"},{"schema":{"type":"string"},"in":"query","name":"recipientPhone","required":false,"description":"Filter to requests addressed to this E.164 phone"},{"schema":{"type":"string"},"in":"query","name":"statuses","required":false,"description":"Comma-separated statuses (CREATED,SENT,CANCELLED,REJECTED)"},{"schema":{"type":"integer","minimum":1},"in":"query","name":"page","required":false},{"schema":{"type":"integer","minimum":1,"maximum":500},"in":"query","name":"pageSize","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["items","hasNext","total","page","pageSize"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","senderId","senderPhone","recipientId","recipientPhone","tokenSymbol","amount","message","escrowTransferId","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Escrow transfer request external id (etrq_…)","example":"etrq_RD2of9vs3XFodUSd8T5hW"},"senderId":{"type":"string","description":"Customer-scoped identity id of the requester (sender)"},"senderPhone":{"type":"string","description":"E.164 phone number of the requester","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"recipientId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Customer-scoped identity id of the recipient — null when the recipient is not (yet) a known identity"},"recipientPhone":{"type":"string","description":"E.164 phone number the request is sent to","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"tokenSymbol":{"type":"string","description":"Token symbol the request is denominated in","example":"MOVEUSD"},"amount":{"type":"string","description":"Big-number string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional human-readable note from the requester"},"escrowTransferId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External id (etr_…) of the escrow transfer that fulfilled this request; null until status is SENT"},"status":{"type":"string","enum":["CREATED","SENT","CANCELLED","REJECTED"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"title":"EscrowTransferRequest"}},"hasNext":{"type":"boolean"},"total":{"type":"integer","minimum":0},"page":{"type":"integer","minimum":1},"pageSize":{"type":"integer","minimum":1}}}}}},"400":{"description":"The service cannot understand the request","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}},"post":{"summary":"Create Escrow Transfer Request","tags":["Escrow Transfer"],"description":"Create a request for payment. A request is the intent that precedes an `escrow_transfer`: the recipient (addressed by phone, possibly before sign-up) is asked to be paid. When the sender later pays, call `/accept` with the resulting escrow transfer id to move the request to SENT.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["senderId","senderPhone","recipientPhone","tokenSymbol","amount"],"properties":{"senderId":{"type":"string","description":"Customer-scoped identity id of the requester (sender)"},"senderPhone":{"type":"string","description":"E.164 phone number of the requester","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"recipientPhone":{"type":"string","description":"E.164 phone number to request payment from","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"tokenSymbol":{"type":"string","description":"Token symbol the request is denominated in — e.g. MOVEUSD","example":"MOVEUSD"},"amount":{"type":"string","description":"BigNumber-parseable human-decimal token amount (e.g. \"1.31\"), not raw base units","example":"1.31"},"message":{"type":"string","maxLength":280,"description":"Optional human-readable note from the requester"},"payUrl":{"type":"string","maxLength":2048,"description":"Optional 'tap to pay' link for the recipient SMS. Shortened via the short-URL service and embedded as the call-to-action. Not persisted on the request.","example":"https://app.example.com/pay/etrq_RD2of9vs3XFodUSd8T5hW"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"201":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","senderId","senderPhone","recipientId","recipientPhone","tokenSymbol","amount","message","escrowTransferId","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Escrow transfer request external id (etrq_…)","example":"etrq_RD2of9vs3XFodUSd8T5hW"},"senderId":{"type":"string","description":"Customer-scoped identity id of the requester (sender)"},"senderPhone":{"type":"string","description":"E.164 phone number of the requester","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"recipientId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Customer-scoped identity id of the recipient — null when the recipient is not (yet) a known identity"},"recipientPhone":{"type":"string","description":"E.164 phone number the request is sent to","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"tokenSymbol":{"type":"string","description":"Token symbol the request is denominated in","example":"MOVEUSD"},"amount":{"type":"string","description":"Big-number string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional human-readable note from the requester"},"escrowTransferId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External id (etr_…) of the escrow transfer that fulfilled this request; null until status is SENT"},"status":{"type":"string","enum":["CREATED","SENT","CANCELLED","REJECTED"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"title":"EscrowTransferRequest"}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["SELF_SEND"]},"message":{"type":"string"}},"title":"SELF_SEND","description":"A service error has occurred"}]}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"409":{"description":"A duplicate request with this idempotency key is already in progress","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/requests/{id}":{"get":{"summary":"Get Escrow Transfer Request","tags":["Escrow Transfer"],"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","senderId","senderPhone","recipientId","recipientPhone","tokenSymbol","amount","message","escrowTransferId","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","description":"Escrow transfer request external id (etrq_…)","example":"etrq_RD2of9vs3XFodUSd8T5hW"},"senderId":{"type":"string","description":"Customer-scoped identity id of the requester (sender)"},"senderPhone":{"type":"string","description":"E.164 phone number of the requester","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"recipientId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Customer-scoped identity id of the recipient — null when the recipient is not (yet) a known identity"},"recipientPhone":{"type":"string","description":"E.164 phone number the request is sent to","pattern":"^\\+[1-9]\\d{1,14}$","minLength":3,"maxLength":16,"example":"+15551234567"},"tokenSymbol":{"type":"string","description":"Token symbol the request is denominated in","example":"MOVEUSD"},"amount":{"type":"string","description":"Big-number string"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Optional human-readable note from the requester"},"escrowTransferId":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"External id (etr_…) of the escrow transfer that fulfilled this request; null until status is SENT"},"status":{"type":"string","enum":["CREATED","SENT","CANCELLED","REJECTED"]},"createdAt":{"type":"string"},"updatedAt":{"type":"string"}},"title":"EscrowTransferRequest"}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/requests/{id}/cancel":{"post":{"summary":"Cancel Escrow Transfer Request","tags":["Escrow Transfer"],"description":"Mark the request CANCELLED. Only CREATED requests can be cancelled. The caller is responsible for authorizing that the actor is the request's sender — the API enforces customer-scope only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["CREATED","SENT","CANCELLED","REJECTED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_STATUS_TRANSITION"]},"message":{"type":"string"}},"title":"INVALID_STATUS_TRANSITION","description":"The request is not in a status the action is allowed from — only CREATED requests can be cancelled, rejected, or accepted"}]}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/requests/{id}/reject":{"post":{"summary":"Reject Escrow Transfer Request","tags":["Escrow Transfer"],"description":"Mark the request REJECTED. Only CREATED requests can be rejected. The caller is responsible for authorizing that the actor is the request's recipient — the API enforces customer-scope only.","parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["CREATED","SENT","CANCELLED","REJECTED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_STATUS_TRANSITION"]},"message":{"type":"string"}},"title":"INVALID_STATUS_TRANSITION","description":"The request is not in a status the action is allowed from — only CREATED requests can be cancelled, rejected, or accepted"}]}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}},"/v1/escrow-transfers/requests/{id}/accept":{"post":{"summary":"Accept Escrow Transfer Request","tags":["Escrow Transfer"],"description":"Record that the recipient accepted the request and was paid: links the fulfilling escrow transfer id and moves the request to SENT. Only CREATED requests can be accepted; an escrow transfer id already linked to another request is rejected.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["escrowTransferId"],"properties":{"escrowTransferId":{"type":"string","description":"External id (etr_…) of the escrow transfer that paid this request. Recorded on the request as it transitions to SENT.","example":"etr_RD2of9vs3XFodUSd8T5hW"}}}}}},"parameters":[{"schema":{"type":"string"},"in":"path","name":"id","required":true},{"schema":{"type":"string"},"in":"header","name":"Idempotency-Key","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","required":["id","status"],"properties":{"id":{"type":"string"},"status":{"type":"string","enum":["CREATED","SENT","CANCELLED","REJECTED"]}}}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["MISSING_IDEMPOTENCY_KEY"]},"message":{"type":"string"}},"title":"MISSING_IDEMPOTENCY_KEY","description":"Missing required idempotency key header"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_REQUEST"]},"message":{"type":"string"},"errors":{"type":"array","items":{"type":"object","properties":{},"additionalProperties":true}}},"title":"INVALID_REQUEST","description":"The service cannot understand the request"}]}}}},"401":{"description":"The access to this resource has been denied","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["UNAUTHORIZED"]},"message":{"type":"string"}},"title":"UNAUTHORIZED","description":"The access to this resource has been denied"}}}},"404":{"description":"The resource was not found","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["NOT_FOUND"]},"message":{"type":"string"}},"title":"NOT_FOUND","description":"The resource was not found"}}}},"409":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_IN_PROGRESS"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_IN_PROGRESS","description":"A duplicate request with this idempotency key is already in progress"},{"anyOf":[{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INVALID_STATUS_TRANSITION"]},"message":{"type":"string"}},"title":"INVALID_STATUS_TRANSITION","description":"The request is not in a status the action is allowed from — only CREATED requests can be cancelled, rejected, or accepted"},{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["ESCROW_TRANSFER_ALREADY_LINKED"]},"message":{"type":"string"}},"title":"ESCROW_TRANSFER_ALREADY_LINKED","description":"The escrow transfer id is already linked to a different request"}]}]}}}},"422":{"description":"Another request with this idempotency key was made using a different body","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["IDEMPOTENCY_KEY_REUSED"]},"message":{"type":"string"}},"title":"IDEMPOTENCY_KEY_REUSED","description":"Another request with this idempotency key was made using a different body"}}}},"default":{"description":"Catch-all error response for any unexpected internal errors","content":{"application/json":{"schema":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["INTERNAL"]},"message":{"type":"string","enum":["An unexpected internal error has occurred"]}},"title":"INTERNAL","description":"Catch-all error response for any unexpected internal errors"}}}}}}}},"servers":[{"url":"https://api.dev.cfx.to","description":"Customer Sandbox"},{"url":"https://api.cfx.to","description":"Production"}],"security":[{"ApiKeyAuth":[],"ApiSecretAuth":[]}],"tags":[{"name":"Escrow Transfer"}],"externalDocs":{"description":"Find out more about CFX","url":"https://www.cfxlabs.com/"}}