Home / API Guide

API guide and full API reference

REST API v1  |  Developer integration manual

Secure transaction orchestration for buyers, sellers, brokers, funding, delivery, approvals and controlled fund release.

Base URL

https://api.rbcpay.com/v1

API version

v1

Format

REST over HTTPS, JSON requests and responses

Authentication

OAuth 2.0 bearer access tokens

Developer quick reference

NeedEndpoint or action
AuthenticatePOST /oauth/token
Create transactionPOST /transactions
Read transactionGET /transactions/{id}
Submit for acceptancePOST /transactions/{id}/submit
Accept termsPOST /transactions/{id}/accept
Create fundingPOST /transactions/{id}/funding-intents
Check fundingGET /transactions/{id}/funding
Report fulfilmentPOST /transactions/{id}/fulfilments
Confirm receiptPOST /transactions/{id}/confirm-receipt
Release fundsPOST /transactions/{id}/release
RefundPOST /transactions/{id}/refunds
Open disputePOST /transactions/{id}/disputes
Upload evidencePOST /files
Register webhookPOST /webhook-endpoints
Reconcile eventsGET /events

Full API reference

RBC PAY / DEVELOPER DOCUMENTATION

RBC PAY

API GUIDE & FULL API REFERENCE

REST API v1 | Developer Integration Manual

Secure transaction orchestration for buyers, sellers, brokers, funding, delivery, approvals and controlled fund release.

Publication note This manual expands the public RBC Pay API Guide into a complete v1 integration specification. The public guide confirms the core REST/OAuth/JSON architecture and transaction lifecycle. Resource fields and endpoints not yet described publicly are specified here as the v1 implementation contract and should be validated against the deployed backend before public launch.

Version 1.0 | August 26, 2026

https://api.rbcpay.com/v1

Document control

ItemValue
DocumentRBC Pay API Guide & Full API Reference
Version1.0
API versionv1
Base URLhttps://api.rbcpay.com/v1
FormatREST over HTTPS; JSON requests and responses
AuthenticationOAuth 2.0 bearer access tokens
Intended readersBackend engineers, platform architects, security teams, QA, integration partners, brokers and technical operations
StatusDeveloper reference specification; confirm implementation-specific limits and production availability before release

Conventions used in this guide

All timestamps use ISO 8601 / RFC 3339 in UTC, for example 2026-08-26T18:42:31Z.

All monetary amounts use decimal strings in request/response examples where precision matters. Do not use binary floating-point for accounting logic.

Resource identifiers are opaque strings such as txn_01J…, pty_01J…, wh_01J…. Do not infer business meaning from IDs.

Fields marked required are required by this reference contract unless the endpoint says otherwise.

Sensitive credentials belong on trusted server-side systems only.

1. Platform overview

RBC Pay provides a transaction API for coordinating commercial transactions between buyers, sellers and, when applicable, brokers. The API is designed around explicit transaction terms, party acceptance, confirmed funding, fulfilment, receipt or approval, controlled fund release, commission allocation and an auditable event history.

The public RBC Pay API Guide describes a practical lifecycle: create the transaction, fund it, complete approvals, deliver or fulfil, release funds, and pay the participants. It also identifies OAuth 2.0, HTTPS/JSON REST endpoints, webhooks, sandbox testing, IP allowlisting and server-side credential handling as core integration concepts.

1.1 Design principles

Server-to-server by default: secret credentials never ship in browser or mobile application code.

State-driven workflow: integrations act on authoritative transaction status rather than guessing from UI state.

Explicit approval: acceptance and release actions are represented as API operations with timestamps and actors.

Idempotent money movement: creation, funding, release, refund and dispute actions are protected from duplicate submission.

Webhook-first synchronization: applications receive events and reconcile them against the API.

Auditability: material state changes produce immutable events suitable for operational review.

1.2 High-level architecture

Client Backend  --->  RBC Pay API  --->  Transaction Ledger / Risk / Payment Rails
      |                    |
      |<--- Webhooks -------|
      |
      +-- Your database, order system, CRM, notifications and reconciliation jobs

2. Environments and base URLs

EnvironmentBase URLPurpose
Productionhttps://api.rbcpay.com/v1Live transactions and production credentials.
SandboxProvisioned through the RBC Pay developer environmentSafe integration testing using non-production credentials and test scenarios.
Environment isolation Treat sandbox and production as completely separate security domains. Never reuse secrets, webhook signing secrets, idempotency keys or stored test data across environments.

2.1 Transport requirements

HTTPS only. Reject plaintext HTTP and never follow a downgrade redirect for API requests.

Use TLS 1.2 or later; TLS 1.3 is preferred where supported.

Send UTF-8 JSON with Content-Type: application/json unless uploading a file.

Set a descriptive User-Agent, for example MyPlatform/2.4 rbcpay-integration/1.0.

3. Authentication and authorization

RBC Pay uses OAuth 2.0 bearer access tokens. Every authenticated API request includes the access token in the Authorization header. Credentials and tokens must remain on trusted server-side systems.
Authorization: Bearer {access_token}

3.1 Recommended OAuth flow

For machine-to-machine integrations, use the OAuth 2.0 client credentials grant. A partner exchanges its client ID and client secret for a short-lived access token and requests only the scopes required by that integration.
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&scope=transactions:read transactions:write webhooks:manage

3.2 Scopes

ScopeAllows
transactions:readRead transactions, statuses, terms and related event metadata.
transactions:writeCreate and modify permitted transaction terms and workflow actions.
parties:readRead party participation and acceptance status.
parties:writeInvite or manage permitted transaction participants.
funding:readRead funding instructions and confirmed funding state.
funding:writeCreate permitted funding intents or confirm authorized funding workflow actions.
payouts:readRead release and payout status.
payouts:writeInitiate permitted release operations.
refunds:writeCreate refunds where allowed.
disputes:readRead dispute cases and evidence requirements.
disputes:writeOpen disputes and submit dispute evidence.
files:writeUpload files/evidence to a transaction or dispute.
events:readRead immutable API event history.
webhooks:manageCreate, rotate, disable and inspect webhook endpoints.

3.3 Token handling

Cache access tokens only for their valid lifetime and refresh by obtaining a new token, not by extending local expiry.

Never log client secrets, bearer tokens, webhook secrets, bank credentials or full identity documents.

Rotate client secrets routinely and immediately after suspected exposure.

Use separate credentials per production service or integration where operationally possible.

4. Security requirements

4.1 IP allowlisting

Production credentials can be restricted to approved source IP ranges. Design integrations so outbound API traffic originates from stable, documented egress addresses.

4.2 Secret storage

Store secrets in a managed secrets service, HSM-backed key store or equivalent protected environment variable injection system.

Apply least privilege to people and workloads that can read production credentials.

Do not put API credentials in source control, container images, ticketing systems, screenshots or client-side JavaScript.

4.3 Sensitive data minimization

Send only data required to establish the transaction, perform compliance checks, reconcile payment state or resolve a dispute. Avoid placing unnecessary personal or financial information in free-text fields.

4.4 Logging

Log request IDs, resource IDs, endpoint paths, response status, latency and internal correlation IDs. Redact Authorization headers, secrets, payment credentials, identity documents and private evidence URLs.

5. Request conventions

5.1 Common request headers

HeaderRequiredDescription
AuthorizationYesBearer access token.
Content-TypeFor JSON writesapplication/json.
AcceptRecommendedapplication/json.
Idempotency-KeyMoney/creation writesUnique key for safely retrying a write.
X-Request-IDRecommendedClient-generated trace identifier. Use a UUID or equivalent unique value.
User-AgentRecommendedIdentifies your integration and version.

5.2 Common response headers

HeaderMeaning
X-Request-IDRBC Pay request identifier used for support and tracing.
RateLimit-LimitMaximum requests in the current policy window, when supplied.
RateLimit-RemainingRequests remaining in the policy window, when supplied.
RateLimit-ResetTime or offset until the limit resets, when supplied.
Retry-AfterSeconds to wait after 429 or certain transient failures.

5.3 Monetary fields

Represent money as a decimal string plus an ISO 4217 currency code. Example: {“amount”:”12500.00″,”currency”:”CAD”}. Your ledger must use decimal or integer minor-unit arithmetic, never binary floating-point arithmetic.

5.4 Dates and timestamps

Use UTC timestamps in RFC 3339. Date-only contractual deadlines use YYYY-MM-DD and must be interpreted according to the transaction agreement and jurisdiction.

6. Idempotency and retries

Any request that can create a duplicate financial or contractual effect must be idempotent. Send an Idempotency-Key that is unique to the logical operation, not merely to the HTTP attempt.
Idempotency-Key: 6f6ab41d-4d15-47a6-b893-963dd870a8e8

Reuse the same key when retrying the exact same logical request after a timeout or transient 5xx failure.

Use a new key when the intended operation or request body changes.

Store the key and resulting RBC Pay resource ID in your own database for reconciliation.

Do not automatically retry 4xx validation, authorization or business-rule failures unless the underlying cause is corrected.

6.1 Retry policy

Use exponential backoff with jitter for 429 and retryable 5xx responses. Honor Retry-After when present. Cap retries and move persistent failures into an operational queue for review.

7. Pagination, filtering and expansion

7.1 Cursor pagination

GET /transactions?limit=50&starting_after=txn_01J...
{
  "object": "list",
  "data": [...],
  "has_more": true,
  "next_cursor": "txn_01J..."
}

7.2 Common filters

QueryExamplePurpose
statusfundedFilter by resource status.
created_from2026-08-01T00:00:00ZLower time bound.
created_to2026-08-31T23:59:59ZUpper time bound.
buyer_emailbuyer@example.comOperational lookup where permitted.
external_referenceORDER-94821Correlate to your system.
limit50Page size; server-enforced max applies.

8. Transaction lifecycle and state machine

The transaction is the primary orchestration object. Its status represents the latest authoritative workflow state. An integration must not release goods, acknowledge payment, or mark an order completed based solely on a client-side screen or email; confirm state through the API and/or a verified webhook.
StatusMeaningTypical next actions
draftTerms are being assembled.Update terms, add parties, submit for acceptance.
pending_acceptanceWaiting for one or more required parties.Party accepts or rejects.
acceptedRequired parties accepted the current terms.Create/complete funding.
funding_pendingFunding initiated but not confirmed.Wait for funding event; reconcile.
fundedRequired funds confirmed as received/secured.Seller fulfils; add shipping/delivery evidence.
in_fulfilmentGoods/services are being delivered.Update fulfilment; buyer reviews.
deliveredDelivery or fulfilment reported.Buyer confirms receipt/approval; inspection window runs.
release_pendingRelease was requested and is processing.Wait for payout state.
releasedAuthorized funds released to seller/beneficiaries.Reconcile payout/commission.
partially_refundedPart of the transaction was refunded.Continue or close per agreement.
refundedFunds returned according to refund action.Close/reconcile.
disputedA dispute prevents normal release.Submit evidence; await resolution.
cancelledTransaction terminated before final release.Reconcile any return of funds.
closedNo further ordinary workflow action is expected.Retain records and audit history.

8.1 State-change rules

Material term changes after acceptance invalidate the relevant acceptance and return the transaction to pending_acceptance unless the change is explicitly classified as non-material.

Funding confirmation is authoritative only when status becomes funded or the funding resource shows confirmed/succeeded.

Release is permitted only when required contractual conditions are satisfied or an authorized dispute/administrative decision permits release.

A dispute can place a hold on release until resolution.

9. Core resource models

9.1 Transaction object

FieldTypeDescription
idstringOpaque transaction ID.
objectstring“transaction”.
statusenumCurrent transaction status.
titlestringHuman-readable transaction title.
descriptionstring│nullOptional summary.
amountdecimal stringGross transaction amount.
currencystringISO 4217 code, e.g. CAD.
external_referencestring│nullYour order/deal/reference ID.
buyerparty summaryBuyer participant.
sellerparty summarySeller participant.
brokersarrayBroker participants and commission data.
itemsarrayGoods/services covered by the terms.
termsobjectAcceptance, inspection, release and special terms.
fundingobject│nullLatest funding summary.
fulfilmentobject│nullLatest fulfilment summary.
releaseobject│nullLatest release/payout summary.
metadataobjectYour non-sensitive key/value metadata.
created_attimestampCreation time.
updated_attimestampLast modification time.
livemodebooleanTrue in production, false in sandbox.

9.2 Item object

FieldTypeRequiredDescription
namestringYesItem/service name.
descriptionstringNoContractual description.
quantityintegerYesPositive quantity.
unit_pricedecimal stringNoPer-unit price where applicable.
skustringNoSeller or buyer SKU.
serial_numbersarrayNoSerial/asset identifiers.
conditionenumNonew, used, refurbished, service, other.
metadataobjectNoNon-sensitive internal mapping data.

9.3 Terms object

FieldTypeDescription
inspection_period_hoursintegerTime allowed for buyer review after delivery where applicable.
release_policyenumbuyer_confirmation, milestone, scheduled, administrative, or contract_specific.
auto_release_attimestamp│nullAutomatic release time when contractually permitted.
shipping_requiredbooleanWhether fulfilment requires shipping/tracking.
allowed_carriersarray│nullOptional permitted carrier codes/names.
delivery_deadlinetimestamp│nullContractual fulfilment deadline.
special_termsstring│nullPlain-language terms; avoid secrets or unnecessary personal data.
acceptance_versionintegerIncremented when material terms change.

9.4 Party object

FieldTypeDescription
idstringOpaque party/participation ID.
roleenumbuyer, seller, broker, agent.
emailstringEmail used for invitation/identity linkage.
display_namestring│nullBusiness or person display name.
organizationstring│nullOrganization name.
acceptance_statusenumpending, accepted, rejected, revoked, superseded.
accepted_attimestamp│nullAcceptance timestamp.
verification_statusenumunverified, pending, verified, restricted, failed.

10. API reference - authentication

POST  /oauth/token

Create access token

Exchange OAuth client credentials for a short-lived bearer access token.

PropertyRequirement
AuthenticationHTTP Basic or client credentials in request body, according to issued credential profile
IdempotencyNot required

Request body

FieldTypeRequiredDescription
grant_typestringYesclient_credentials.
client_idstringYes*Client identifier if not supplied by HTTP Basic.
client_secretstringYes*Client secret if not supplied by HTTP Basic.
scopestringNoSpace-delimited requested scopes.

Example request

curl -X POST https://api.rbcpay.com/v1/oauth/token \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=$RBCPAY_CLIENT_ID&client_secret=$RBCPAY_CLIENT_SECRET&scope=transactions:read%20transactions:write"

Example response

{"access_token":"rbp_at_...","token_type":"Bearer","expires_in":3600,"scope":"transactions:read transactions:write"}

Endpoint-specific errors

CodeHTTPMeaning
invalid_client401Client credentials are invalid or disabled.
invalid_scope400Requested scope is not permitted.
unsupported_grant_type400Grant type is not supported.

11. API reference - transactions

POST  /transactions

Create transaction

Create a transaction with parties, amount, items and contractual terms. The public guide demonstrates POST /transactions and identifies parties, amount, currency, items and broker commission as transaction inputs.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Request body

FieldTypeRequiredDescription
titlestringYesTransaction title.
descriptionstringNoTransaction description.
amountdecimal stringYesGross amount.
currencystringYesISO 4217 currency.
buyerobjectYesBuyer invitation/details.
sellerobjectYesSeller invitation/details.
itemsarrayYesOne or more transaction items.
commissiondecimal string/objectNoBroker commission where applicable.
termsobjectYesInspection, fulfilment and release conditions.
external_referencestringNoYour order/deal ID.
metadataobjectNoNon-sensitive integration metadata.

Example request

curl -X POST https://api.rbcpay.com/v1/transactions \
  -H "Authorization: Bearer $RBCPAY_TOKEN" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0c2c9d9d-672b-4ed2-97fa-4d856523ca61" \
  -d '{
    "title":"Server equipment purchase",
    "amount":"12500.00",
    "currency":"CAD",
    "external_reference":"PO-44718",
    "buyer":{"email":"buyer@example.com"},
    "seller":{"email":"seller@example.com"},
    "items":[{"name":"Server equipment","quantity":1}],
    "terms":{"inspection_period_hours":48,"release_policy":"buyer_confirmation"}
  }'

Example response

{
  "id":"txn_01J6C2A9T4...",
  "object":"transaction",
  "status":"pending_acceptance",
  "amount":"12500.00",
  "currency":"CAD",
  "external_reference":"PO-44718",
  "created_at":"2026-08-26T18:42:31Z",
  "livemode":false
}

Endpoint-specific errors

CodeHTTPMeaning
invalid_currency422Currency is not supported for the transaction.
invalid_amount422Amount fails format or transaction limits.
party_conflict409Participant configuration is not permitted.
duplicate_reference409External reference uniqueness rule was violated, if configured.
GET  /transactions/{transaction_id}

Retrieve transaction

Return the authoritative representation of a transaction.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopetransactions:read

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.
expandquerystringNoComma-separated related objects, e.g. events,parties,funding.

Example response

{ "id":"txn_01J6C2A9T4...", "object":"transaction", "status":"funded", "amount":"12500.00", "currency":"CAD", "buyer":{...}, "seller":{...}, "funding":{"status":"confirmed"}, "updated_at":"2026-08-27T10:15:00Z" }

Endpoint-specific errors

CodeHTTPMeaning
not_found404Transaction does not exist or is not visible to these credentials.
GET  /transactions

List transactions

List transactions visible to the authenticated integration using cursor pagination.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopetransactions:read

Parameters

NameInTypeRequiredDescription
limitqueryintegerNoPage size.
starting_afterquerystringNoCursor from previous response.
statusqueryenumNoFilter by status.
external_referencequerystringNoFilter by your reference.
created_fromquerytimestampNoCreated on/after.
created_toquerytimestampNoCreated before/on.

Example response

{ "object":"list", "data":[{"id":"txn_...","status":"funded"}], "has_more":false, "next_cursor":null }
PATCH  /transactions/{transaction_id}

Update transaction

Update mutable transaction fields. Material changes to accepted terms increment acceptance_version and can require parties to re-accept.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
titlestringNoUpdated title.
descriptionstringNoUpdated description.
itemsarrayNoUpdated items if state permits.
termsobjectNoUpdated terms if state permits.
metadataobjectNoMetadata merge/replace per implementation.

Endpoint-specific errors

CodeHTTPMeaning
invalid_state409Transaction cannot be edited in its current state.
reacceptance_required409The attempted workflow action requires new acceptance first.
POST  /transactions/{transaction_id}/submit

Submit for acceptance

Freeze the current material terms version and invite required parties to accept.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Example response

{ "id":"txn_...", "status":"pending_acceptance", "terms":{"acceptance_version":3} }

Endpoint-specific errors

CodeHTTPMeaning
incomplete_terms422Required parties/items/terms are missing.
invalid_state409Transaction is not submit-ready.
POST  /transactions/{transaction_id}/cancel

Cancel transaction

Request cancellation when the current state and contract permit it. Funded transactions may require refund/return logic rather than immediate cancellation.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
reasonstringYesStructured or approved cancellation reason.
notestringNoNon-sensitive operational note.

Example response

{ "id":"txn_...", "status":"cancelled", "cancelled_at":"2026-08-28T12:00:00Z" }

Endpoint-specific errors

CodeHTTPMeaning
invalid_state409Cancellation is not permitted in the current state.
funds_action_required409Funds must be refunded or resolved before cancellation can complete.

12. API reference - parties and acceptance

GET  /transactions/{transaction_id}/parties

List transaction parties

Return buyer, seller, broker and other authorized participants.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopeparties:read

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.
POST  /transactions/{transaction_id}/parties

Add party

Add an invited participant before the workflow state prevents party changes.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopeparties:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
roleenumYesbuyer, seller, broker or authorized role.
emailstringYesParticipant email.
display_namestringNoDisplay name.
organizationstringNoCompany/organization.
permissionsarrayNoRole-specific permissions where enabled.

Endpoint-specific errors

CodeHTTPMeaning
invalid_state409Parties are locked in the current state.
duplicate_party409Participant already exists in this role.
POST  /transactions/{transaction_id}/accept

Accept terms

Record acceptance of the current acceptance_version by the authenticated/authorized participant or delegated acceptance flow.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
acceptance_versionintegerYesExact version being accepted.
actor_referencestringNoIntegration-side actor/audit reference.
ip_contextobjectNoOnly where lawfully collected and permitted.

Example response

{ "transaction_id":"txn_...", "acceptance_version":3, "status":"accepted", "accepted_at":"2026-08-26T19:02:00Z" }

Endpoint-specific errors

CodeHTTPMeaning
version_mismatch409Terms changed; retrieve and accept current version.
not_authorized_party403Actor cannot accept for this role.
POST  /transactions/{transaction_id}/reject

Reject terms

Record rejection of the current transaction terms.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
acceptance_versionintegerYesVersion being rejected.
reasonstringNoReason for rejection.

13. API reference - funding

Funding endpoints create and track the buyer-side funding workflow. They do not mean funds are secured until the funding resource is confirmed and the transaction reaches the funded state.
POST  /transactions/{transaction_id}/funding-intents

Create funding intent

Create the funding instruction/intent for an accepted transaction.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopefunding:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
amountdecimal stringYesAmount to fund; normally transaction required amount.
currencystringYesCurrency matching the transaction.
methodenumNobank_transfer, wire, supported_method or auto.
return_urlurlNoReturn URL for supported interactive flows.
metadataobjectNoNon-sensitive reconciliation metadata.

Example response

{ "id":"fnd_01J...", "object":"funding_intent", "status":"pending", "amount":"12500.00", "currency":"CAD", "instructions":{"reference":"RBP-7Q29X"} }

Endpoint-specific errors

CodeHTTPMeaning
transaction_not_accepted409Required acceptance is incomplete.
currency_mismatch422Funding currency does not match transaction.
invalid_state409Transaction cannot be funded in current state.
GET  /transactions/{transaction_id}/funding

Retrieve funding status

Return funding objects and confirmed amount for a transaction.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopefunding:read

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Example response

{ "transaction_id":"txn_...", "required_amount":"12500.00", "confirmed_amount":"12500.00", "currency":"CAD", "status":"confirmed", "confirmed_at":"2026-08-27T10:15:00Z" }
GET  /funding-intents/{funding_intent_id}

Retrieve funding intent

Read one funding intent and its processing status.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopefunding:read

Parameters

NameInTypeRequiredDescription
funding_intent_idpathstringYesFunding intent ID.

14. API reference - fulfilment and delivery

POST  /transactions/{transaction_id}/fulfilments

Create fulfilment

Report shipment, service delivery or another fulfilment action after funds are confirmed and the transaction permits fulfilment.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
typeenumYesshipment, service, digital, pickup, other.
carrierstringNoCarrier code/name.
tracking_numberstringNoTracking number.
shipped_attimestampNoShipment time.
estimated_delivery_attimestampNoEstimated delivery.
itemsarrayNoSpecific items/quantities fulfilled.
evidence_file_idsarrayNoSupporting uploaded evidence.

Example response

{ "id":"ful_01J...", "status":"in_transit", "carrier":"DHL", "tracking_number":"1234567890" }

Endpoint-specific errors

CodeHTTPMeaning
not_funded409Transaction is not confirmed funded.
invalid_carrier422Carrier is not permitted under the terms.
invalid_state409Fulfilment cannot be created in current state.
PATCH  /fulfilments/{fulfilment_id}

Update fulfilment

Update tracking or delivery information.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
fulfilment_idpathstringYesFulfilment ID.

Request body

FieldTypeRequiredDescription
tracking_numberstringNoUpdated tracking.
statusenumNoin_transit, delivered, failed, returned, completed.
delivered_attimestampNoDelivery timestamp.
evidence_file_idsarrayNoAdditional evidence.
POST  /transactions/{transaction_id}/confirm-receipt

Buyer confirms receipt

Record buyer receipt/approval where required by the release policy.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
confirmationenumYesreceived_and_accepted or received_with_issue.
notestringNoOptional issue note.
evidence_file_idsarrayNoOptional evidence when an issue is reported.

Example response

{ "transaction_id":"txn_...", "receipt_status":"received_and_accepted", "confirmed_at":"2026-08-29T16:40:00Z" }

15. API reference - release and payout

POST  /transactions/{transaction_id}/release

Request fund release

Request release of eligible funds according to the accepted terms. The public guide describes buyer confirmation followed by release to the seller, with broker commission released in the same step when applicable.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopepayouts:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
amountdecimal stringNoOmit for full eligible release; required for authorized partial/milestone release.
reasonenumYesbuyer_confirmation, milestone_met, auto_release, administrative_resolution.
milestone_idstringNoRequired for milestone release where applicable.
metadataobjectNoNon-sensitive reconciliation fields.

Example response

{ "id":"rel_01J...", "object":"release", "status":"processing", "gross_amount":"12500.00", "seller_amount":"12250.00", "commission_amount":"250.00", "currency":"CAD" }

Endpoint-specific errors

CodeHTTPMeaning
release_conditions_not_met409Required approval, inspection or milestone condition is incomplete.
dispute_hold409Transaction is held by an open dispute.
already_released409Requested amount has already been released.
invalid_amount422Release amount exceeds eligible balance.
GET  /transactions/{transaction_id}/releases

List releases

List release operations and payout allocation for a transaction.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopepayouts:read

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.
GET  /releases/{release_id}

Retrieve release

Retrieve release processing and beneficiary allocation details.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopepayouts:read

Parameters

NameInTypeRequiredDescription
release_idpathstringYesRelease ID.

16. API reference - refunds and cancellations

POST  /transactions/{transaction_id}/refunds

Create refund

Create a full or partial refund when funds are available for return and policy/state permits it.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scoperefunds:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
amountdecimal stringYesRefund amount.
reasonenumYescancelled, returned, duplicate, adjustment, dispute_resolution, other.
notestringNoOperational note.
evidence_file_idsarrayNoSupporting evidence if required.

Example response

{ "id":"rfd_01J...", "status":"processing", "amount":"500.00", "currency":"CAD" }

Endpoint-specific errors

CodeHTTPMeaning
amount_exceeds_refundable422Refund exceeds remaining refundable balance.
invalid_state409Refund is not permitted in current state.
release_conflict409Funds are no longer available for ordinary refund; another resolution path is required.
GET  /transactions/{transaction_id}/refunds

List refunds

List refunds and current status.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopetransactions:read

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

17. API reference - disputes

POST  /transactions/{transaction_id}/disputes

Open dispute

Open a dispute and place the transaction into dispute handling where permitted.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopedisputes:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
reasonenumYesnot_received, not_as_described, damaged, incomplete, unauthorized_release, other.
summarystringYesConcise factual description.
amount_disputeddecimal stringNoAmount at issue.
evidence_file_idsarrayNoInitial evidence.
external_referencestringNoYour case/reference ID.

Example response

{ "id":"dsp_01J...", "status":"open", "transaction_id":"txn_...", "response_due_at":"2026-09-03T23:59:59Z" }

Endpoint-specific errors

CodeHTTPMeaning
dispute_window_closed409Contractual or policy dispute period has elapsed.
invalid_state409A dispute cannot be opened in the current state.
duplicate_dispute409An active dispute already covers this issue.
GET  /disputes/{dispute_id}

Retrieve dispute

Return case status, deadlines, requested evidence and resolution details.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopedisputes:read

Parameters

NameInTypeRequiredDescription
dispute_idpathstringYesDispute ID.
POST  /disputes/{dispute_id}/evidence

Submit dispute evidence

Associate uploaded evidence and a structured statement with an open dispute.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopedisputes:write

Parameters

NameInTypeRequiredDescription
dispute_idpathstringYesDispute ID.

Request body

FieldTypeRequiredDescription
file_idsarrayYesPreviously uploaded file IDs.
statementstringNoFactual explanation of the evidence.
evidence_typeenumYesinvoice, proof_of_delivery, inspection, correspondence, identity, contract, other.
GET  /transactions/{transaction_id}/disputes

List transaction disputes

List disputes associated with a transaction.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopedisputes:read

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

18. API reference - brokers and commissions

Broker commissions are contractual allocations associated with a transaction. The public guide states that a transaction may contain your commission and that RBC Pay can release the commission in the same release step as seller funds.
POST  /transactions/{transaction_id}/commissions

Create commission

Attach a broker/partner commission before acceptance locks material financial terms.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopetransactions:write

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

Request body

FieldTypeRequiredDescription
broker_party_idstringYesBroker participant ID.
typeenumYesfixed or percentage.
amountdecimal stringConditionalRequired for fixed.
percentagedecimal stringConditionalRequired for percentage.
cap_amountdecimal stringNoOptional maximum.
descriptionstringNoCommission description.

Endpoint-specific errors

CodeHTTPMeaning
terms_locked409Commission cannot change after terms lock without re-acceptance.
commission_exceeds_limit422Commission violates configured/contractual limit.
GET  /transactions/{transaction_id}/commissions

List commissions

Return commission allocations and payout status.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopetransactions:read

Parameters

NameInTypeRequiredDescription
transaction_idpathstringYesTransaction ID.

19. API reference - files and evidence

POST  /files

Upload file metadata / initiate upload

Create an upload object for transaction documents, invoices, proof of delivery, inspection records or dispute evidence. Large-file transport may use a pre-signed upload URL.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopefiles:write

Request body

FieldTypeRequiredDescription
purposeenumYestransaction_document, invoice, proof_of_delivery, inspection, dispute_evidence, other.
filenamestringYesOriginal file name.
content_typestringYesMIME type.
size_bytesintegerYesDeclared size.
sha256stringRecommendedHex-encoded SHA-256 digest.
transaction_idstringNoTransaction association.
dispute_idstringNoDispute association.

Example response

{ "id":"file_01J...", "status":"pending_upload", "upload_url":"https://...signed...", "expires_at":"2026-08-26T19:00:00Z" }

Endpoint-specific errors

CodeHTTPMeaning
unsupported_file_type422File type is not accepted.
file_too_large413File exceeds configured limit.
malware_detected422Uploaded content failed security scanning.
GET  /files/{file_id}

Retrieve file metadata

Return metadata and processing/security-scan status. Download URLs, when permitted, are short-lived.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopetransactions:read or disputes:read as applicable

Parameters

NameInTypeRequiredDescription
file_idpathstringYesFile ID.

20. API reference - webhooks

POST  /webhook-endpoints

Create webhook endpoint

Register an HTTPS URL to receive signed RBC Pay events.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopewebhooks:manage

Request body

FieldTypeRequiredDescription
urlurlYesPublic HTTPS endpoint.
enabled_eventsarrayYesSpecific event types or approved wildcard.
descriptionstringNoOperational description.

Example response

{ "id":"wh_01J...", "url":"https://merchant.example.com/webhooks/rbcpay", "status":"enabled", "secret":"whsec_..." }

Endpoint-specific errors

CodeHTTPMeaning
invalid_url422URL is invalid, non-HTTPS or otherwise prohibited.
event_not_supported422Requested event type is not supported.
GET  /webhook-endpoints

List webhook endpoints

List registered endpoints.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopewebhooks:manage
PATCH  /webhook-endpoints/{webhook_endpoint_id}

Update webhook endpoint

Change URL, event subscriptions or enabled state.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopewebhooks:manage

Parameters

NameInTypeRequiredDescription
webhook_endpoint_idpathstringYesWebhook endpoint ID.
POST  /webhook-endpoints/{webhook_endpoint_id}/rotate-secret

Rotate webhook secret

Issue a new webhook signing secret. Support an overlap period if the developer portal allows dual-secret verification.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopewebhooks:manage

Parameters

NameInTypeRequiredDescription
webhook_endpoint_idpathstringYesWebhook endpoint ID.
GET  /webhook-deliveries

List webhook deliveries

Inspect webhook delivery history for debugging and reconciliation.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopewebhooks:manage

Parameters

NameInTypeRequiredDescription
endpoint_idquerystringNoFilter by endpoint.
event_idquerystringNoFilter by event.
statusqueryenumNodelivered, failed, pending.
POST  /webhook-deliveries/{delivery_id}/replay

Replay webhook delivery

Request redelivery of a historical event to its configured endpoint.

PropertyRequirement
AuthenticationBearer token
IdempotencyRequired
Required scopewebhooks:manage

Parameters

NameInTypeRequiredDescription
delivery_idpathstringYesWebhook delivery ID.

21. API reference - events and audit trail

GET  /events

List events

Read immutable event records for reconciliation and audit. This is useful when webhook delivery was delayed or your receiver was unavailable.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopeevents:read

Parameters

NameInTypeRequiredDescription
typequerystringNoFilter by event type.
resource_idquerystringNoFilter by transaction or related resource.
created_fromquerytimestampNoLower time bound.
created_toquerytimestampNoUpper time bound.
starting_afterquerystringNoCursor.
limitqueryintegerNoPage size.

Example response

{ "object":"list", "data":[{"id":"evt_01J...","type":"transaction.funded","created_at":"2026-08-27T10:15:00Z","data":{"object":{"id":"txn_..."}}}], "has_more":false }
GET  /events/{event_id}

Retrieve event

Retrieve one immutable event envelope.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopeevents:read

Parameters

NameInTypeRequiredDescription
event_idpathstringYesEvent ID.

22. API reference - health and metadata

GET  /health

API health check

Return a lightweight service status for integration monitoring. Do not use this endpoint as proof of transaction or payment state.

PropertyRequirement
AuthenticationMay be public or authenticated according to deployment policy
IdempotencyNot applicable

Example response

{ "status":"ok", "api_version":"v1", "time":"2026-08-26T18:42:31Z" }
GET  /capabilities

Retrieve integration capabilities

Return enabled currencies, transaction features, file constraints or account-specific capabilities when exposed.

PropertyRequirement
AuthenticationBearer token
IdempotencyNot applicable
Required scopetransactions:read

Example response

{ "currencies":["CAD","USD"], "features":{"milestones":true,"broker_commissions":true,"disputes":true} }

23. Error model

A failed request returns an HTTP status plus a machine-readable JSON error. Integrations must branch on the stable error code, not on human-readable message text. The public guide illustrates this with a 422 invalid_currency error.
{
  "error": {
    "code": "invalid_currency",
    "message": "The currency is not supported for this transaction.",
    "field": "currency",
    "request_id": "req_01J...",
    "details": {}
  }
}
HTTPUseTypical causes
400Bad RequestMalformed JSON, unsupported parameter shape, invalid query syntax.
401UnauthorizedMissing/expired/invalid token.
403ForbiddenToken valid but scope, account or role lacks permission.
404Not FoundResource absent or not visible to credentials.
409ConflictState conflict, duplicate operation, stale terms version.
413Payload Too LargeUpload/request exceeds limit.
415Unsupported Media TypeIncorrect Content-Type.
422Unprocessable EntitySemantically invalid field or business rule.
429Too Many RequestsRate limit reached.
500Internal Server ErrorUnexpected server failure.
502Bad GatewayUpstream dependency failure.
503Service UnavailableTemporary service unavailability.
504Gateway TimeoutUpstream operation timed out.

23.1 Common application error codes

CodeMeaningClient action
invalid_requestMalformed or incomplete request.Correct request; do not retry unchanged.
invalid_currencyUnsupported currency.Use supported currency/capability.
invalid_amountAmount invalid or outside configured limits.Correct amount.
invalid_stateResource cannot perform action in current state.Retrieve latest state and follow permitted transition.
version_mismatchTerms version is stale.Retrieve current transaction and re-present terms.
idempotency_conflictSame key was reused with different request body.Use original body or a new key for a new operation.
not_authorizedActor/scope lacks permission.Correct scopes/role; do not brute-force retry.
rate_limitedRequest limit exceeded.Honor Retry-After and back off.
temporarily_unavailableTransient service/dependency issue.Retry with bounded exponential backoff.
dispute_holdFunds cannot release because dispute is open.Follow dispute workflow.

24. Rate limits

The public RBC Pay guide states that requests are rate-limited per credential set and that 429 Too Many Requests is returned when the limit is reached. Production limits can vary by account, endpoint class and risk profile.

Design to the response headers and 429 behavior rather than hard-coding a single global limit.

Use event-driven updates instead of aggressive polling.

Batch reconciliation with paginated list endpoints and time filters.

Apply exponential backoff and honor Retry-After.

Do not invent production limits Publish numeric rate-limit values only after they are configured and verified in the gateway. This reference intentionally defines behavior without claiming an unverified requests-per-second number.

25. Webhook security and replay protection

Webhooks keep your system synchronized with transaction events. A receiver must authenticate every webhook before changing local state.
RBCPay-Signature: t=1787769720,v1=hex_hmac_sha256_signature
RBCPay-Event-ID: evt_01J...

25.1 Signature verification algorithm

Read the raw request body bytes exactly as received. Do not parse and reserialize before verification.

Parse the timestamp t and v1 signatures from RBCPay-Signature.

Reject timestamps outside your configured tolerance, typically a few minutes, to reduce replay risk.

Compute HMAC-SHA256(secret, timestamp + “.” + raw_body).

Compare expected and supplied signatures using constant-time comparison.

Deduplicate using the immutable event ID. Store processed event IDs before or atomically with business-side effects.

Return a 2xx quickly after durable acceptance; perform long-running work asynchronously inside your own system.

25.2 Example webhook event

{
  "id": "evt_01J6D...",
  "object": "event",
  "type": "transaction.status_changed",
  "created_at": "2026-08-27T10:15:00Z",
  "data": {
    "object": {
      "id": "txn_00000000",
      "object": "transaction",
      "status": "funded"
    },
    "previous_attributes": {"status": "funding_pending"}
  }
}

26. Integration recipes

26.1 Standard buyer-seller transaction

Create the transaction with amount, currency, buyer, seller, items and terms.

Submit the transaction and wait until every required party accepts the current acceptance_version.

Create funding instructions and direct the buyer through the approved funding method.

Wait for transaction.funded / confirmed funding. Never infer funding from a submitted bank transfer.

Allow the seller to fulfil only after confirmed funding if that is the agreed workflow.

Submit carrier/tracking or other fulfilment evidence.

Wait for delivery and buyer confirmation, contractual inspection expiry or another release condition.

Request release with an idempotency key.

Reconcile release/payout events and commission allocations.

26.2 Brokered transaction

Create the broker as a transaction participant and add commission terms before final acceptance. The commission becomes part of the accepted financial terms. When the release occurs, reconcile seller and broker allocations separately even if they are triggered by one release operation.

26.3 Milestone transaction

Represent the total transaction amount and milestone schedule in the accepted terms. Each milestone must have an objective completion condition, eligible amount and approval rule. Release only the eligible milestone amount, preserving the remaining secured balance.

26.4 Buyer reports a problem

Record receipt with issue, open a dispute before any automatic or ordinary release occurs, upload evidence, and stop local fulfilment completion logic until the dispute status resolves. Your system must treat the RBC Pay dispute/release state as authoritative.

27. SDK patterns and code examples

27.1 cURL - retrieve transaction

curl https://api.rbcpay.com/v1/transactions/txn_01J6C2A9T4... \
  -H "Authorization: Bearer $RBCPAY_TOKEN" \
  -H "Accept: application/json"

27.2 Node.js - create transaction

const response = await fetch('https://api.rbcpay.com/v1/transactions', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${process.env.RBCPAY_TOKEN}`,
    'Content-Type': 'application/json',
    'Idempotency-Key': crypto.randomUUID()
  },
  body: JSON.stringify({
    title: 'Server equipment purchase',
    amount: '12500.00',
    currency: 'CAD',
    buyer: { email: 'buyer@example.com' },
    seller: { email: 'seller@example.com' },
    items: [{ name: 'Server equipment', quantity: 1 }],
    terms: { inspection_period_hours: 48, release_policy: 'buyer_confirmation' }
  })
});
if (!response.ok) throw new Error(await response.text());
const transaction = await response.json();

27.3 Python - safe request/retry skeleton

import os, time, uuid, requests
url = 'https://api.rbcpay.com/v1/transactions'
headers = {
    'Authorization': f"Bearer {os.environ['RBCPAY_TOKEN']}",
    'Content-Type': 'application/json',
    'Idempotency-Key': str(uuid.uuid4()),
}
payload = {
    'title': 'Server equipment purchase',
    'amount': '12500.00',
    'currency': 'CAD',
    'buyer': {'email': 'buyer@example.com'},
    'seller': {'email': 'seller@example.com'},
    'items': [{'name': 'Server equipment', 'quantity': 1}],
    'terms': {'inspection_period_hours': 48, 'release_policy': 'buyer_confirmation'},
}
for attempt in range(5):
    r = requests.post(url, json=payload, headers=headers, timeout=20)
    if r.status_code not in (429, 500, 502, 503, 504):
        r.raise_for_status(); break
    time.sleep(min(2 ** attempt, 16))
transaction = r.json()

27.4 Webhook verification pseudocode

raw = request.raw_body
sig = request.headers['RBCPay-Signature']
timestamp, supplied = parse_signature(sig)
assert abs(now_unix() - timestamp) <= tolerance_seconds
expected = hmac_sha256(webhook_secret, str(timestamp) + '.' + raw)
assert constant_time_equal(expected, supplied)
event = json_parse(raw)
assert not already_processed(event['id'])
process_idempotently(event)
return 200

28. Sandbox and test scenarios

Every integration should be built and tested against the sandbox before production credentials are enabled. Sandbox behavior should mimic production state transitions while avoiding real money movement.
ScenarioExpected test
Successful transactionCreate -> accept -> fund -> fulfil -> confirm -> release.
Duplicate POSTRetry same Idempotency-Key and verify only one resource/effect exists.
Idempotency conflictReuse a key with changed body and expect conflict.
Funding delayRemain funding_pending until confirmed event.
Webhook outageReturn failures, then replay deliveries and ensure event deduplication.
Out-of-order webhooksProcess using resource version/status and event timestamps; reconcile via GET.
Terms changeModify material terms and verify previous acceptance is superseded.
Dispute before releaseOpen dispute and verify ordinary release is blocked.
Partial refundRefund less than eligible balance and reconcile remaining amount.
429 throttlingVerify backoff and Retry-After behavior.
5xx transient errorRetry boundedly with same idempotency key.
Expired tokenRefresh token via OAuth flow and retry safely.
Invalid signatureReject webhook without state change.
Replay attackReject or dedupe reused event ID/timestamp.

29. Production readiness checklist

Production secrets are stored in a managed secret store and excluded from logs/source control.

Outbound production IPs are stable and allowlisted where required.

OAuth scopes follow least privilege.

Every creation/money-movement write uses persisted idempotency keys.

Webhook signatures are verified against the raw body with timestamp tolerance.

Webhook event IDs are deduplicated transactionally.

Your system reconciles webhook events against GET endpoints before irreversible actions when necessary.

Timeouts, 429s and 5xx failures use bounded exponential backoff.

All money calculations use decimal or integer minor-unit arithmetic.

Production and sandbox credentials/data are fully separated.

Operational dashboards track error rate, latency, webhook failures, stale funded transactions and unreconciled payouts.

Support tooling records RBC Pay request IDs and your correlation IDs.

Dispute and refund workflows are tested end-to-end.

Sensitive data retention and access controls have been reviewed.

Runbooks exist for credential compromise, webhook outage, stuck release, funding mismatch and duplicate local processing.

30. Data protection and operational security

30.1 Data classification

ClassExamplesHandling
SecretClient secret, bearer token, webhook signing secret.Never log; encrypt at rest; strict access; rotate.
RestrictedIdentity evidence, financial documents, dispute evidence.Encrypt; purpose-limited access; retention controls; audit access.
ConfidentialTransaction terms, commercial pricing, party contact data.Authenticated access; minimize exposure and exports.
OperationalResource IDs, timestamps, non-sensitive statuses.May be logged with retention and access controls.

30.2 Security incident response

Revoke or rotate exposed credentials immediately.

Preserve request IDs, event IDs and audit logs needed to determine scope.

Do not delete or alter transaction records as a substitute for containment.

Coordinate with RBC Pay support using request IDs and affected resource IDs, not secrets.

31. Versioning and deprecation

The base URL is versioned using /v1. Backward-incompatible changes belong in a new major API version or a formally announced compatibility mechanism. Additive optional response fields can appear without breaking version.

Clients must ignore unknown JSON response fields unless a signed schema contract says otherwise.

Do not rely on JSON object field order.

New enum values can be introduced; use a safe fallback path for unknown non-terminal values.

Deprecations should include announcement date, replacement, migration guide and sunset date.

32. Glossary

TermDefinition
Acceptance versionVersion number identifying the exact material terms a party accepted.
BuyerParty providing funds and receiving goods/services/rights under the transaction.
SellerParty fulfilling the transaction and receiving eligible released funds.
BrokerAuthorized intermediary whose commission is defined in transaction terms.
Funding intentObject describing the process/instructions to fund a transaction.
FundedAuthoritative state meaning required funds are confirmed under the platform workflow.
FulfilmentShipment, delivery, service completion or another contract performance action.
Inspection periodContractual time window for buyer review after delivery, where applicable.
ReleaseAuthorized movement/allocation of eligible secured funds to seller/beneficiaries.
RefundReturn of eligible transaction funds.
DisputeFormal case that can alter or hold the ordinary release path.
WebhookSigned HTTP event delivery from RBC Pay to the integration.
Idempotency keyClient-provided key that prevents duplicate side effects when retrying the same write.

Appendix A. Status codes

ResourceStatusDescription
TransactiondraftTerms are editable.
Transactionpending_acceptanceRequired party acceptance incomplete.
TransactionacceptedRequired current terms accepted.
Transactionfunding_pendingFunding is in progress.
TransactionfundedRequired funding confirmed.
Transactionin_fulfilmentSeller fulfilment underway.
TransactiondeliveredDelivery/fulfilment reported complete.
Transactionrelease_pendingRelease is processing.
TransactionreleasedEligible funds released.
TransactiondisputedDispute handling active.
Transactionpartially_refundedSome funds refunded.
TransactionrefundedRefund completed for eligible total.
TransactioncancelledTransaction cancelled.
TransactionclosedWorkflow closed.
FundingpendingFunding instructions issued / awaiting completion.
FundingprocessingPayment rail processing.
FundingconfirmedFunds confirmed.
FundingfailedFunding failed.
ReleasependingRelease requested.
ReleaseprocessingRelease/payout processing.
ReleasecompletedRelease completed.
ReleasefailedRelease failed and requires recovery/review.
DisputeopenCase opened.
Disputeevidence_requiredOne or more parties must submit evidence.
Disputeunder_reviewCase being reviewed.
Disputeresolved_buyerResolution favors buyer according to case decision.
Disputeresolved_sellerResolution favors seller according to case decision.
Disputeresolved_splitFunds allocated by split resolution.
DisputeclosedCase closed.

Appendix B. Event catalogue

Event typeWhen emitted
transaction.createdA transaction is created.
transaction.updatedMutable transaction data changes.
transaction.submittedTransaction submitted for acceptance.
transaction.acceptedRequired terms acceptance becomes complete.
transaction.rejectedA required party rejects terms.
transaction.status_changedTransaction status changes.
funding.createdFunding intent/instruction created.
funding.processingFunding begins processing.
transaction.fundedRequired funds become confirmed.
funding.failedFunding attempt fails.
fulfilment.createdSeller/authorized actor reports fulfilment.
fulfilment.updatedTracking or fulfilment status changes.
transaction.deliveredDelivery/fulfilment completion recorded.
transaction.receipt_confirmedBuyer confirms receipt/acceptance.
release.createdRelease request created.
release.completedRelease/payout allocation completes.
release.failedRelease processing fails.
refund.createdRefund created.
refund.completedRefund completes.
refund.failedRefund fails.
dispute.createdDispute opened.
dispute.updatedDispute stage/evidence status changes.
dispute.resolvedDispute decision recorded.
transaction.cancelledTransaction cancelled.
webhook.delivery_failedWebhook delivery exhausted immediate attempts / requires inspection, if exposed.

Appendix C. Example end-to-end transaction

C.1 Create

POST /transactions  ->  201 Created
status: pending_acceptance

C.2 Accept

POST /transactions/txn_.../accept  (buyer)
POST /transactions/txn_.../accept  (seller)
-> status: accepted

C.3 Fund

POST /transactions/txn_.../funding-intents
-> funding status: pending
... verified event arrives ...
transaction.funded
-> transaction status: funded

C.4 Fulfil

POST /transactions/txn_.../fulfilments
carrier: DHL
tracking_number: 1234567890
-> status: in_fulfilment
... delivery event ...
-> status: delivered

C.5 Confirm and release

POST /transactions/txn_.../confirm-receipt
confirmation: received_and_accepted
POST /transactions/txn_.../release
reason: buyer_confirmation
-> release processing
... release.completed ...
-> transaction status: released

C.6 Reconcile

Persist the RBC Pay transaction ID, release ID, seller allocation, commission allocation, event IDs and request IDs alongside your internal order or deal record. Reconciliation must be able to prove that one local order maps to one intended transaction workflow and that retries did not create duplicate financial effects.

Appendix D. Source and implementation notes

Public source consulted: RBC Pay, “API Guide,” https://www.rbcpay.com/api-guide/, accessed August 26, 2026. The public page establishes the API’s stated REST/HTTPS/JSON model, OAuth 2.0 bearer authentication, server-side credential handling, base URL https://api.rbcpay.com/v1, transaction creation example, webhook concept/example, JSON error pattern, per-credential rate limiting, sandbox testing, and a six-step transaction lifecycle.

This document deliberately goes further than the current public page. Endpoint paths, object fields, scopes, webhook signature format, dispute resources, file resources, funding objects, release objects and detailed status catalogues that are not explicitly published on the current public page are presented as the RBC Pay v1 reference specification. Before publishing this manual as production documentation, the API gateway, backend services, developer portal, webhook signer and support runbooks should be validated against the contract in this document.

Publication gate A developer reference is a promise. Do not publish an endpoint, rate limit, scope, event type or security header until the deployed system behaves exactly as documented, or revise this document to match production.

Developer quick reference

NeedEndpoint / action
AuthenticatePOST /oauth/token
Create transactionPOST /transactions
Read transactionGET /transactions/{id}
Submit for acceptancePOST /transactions/{id}/submit
Accept termsPOST /transactions/{id}/accept
Create fundingPOST /transactions/{id}/funding-intents
Check fundingGET /transactions/{id}/funding
Report fulfilmentPOST /transactions/{id}/fulfilments
Confirm receiptPOST /transactions/{id}/confirm-receipt
Release fundsPOST /transactions/{id}/release
RefundPOST /transactions/{id}/refunds
Open disputePOST /transactions/{id}/disputes
Upload evidencePOST /files
Register webhookPOST /webhook-endpoints
Reconcile eventsGET /events

End of RBC Pay API Guide & Full API Reference v1.0

RBC Pay API v1 |

Ready to build with Rbcpay?

Get your sandbox credentials and run your first test transaction end to end before you switch to live.