> ## Documentation Index
> Fetch the complete documentation index at: https://docs.deeptrack.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Verify a business

> Checks the registration certificate (or CR12) and proof of address,
looks the business up in the register when available, and screens
the business and every director and owner. Each file is at most
4,000,000 base64 characters (about 3 MB). Scope `verify:kyb`.




## OpenAPI

````yaml /sentinel/openapi.yaml post /v1/verify/kyb
openapi: 3.1.0
info:
  title: Sentinel API
  version: 1.0.0
  summary: >-
    KYC, KYB, AML screening, document (IDP) checks and transaction monitoring
    for Kenya and East Africa.
  description: |
    The Sentinel API by Deeptrack lets your systems run identity, business and
    AML checks without opening the dashboard.

    **Authentication.** Send your API key as a bearer token:
    `Authorization: Bearer gt_live_…` (or `gt_test_…`). Create keys in
    Sentinel under **Developer → API Keys**. Each key has scopes; a key
    without the scope a route needs gets `403`.

    **Test mode.** Test keys (`gt_test_`) return a sandbox result at once
    (`status: completed`, `verdict: pass`, `sandbox: true`), are never
    charged, and store none of the names, numbers or images you send.

    **Asynchronous checks.** `POST /v1/verify/*` answers `202` with an `id`.
    The result arrives by webhook (`sentinel.scan.complete`) or with
    `GET /v1/verify/{id}`.

    **Errors.** Every error is JSON with an `error` message; validation
    errors add `details`, describing what each field takes.

    **Rate limits.** Per key, by plan (Trial 10/min, Starter 60, Growth 200,
    Business 500, Enterprise 1,000), plus an organization-wide cap. A limited
    request gets `429` with `Retry-After` in seconds.

    **Pagination.** List endpoints take `limit` (1–100) and `before`; pass
    the previous answer's `nextCursor` as `before` to get the next page.
    `nextCursor` is `null` on the last page.

    Guides with curl, Node and Python examples are in the Sentinel manual,
    chapters C1 to C9.
  contact:
    name: Deeptrack
    email: tech@deeptrack.io
    url: https://deeptrack.io
  x-changelog: See the manual, chapter C9 (API reference, OpenAPI and Postman).
servers:
  - url: https://robust-parakeet-542.convex.site
    description: >-
      Sentinel production API. Shown on the API Keys page; it may move to an
      api.* address, which will be announced in C9.
security:
  - bearerAuth: []
tags:
  - name: KYC
    description: Identity checks (document, liveness, face match, IPRS and AML).
  - name: KYB
    description: Business checks (registration, address, directors and owners).
  - name: Documents
    description: >-
      IDP document checks (identity documents, proof of address, KRA PIN
      certificates).
  - name: AML
    description: Sanctions, PEP and watch-list screening, and ongoing monitoring.
  - name: Transactions
    description: Transaction monitoring (Business and Enterprise plans, and the trial).
  - name: Capture links
    description: Links a customer opens on their phone to capture their ID and a selfie.
  - name: Results
    description: Read checks and their results.
  - name: Credits
    description: Credit balance, prices and usage.
paths:
  /v1/verify/kyb:
    post:
      tags:
        - KYB
      summary: Verify a business
      description: |
        Checks the registration certificate (or CR12) and proof of address,
        looks the business up in the register when available, and screens
        the business and every director and owner. Each file is at most
        4,000,000 base64 characters (about 3 MB). Scope `verify:kyb`.
      operationId: createKybCheck
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KybRequest'
            example:
              businessName: Mwangi Traders Limited
              registrationNumber: PVT-AB1234
              incorporationCountry: KE
              businessType: Private limited company
              externalRef: BIZ-2001
              registrationDocBase64: JVBERi0xLjcK…
              proofOfAddressBase64: JVBERi0xLjcK…
              directors:
                - firstName: Wanjiku
                  lastName: Mwangi
                  email: wanjiku@example.co.ke
                  position: Director
                  shareholding: 60%
                  dateOfBirth: '1992-04-17'
                  idNumber: '30458812'
      responses:
        '202':
          $ref: '#/components/responses/CheckAccepted'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/InsufficientCredits'
        '403':
          $ref: '#/components/responses/Forbidden'
        '413':
          $ref: '#/components/responses/TooLarge'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  schemas:
    KybRequest:
      type: object
      required:
        - businessName
        - registrationNumber
        - incorporationCountry
        - registrationDocBase64
        - proofOfAddressBase64
        - directors
      properties:
        businessName:
          type: string
          maxLength: 200
        registrationNumber:
          type: string
          maxLength: 100
          examples:
            - PVT-AB1234
            - CPR/2015/123456
        incorporationCountry:
          type: string
          maxLength: 100
          examples:
            - KE
        businessType:
          type: string
          maxLength: 100
        externalRef:
          type: string
          maxLength: 100
        registrationDocBase64:
          type: string
          maxLength: 4000000
          description: >-
            Base64 JPEG, PNG, WebP or PDF of the registration certificate or
            CR12.
        proofOfAddressBase64:
          type: string
          maxLength: 4000000
          description: >-
            Base64 JPEG, PNG, WebP or PDF of a proof of address in the
            business's name.
        directors:
          type: array
          minItems: 1
          maxItems: 50
          items:
            type: object
            required:
              - firstName
              - lastName
              - email
              - position
              - dateOfBirth
              - idNumber
            properties:
              firstName:
                type: string
                maxLength: 100
              lastName:
                type: string
                maxLength: 100
              email:
                type: string
                format: email
                maxLength: 200
              position:
                type: string
                maxLength: 100
              shareholding:
                type: string
                maxLength: 20
                examples:
                  - 40%
              dateOfBirth:
                type: string
                pattern: ^\d{4}-\d{2}-\d{2}$
              idNumber:
                type: string
                maxLength: 50
    CheckAccepted:
      type: object
      required:
        - id
        - type
        - status
      properties:
        id:
          type: string
          examples:
            - ver_3f9a1c0b7d2e4a51c8e0f6a29b4d7c13
        type:
          type: string
          enum:
            - idp
            - aml
            - document
            - kyb
        status:
          type: string
          enum:
            - queued
            - completed
        verdict:
          type: string
          const: pass
          description: Test keys only.
        sandbox:
          type: boolean
          description: Test keys only.
        monitoringId:
          type:
            - string
            - 'null'
          description: >-
            AML only, when `monitor: true` was sent: the monitored subject's id
            (null with a test key).
    Error:
      type: object
      required:
        - error
      properties:
        error:
          type: string
        details:
          type: object
          additionalProperties: true
  responses:
    CheckAccepted:
      description: >-
        The check was accepted. Live keys start `queued`; test keys finish at
        once.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/CheckAccepted'
    BadRequest:
      description: Missing or invalid fields. `details` describes what each field takes.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: 'Missing required fields: subjectName'
            details:
              subjectName: string of at most 200 characters
    Unauthorized:
      description: Missing, malformed, unknown or revoked API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Invalid API key
    InsufficientCredits:
      description: The balance is too low for this check (live keys only).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Insufficient credits
    Forbidden:
      description: >-
        The key lacks the scope, the IP address isn't allowed, the plan doesn't
        include the feature, or the account isn't active.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: >-
              This API key can't call POST /v1/verify/aml. Give it the
              "verify:aml" scope or use another key.
    TooLarge:
      description: A file or media field is over its size limit.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    RateLimited:
      description: Too many requests. Wait `Retry-After` seconds.
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds to wait.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Rate limit exceeded
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'Your API key: gt_live_… or gt_test_…'

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.