TuCOPRamp

Services

The two kinds of service, what each one opens, and how to see which ones your key has.

Every service belongs to one of two categories. The category says who moves the money, how a payment is matched and which routes the service opens.

On/Off Ramp (third party)P2P (self-served)
Who runs itA regulated payments provider, automaticallyTuCOP, with its own bank account and multisig
AssetUSDC on CeloCOPm on Celo
The userA party with identity verification by the payments provider (party session)An identity document registered with TuCOP. Off-ramp: wallet signature. On-ramp: the integrator opens the order
How a payment is matchedAutomatically, to a key or address of the party's ownAn operator confirms it
Follow-upWebhooks and GET /eventsA p2p_order.updated webhook to TuCOP's own apps, or polling the order
Servicespay, withdraw, depositp2p_onramp, p2p_offramp
Who can have itIntegrators: pay and deposit are requested in the console, withdraw is turned on by TuCOPTuCOP's own apps only, for now

A service of one category never opens the routes of the other. In particular deposit (On/Off Ramp) does not open P2P on-ramp orders: those need p2p_onramp.

What each service opens

ServiceCategoryRoutes
payOn/Off RampDestinations for third-party keys, /quotes, Payments, /limits
withdrawOn/Off RampDestinations for the party's own key, Withdrawals, withdraw quotes
depositOn/Off RampPOST /deposits (Deposits)
p2p_onrampP2P/p2p/onramp/* (TuCOP's own apps only)
p2p_offrampP2P/p2p/offramp/* (TuCOP's own apps only)
any On/Off Ramp serviceOn/Off Ramp/sessions/* and /parties/* (Parties and sessions)
either P2P serviceP2P/p2p/orders/* and /p2p/users/* (TuCOP's own apps only)

GET /rates answers with any of pay, withdraw or deposit; an estimate with an amount needs pay.

These work with any key, because they move no money: GET /consumer, GET /events, GET /document-types and your webhook endpoints.

Which services your key has

GET /consumer lists them in products, and the same list grouped by category in services:

json
{
  "consumer": {
    "id": "con_01j9z3k8q2m4n6p8r0s2t4v6w8",
    "name": "acme-wallet",
    "products": ["pay", "deposit"],
    "services": {
      "on_off_ramp": ["pay", "deposit"],
      "p2p": []
    },
    "scopes": ["wallet.read", "wallet.write"]
  },
  "api_key": null
}

A route your key's services do not open answers 403 product_not_enabled. required lists the services that would open it (any one is enough) and category says which kind they are:

json
{
  "type": "https://errors.tucopramp.xyz/product-not-enabled",
  "title": "Product not enabled",
  "status": 403,
  "code": "product_not_enabled",
  "detail": "The p2p_onramp product is not enabled for this consumer.",
  "request_id": "3b0f6c2e-1d4a-4f7e-9c8b-2a1e0d9f8c7b",
  "category": "p2p",
  "required": ["p2p_onramp"]
}

Do not retry it and do not work around it: ask TuCOP for the service, or use the routes of the service you have.

Changes

  • 2026-10-25. The P2P pages (orders, wallet signatures) and the p2p_order.updated webhook left these docs: P2P is available only to TuCOP's own apps for now, and will come back here when integrators can request it. Nothing changed for the On/Off Ramp services.
  • 2026-10-24. /wallet/onramp-orders is gone (ADR-011). P2P on-ramp is POST /p2p/onramp/orders with the integrator key, no wallet signature.
  • 2026-10-23. /p2p/orders/* and /p2p/users/* need a P2P service. /sessions/* and /parties/* need an On/Off Ramp service. 403 product_not_enabled carries category and required, and GET /consumer carries services.