Organization & KYB

Read your organization, onboard a new one, and submit business verification (KYB).

Get the organization

GET /v1/organization — Scope: organization:read

Returns the organization the API key belongs to.

bash
curl https://api.caiboglobal.com/v1/organization \
  -H "X-API-Key: $CAIBO_API_KEY"

Response — 200 OK

json
{
  "id": "org_9f8e7d6c",
  "object": "organization",
  "legal_name": "Acme Inc",
  "display_name": "Acme",
  "country": "CA",
  "status": "active",
  "kyb_status": "verified",
  "created_at": "2026-07-23T14:03:00Z"
}

Errors

HTTPtypecodeWhen
401authentication_errorapi_key_missing / api_key_invalidNo key, or an unknown/revoked key.
403permission_errorscope_insufficientThe key lacks organization:read.
429rate_limit_errorrate_limitedToo many requests.

Create an organization (onboarding)

POST /v1/organizations

This is the one endpoint that does NOT use an API key. It's authenticated with a Firebase ID token — the founder signs in first, and the organization is created for that user. It exists because you need a way to create your first organization (and thus your first key) before any API key exists. In practice you'll use the Business dashboard for this rather than calling it directly.

Headers

HeaderRequiredDescription
AuthorizationYesBearer <firebase-id-token> — not an API key.
Content-TypeYesapplication/json

Body parameters

FieldTypeRequiredDescription
legal_namestringYesThe business's legal name.
display_namestringNoDefaults to legal_name.
countrystringYesISO-3166 alpha-2.

Request

bash
curl https://api.caiboglobal.com/v1/organizations \
  -H "Authorization: Bearer $FIREBASE_ID_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "legal_name": "Acme Inc", "display_name": "Acme", "country": "CA" }'

Response — 201 Created

Returns the new organization and a one-time test API key to bootstrap your integration.

json
{
  "organization": {
    "id": "org_9f8e7d6c",
    "object": "organization",
    "legal_name": "Acme Inc",
    "display_name": "Acme",
    "country": "CA",
    "status": "pending",
    "kyb_status": "unverified",
    "created_at": "2026-07-23T14:03:00Z"
  },
  "api_key": {
    "object": "api_key",
    "prefix": "ck_test_a1b2",
    "mode": "test",
    "key": "ck_test_a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
  }
}
Errors use the standard envelope. A repeat onboarding for the same user returns 409 org_already_exists.

Submit KYB

POST /v1/kyb — Scope: organization:write

Submits your business verification and moves the organization to kyb_status: pending. Required to unlock live keys and live payouts. You can't resubmit while already verified or under review — that returns 409 kyb_not_resubmittable.

Body parameters

FieldTypeRequiredDescription
legal_namestringYesLegal name.
registration_nostringYesBusiness registration number.
incorporation_countrystringYesISO-3166 alpha-2.
beneficial_ownersobject[]YesAt least one UBO. Total ownership can't exceed 100%. Sub-fields below.
beneficial_owners[].namestringYesFull name.
beneficial_owners[].dobstringYesDate of birth, YYYY-MM-DD.
beneficial_owners[].ownership_pctnumberYesOwnership percentage, greater than 0 and at most 100.
beneficial_owners[].countrystringYesISO-3166 alpha-2.
documentsobject[]YesAt least one document. Sub-fields below.
documents[].typestringYesDocument type, e.g. incorporation.
documents[].referencestringYesA URL or reference to the document.

Request

bash
curl https://api.caiboglobal.com/v1/kyb \
  -H "X-API-Key: $CAIBO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "legal_name": "Acme Inc",
    "registration_no": "123456789",
    "incorporation_country": "CA",
    "beneficial_owners": [
      { "name": "Jane Doe", "dob": "1980-01-01", "ownership_pct": 60, "country": "CA" },
      { "name": "John Roe", "dob": "1975-05-05", "ownership_pct": 40, "country": "US" }
    ],
    "documents": [
      { "type": "incorporation", "reference": "https://docs.example/incorp.pdf" }
    ]
  }'

Response — 201 Created

json
{
  "id": "kyb_1a2b3c4d",
  "object": "kyb_submission",
  "org_id": "org_9f8e7d6c",
  "status": "pending",
  "legal_name": "Acme Inc",
  "registration_no": "123456789",
  "incorporation_country": "CA",
  "beneficial_owners": [
    { "name": "Jane Doe", "dob": "1980-01-01", "ownership_pct": 60, "country": "CA" },
    { "name": "John Roe", "dob": "1975-05-05", "ownership_pct": 40, "country": "US" }
  ],
  "documents": [
    { "type": "incorporation", "reference": "https://docs.example/incorp.pdf" }
  ],
  "created_at": "2026-07-23T14:03:00Z"
}

Errors

HTTPtypecodeWhen
400invalid_request_errorbad_requestMissing/invalid fields: bad country code, an owner with ownership ≤ 0 or > 100, total ownership > 100%, no owners, or no documents.
401authentication_errorapi_key_missing / api_key_invalidNo key, or an unknown/revoked key.
403permission_errorscope_insufficientThe key lacks organization:write.
409invalid_request_errorkyb_not_resubmittableThe organization is already verified or has a submission under review.
429rate_limit_errorrate_limitedToo many requests.

Get KYB status

GET /v1/kyb — Scope: organization:read

Returns your latest KYB submission, or 404 kyb_not_found if you haven't submitted one.

bash
curl https://api.caiboglobal.com/v1/kyb \
  -H "X-API-Key: $CAIBO_API_KEY"

Errors

HTTPtypecodeWhen
401authentication_errorapi_key_missing / api_key_invalidNo key, or an unknown/revoked key.
403permission_errorscope_insufficientThe key lacks organization:read.
404invalid_request_errorkyb_not_foundNo submission exists yet.