OTC provider

Restricted partner surface. Every route requires an API key with OTC_PROVIDER; several also require a user session or an explicit provider-team/profile context. These contracts are only for approved liquidity partners and must not be exposed to general integrators.

Auth labels match the endpoint index. Envelopes follow Responses and errors.

For Header context + OTC_PROVIDER routes, the provider-team context may come from a valid session, both x-profile-id + x-team-id, or an API key scoped to both.

Endpoints#

MethodPathAuth
GET/v1/kyc/otc/{otcRequestId}Session + OTC_PROVIDER
GET/v1/kyc/{profileId}Session + OTC_PROVIDER
GET/v1/kyc/{profileId}/pdfSession + OTC_PROVIDER
GET/v1/otc/offersOTC_PROVIDER
POST/v1/otc/offersSession + OTC_PROVIDER
DELETE/v1/otc/offers/{offerId}OTC_PROVIDER
GET/v1/otc/requestsOTC_PROVIDER
GET/v1/otc/requests/{status}OTC_PROVIDER
POST/v1/otc/signatures/create-escrow/providerSession + OTC_PROVIDER
POST/v1/otc/{id}/files/providerHeader context + OTC_PROVIDER
POST/v1/otc/{id}/files/provider/upload-urlHeader context + OTC_PROVIDER

Details#

GET /v1/kyc/otc/{otcRequestId}#

OTC KYC/KYB PDF Generation API Endpoint

AuthSession + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key and Authorization: Bearer <session>.

Headers#

HeaderRequired
x-api-keyYes
AuthorizationYes — Bearer <session>

Path parameters#

ParamDescription
otcRequestIdPath parameter.

Query parameters#

FieldTypeRequired
typeenum: kyc, kybNo

Body#

Not applicable.

Success response#

Standard envelope: { "success": true, "data": <resource> }. See the linked guide for workflow-specific fields.

Errors and statuses#

HTTP statuses used by this route: 400, 500, 404, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

GET /v1/kyc/{profileId}#

Retrieving the KYC provider session verification data for approved verification sessions.

AuthSession + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key and Authorization: Bearer <session>.

Headers#

HeaderRequired
x-api-keyYes
AuthorizationYes — Bearer <session>

Path parameters#

ParamDescription
profileIdPath parameter.

Query parameters#

None.

Body#

Not applicable.

Success response#

{
	"success": true,
	"data": {
		"session_id": "session-example",
		"decision": {
			"status": "approved"
		}
	}
}

Errors and statuses#

HTTP statuses used by this route: 400, 500, 404, 200.

CodeMeaning
KYC_ROUTE_01Invalid API key
KYC_ROUTE_02Invalid session
KYC_ROUTE_03Profile not found
KYC_ROUTE_04No approved verification found
KYC_ROUTE_05The KYC provider API key not configured
KYC_ROUTE_06Failed to retrieve session from the KYC provider
KYC_ROUTE_07Failed to process the KYC provider response

GET /v1/kyc/{profileId}/pdf#

Generating PDF reports from the KYC provider for approved verification sessions. Restricted to OTC_PROVIDER API keys.

AuthSession + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key and Authorization: Bearer <session>.

Headers#

HeaderRequired
x-api-keyYes
AuthorizationYes — Bearer <session>

Path parameters#

ParamDescription
profileIdPath parameter.

Query parameters#

FieldTypeRequired
typeenum: kyc, kybNo

Body#

Not applicable.

Success response#

Standard envelope: { "success": true, "data": <resource> }. See the linked guide for workflow-specific fields.

Errors and statuses#

HTTP statuses used by this route: 400, 500, 404, 200.

CodeMeaning
VUDY#KYC12Invalid API key or missing OTC_PROVIDER permission
VUDY#KYC13Invalid session
VUDY#KYC14Profile not found
VUDY#KYC15No approved verification found
VUDY#KYC16Failed to generate PDF from the KYC provider

GET /v1/otc/offers#

Lists OTC offers for the authenticated OTC provider.

AuthAPI key + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key. No session required.

Headers#

HeaderRequired
x-api-keyYes
X-Provider-Team-IdYes

Path parameters#

None.

Query parameters#

FieldTypeRequired
otcRequestIdUUIDYes

Body#

Not applicable.

Success response#

{
	"success": true,
	"data": [
		{
			"id": "offer-789",
			"otcRequestId": "otc-123",
			"status": "new",
			"amount": 1000.5,
			"expirationTime": "2026-12-31T23:59:59Z",
			"timeToComplete": 3600,
			"bankId": "bank-456",
			"providerTeamId": "team-uuid"
		}
	]
}

Errors and statuses#

HTTP statuses used by this route: 400, 500, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

POST /v1/otc/offers#

Creates an OTC offer as an OTC provider.

AuthSession + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key and Authorization: Bearer <session>.

Headers#

HeaderRequired
x-api-keyYes
AuthorizationYes — Bearer <session>

Path parameters#

None.

Query parameters#

None.

Body#

FieldTypeRequired
providerTeamIdstringYes
otcRequestIdstringYes
amountnumberYes
expirationTimestringYes
timeToCompleteinteger seconds (1–86400)Yes
bankIdstringYes
providerWalletAddressstringYes
approvalSignaturestringNo

Success response#

{
	"success": true,
	"data": {
		"id": "offer-789",
		"otcRequestId": "otc-123",
		"status": "new",
		"amount": 1000.5,
		"expirationTime": "2024-12-31T23:59:59Z",
		"timeToComplete": 3600,
		"bankId": "bank-456",
		"approvalSignature": "0x123abc...",
		"providerTeamId": "team-uuid",
		"createdAt": "2024-01-01T00:00:00Z"
	}
}

Errors and statuses#

HTTP statuses used by this route: 400, 201, 500, 404.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

DELETE /v1/otc/offers/{offerId}#

Withdraws (deletes) an OTC offer owned by the provider.

AuthAPI key + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key. No session required.

Headers#

HeaderRequired
x-api-keyYes
X-Provider-Team-IdYes

Path parameters#

ParamDescription
offerIdPath parameter.

Query parameters#

None.

Body#

Not applicable.

Success response#

{
	"success": true,
	"data": {
		"id": "offer-789",
		"otcRequestId": "otc-123",
		"status": "rejected",
		"amount": 1000.5,
		"expirationTime": "2024-12-31T23:59:59Z",
		"timeToComplete": 3600,
		"bankId": "bank-456",
		"approvalSignature": "0x123abc...",
		"providerTeamId": "team-uuid",
		"updatedAt": "2024-01-01T12:00:00Z"
	}
}

Errors and statuses#

HTTP statuses used by this route: 400, 403, 500, 404, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

GET /v1/otc/requests#

Managing Vudy OTC requests including listing requests filtered by status and team countries.

AuthAPI key + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key. No session required.

Headers#

HeaderRequired
x-api-keyYes

Path parameters#

None.

Query parameters#

FieldTypeRequired
countrycomma-separated ISO 3166-1 alpha-2 codesYes
limitstringNo
offsetstringNo
teamIdstringNo

Body#

Not applicable.

Success response#

Envelope wraps an array of provider-facing OTC request rows. Nested objects follow stored resource shapes; reliably known top-level keys per item:

{
	"success": true,
	"data": [
		{
			"otcRequest": {},
			"profileBank": {},
			"team": {},
			"taxInfoSelected": null,
			"buyToken": null,
			"sellToken": null
		}
	]
}

When filtering with teamId, items may also include an offer array for that provider team.

Errors and statuses#

HTTP statuses used by this route: 400, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

GET /v1/otc/requests/{status}#

This module provides API endpoint for retrieving OTC requests filtered by status for a specific provider team.

AuthAPI key + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key. No session required.

Headers#

HeaderRequired
x-api-keyYes
X-Provider-Team-IdYes

Path parameters#

ParamDescription
statusOne of processing, proofRequired, proofing, proofSubmitted, verifying, conflict, completed, cancelled. Use /v1/otc/requests for new and offerReceived.

Query parameters#

FieldTypeRequired
limitstringNo
offsetstringNo

Body#

Not applicable.

Success response#

{
	"success": true,
	"data": [
		{
			"id": "otc-123",
			"status": "processing",
			"type": "buy",
			"buyAmount": 1000.5,
			"sellAmount": 950.0,
			"createdAt": "2024-01-01T00:00:00Z"
		}
	]
}

Errors and statuses#

HTTP statuses used by this route: 400, 500, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

POST /v1/otc/signatures/create-escrow/provider#

Provider Create Escrow Signature Endpoint

AuthSession + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key and Authorization: Bearer <session>.

Headers#

HeaderRequired
x-api-keyYes
AuthorizationYes — Bearer <session>

Path parameters#

None.

Query parameters#

None.

Body#

FieldTypeRequired
otcRequestIdstringYes
providerWalletAddressstringYes
offerAmountnumberNo

Success response#

When the session can sign:

{
	"success": true,
	"data": {
		"signature": "0x...",
		"signed": true
	}
}

Otherwise EIP-712 data for the client wallet:

{
	"success": true,
	"data": {
		"payload": {},
		"signed": false
	}
}

Errors and statuses#

HTTP statuses used by this route: 400, 403, 500, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

POST /v1/otc/{id}/files/provider#

Confirms files previously uploaded with the matching uploadId and attaches their metadata to the OTC transaction.

AuthHeader context + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key plus a provider-team context from a valid session, valid x-profile-id + x-team-id, or an API key scoped to both.

Headers#

HeaderRequired
x-api-keyYes
AuthorizationOptional (preferred)
x-profile-idRequired when no session
x-team-idRequired when no session

Path parameters#

ParamDescription
idPath parameter.

Query parameters#

None.

Body#

FieldTypeRequired
uploadIdstringYes
filePathsarrayYes
fileNamesarrayYes

Success response#

Returns { "success": true, "data": { "tx": <updated transaction> } }. File paths must exactly match the one-hour upload state, each file must exist, and each file is limited to 5 MiB.

Errors and statuses#

HTTP statuses used by this route: 400, 403, 500, 404, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).

POST /v1/otc/{id}/files/provider/upload-url#

Provides signed upload URLs for OTC provider transaction files.

AuthHeader context + OTC_PROVIDER
PermissionsOTC_PROVIDER
GuideOTC provider · OTC requester guide

Requires x-api-key plus a provider-team context from a valid session, valid x-profile-id + x-team-id, or an API key scoped to both.

Headers#

HeaderRequired
x-api-keyYes
AuthorizationOptional (preferred)
x-profile-idRequired when no session
x-team-idRequired when no session

Path parameters#

ParamDescription
idPath parameter.

Query parameters#

None.

Body#

FieldTypeRequired
fileNamesarrayYes

Success response#

Returns { "success": true, "data": { "uploadId": "...", "uploadUrls": [...] } }. Keep the uploadId and returned file paths for the confirmation call; upload state expires after one hour.

Errors and statuses#

HTTP statuses used by this route: 400, 403, 500, 404, 200.

Typical failures: 403 (API key/permissions), 401 (session/context), 400 (validation), 429 (rate limit).