post/merchant/sellers/verify
Merchant-facing: register or match a seller after the MERCHANT has verified them. See docs/business/glossary.md "Identity federation" — sellers never call this directly.
Request body
| Field | Type | Required |
|---|
| name | string | yes |
| verifiedEmail | string (email) | yes |
| verifiedPhone | string | yes |
| merchantSellerRef | string | yes |
| merchantId | string (uuid) | yes |
Response (200)
| Field | Type | Required |
|---|
| sellerId | string (uuid) | — |
| requiresConfirmation | boolean | — |
post/merchant/sellers/headless
Merchant-facing: create a headless Seller (Phase 27) — a trade participant with no linked TBBN account, gated by the calling Merchant's plan tier.
Request body
| Field | Type | Required |
|---|
| merchantId | string (uuid) | yes |
| merchantSellerRef | string | yes |
| name | stringnull | — |
Response (200)
| Field | Type | Required |
|---|
| id | string (uuid) | — |
| userId | string,null (uuid) | — |
| primaryEmail | stringnull | — |
| primaryPhone | stringnull | — |
| reputationScore | integernull | — |
post/v1/oauth-clients
Register a Merchant's account-linking OAuth client (Phase 28)
Request body
| Field | Type | Required |
|---|
| merchantId | string (uuid) | yes |
| redirectUris | string[] | yes |
Response (200)
| Field | Type | Required |
|---|
| id | string (uuid) | — |
| merchantId | string (uuid) | — |
| clientId | string | — |
| clientSecret | string | — |
| redirectUris | string[] | — |
| status | ACTIVE | REVOKED | — |
| createdAt | string (date-time) | — |
post/v1/oauth-clients/{id}/rotate-secret
Rotate an OAuth client's secret — the clientId is unchanged
Response (200)
| Field | Type | Required |
|---|
| id | string (uuid) | — |
| merchantId | string (uuid) | — |
| clientId | string | — |
| clientSecret | string | — |
| redirectUris | string[] | — |
| status | ACTIVE | REVOKED | — |
| createdAt | string (date-time) | — |
post/v1/link/oauth/consent
Step 1 of the OAuth account-linking handshake (Phase 28) — the logged-in member approves. Creates a short-lived, single-use authorization code; the caller (the consent page) performs the actual redirect.
Request body
| Field | Type | Required |
|---|
| clientId | string | yes |
| redirectUri | string (uri) | yes |
| scope | string | yes |
| codeChallenge | string | — |
| codeChallengeMethod | S256 | — |
| merchantSellerRef | string | yes |
Response (200)
| Field | Type | Required |
|---|
| code | string | — |
post/v1/link/oauth/token
Step 2 of the OAuth account-linking handshake — the Merchant's backend exchanges the code for a link. No access/refresh token is issued; this only ever establishes a seller_merchant_links row. See docs/business/conflict-resolution-log.md item 22.
Request body
| Field | Type | Required |
|---|
| grant_type | authorization_code | yes |
| code | string | yes |
| client_id | string | yes |
| client_secret | string | yes |
| redirect_uri | string (uri) | yes |
| code_verifier | string | — |
Response (200)
| Field | Type | Required |
|---|
| sellerId | string (uuid) | — |
| linked | boolean | — |
post/v1/sellers/{id}/unlink
Ops-only unlink of a merchant link (fraud/dispute remediation)
Request body
| Field | Type | Required |
|---|
| merchantId | string (uuid) | yes |