carousell/rctp

Partner integration profile (template)

IMPORTANT: this is a blank template. Completed profiles for named partners are stored privately, NEVER in this repository. Copy this page into your organisation's private workspace before you fill it in. Do not open a pull request or an issue that contains a completed profile, a real partner name, a real endpoint or a key.

Status: Draft 0.4, pre-release. For release v0.2.0-draft.4 (Starter profile).

A partner fills in one profile per operator before integrating with a marketplace's gateway. It tells the marketplace what your agents will do, which parts of RCTP you use, and how to reach you when something goes wrong. Most fields map to the dev.rctp.operator entry of your UCP profile [4.1(2)].

Placeholders use .example domains. Replace every <…>.

1. Organisation

Field Value
Legal entity (legal_entity) <registered company name>
Jurisdiction (jurisdiction, ISO 3166-1 alpha-2) <SG>
UCP profile URL (UCP-Agent) https://agents.<partner>.example/.well-known/ucp
Agents (agent_id) agt:<partner>:<n>, archetype ☐ seller-agent ☐ buyer-agent
Marketplace(s) and market(s) <marketplace>, <country codes>

2. Contacts

Use role addresses only, never a person's name.

Role Address
Integration integration@<partner>.example
Incidents (incident_contact) mailto:incidents@<partner>.example or https://<partner>.example/incident
Security reports security@<partner>.example
Commercial partnerships@<partner>.example

3. What you implement

Level or profile Applies
Core: Agent Grant, Listing Terms (goods.small/1), offers with Deal Terms, decisions [17.1] ☐ As seller agent ☐ As buyer agent
Approval at level hosted_embedded [9.1] ☐
Proof: funds_held, accepted, rejected, released, UCP return and refund [17.4] ☐ As buyer agent (accepted, rejected) ☐ As holder of funds ☐ As seller agent (return)
Not available in v0.2: marketplace_app and certified_operator levels; AP2 buyer authority; Trust, Identity, Item and Custody levels —

4. Verbs requested (seller agents)

The seller confirms every tier on the marketplace's consent page; this table is what your agent will ask for, as tiers in the dev.rctp.agent_grant authorization details. The seller always sets the floor and other terms on the hosted page, never the agent.

Verb Scope Requested tier (auto, ask) Allowed tiers Why your agent needs it
listing.create dev.rctp.listing:create ask (only tier) ask <…>
listing.set_terms dev.rctp.listing:set_terms ask (only tier) ask <…>
listing.reprice dev.rctp.listing:reprice <auto> auto, ask <…>
listing.answer_buyer dev.rctp.listing:answer_buyer <auto> auto, ask <…>
offer.counter dev.rctp.deal:offer_counter <auto> auto, ask <…>
offer.accept dev.rctp.deal:offer_accept <ask> ask, auto <…>
deal.commit_to_ship dev.rctp.deal:commit_to_ship <ask> ask, auto <…>
deal.sign_contract, account.update none — — Always forbid (INV-3)

Read the scopes and allowed tiers from the gateway's /.well-known/ucp; the table shows the registry defaults. Any verb not granted is refused action_forbidden.

Approval setting Value
Approval level hosted_embedded
Where your app opens hosted_url ☐ In-app browser tab ☐ System browser ☐ Other: <…>
Grant refresh ☐ Every rotated refresh token persisted (reuse revokes the grant)

5. Extensions used

List every x- extension and every reverse-domain value you send. Each x- extension needs a tracking issue and an end date of at most two drafts or six months (Extensions).

Name Kind Tracking issue End date Invariants touched
x-<partner>.<name> or <partner>.example:<name> ☐ Verb ☐ Reason ☐ Field ☐ Deal event ☐ Method type #<number> <YYYY-MM-DD> <INV-…>

☐ None.

6. Versions

Item Value
Capability version(s) (RCTP-Version) 2026-11-draft5
SDK and version ☐ @rctp/sdk 0.2.0-draft.4 ☐ rctp (Python) 0.2.0a4 ☐ Own implementation: <…>
Conformance Vectors run <V1–V15, V26–V29, S1–S4>, result <pass count>, date <YYYY-MM-DD>, report kept at <private location>

7. Endpoints

Item Value
UCP profile URL https://agents.<partner>.example/.well-known/ucp
OAuth redirect URI (seller agents) https://agents.<partner>.example/rctp/callback
Webhook URL (dev.rctp.deal config.webhook_url) https://agents.<partner>.example/hooks/rctp
Webhook types consumed ☐ approval.decided ☐ offer.updated ☐ deal.event
Webhook verification ☐ Every webhook verified (UCP signed webhook against the gateway profile, Content-Digest, Webhook-Timestamp ≤ 300 s), duplicates dropped by Webhook-Id
Egress IP ranges (if the marketplace asks) <…>

8. Keys and data

Item Value
Key algorithm ES256 (P-256); kid = RFC 7638 thumbprint (B-1)
Key custody (key_custody) <HSM / cloud KMS / other, and region>
Private keys exportable? ☐ No ☐ Yes, because <…>
Key rotation and removal time <…>. A rotated seller-agent key needs a new seller consent (grants are bound to jkt).
Clock discipline ☐ Clocks within 60 s of UTC (B-2)
Data residency (data_residency) <country codes>
Data retention <…>

9. Incident response

Item Value
Incident SLA (incident_sla_hours) <24> hours
How fast you can pull a compromised key from your profile <…>
How you revoke your agents' tokens (RFC 7009) <…>
How you stop an agent that misbehaves <…>

10. Commitments

Draft 0.4 and the invariants. Tick each one.

  • ☐ We will not export buyer data, contact buyers outside the marketplace, or use RCTP data for advertising [4.1(4)].
  • ☐ We will put no personal data in any RCTP object, log line or webhook we produce (INV-9).
  • ☐ We will never store a seller's private terms, and send them only as the proposed_terms the seller told us to propose (INV-1, INV-5).
  • ☐ We will never act on an ask without the seller's own approval, and treat no answer as no (INV-2, INV-4).
  • ☐ We will act on every forbid reason as Decisions and errors describes, and not probe floors.
  • ☐ We will report vulnerabilities privately (Security).
Sign-off Value
Role of the approver (not a name) <Head of Engineering>
Date <YYYY-MM-DD>
Profile version <1>

Source: docs/partner-integration-profile.md