infinihash-com KYB / Business API

Business verification and registry lookups.

Operations 6

POST /documents/smart-extract Extract entity fields from a CIS / corporate document #
POST /kyb Verify a business (KYB) #
GET /kyb/{id} Get a KYB case #
POST /api/kyb Verify a business (KYB) #
GET /api/kyb/{id} Get a KYB case #
POST /api/documents/smart-extract Extract entity fields from a CIS / corporate document #

Specifications

Schemas & Data

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/infinihash-com:infinihash-com-kyb-business-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

infinihash-com-kyb-business-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Infinihash KYC KYB / Business API
  version: 1.0.0
  description: 'Identity verification, KYB, sanctions screening, UBO orchestration and periodic review.


    Auth: send your key as `X-API-Key: ` (or `Authorization: Bearer `).


    Most endpoints are mounted twice — at the root (`/kyc/...`) and under `/api` (`/api/kyc/...`). Prefer the `/api` form; it is what the hosted portals and SDKs use.


    Python SDK: `pip install "git+https://github.com/Infinihash/kyc-python@v0.1.0"` (https://github.com/Infinihash/kyc-python; runnable examples in examples/).'
  contact:
    name: Infinihash
    url: https://kyc.infinihash.com
servers:
- url: https://kyc-api.infinihash.com
  description: Production
tags:
- name: KYB / Business
  description: Business verification and registry lookups.
paths:
  /documents/smart-extract:
    post:
      x-route-source:
        file: routes/documents.js
        method: post
        path: /smart-extract
      summary: Extract entity fields from a CIS / corporate document
      description: AI extraction of a Client Information Sheet, company resume or filing (image, PDF or .docx) into structured entity fields, optionally creating a KYC submission (createEntity). With mode "bundle" a multi-document PDF is split into segments and each is extracted by type. If the extraction model is unavailable the call still answers 200 with empty `extracted` and a `warning`. Max 10 MB.
      tags:
      - KYB / Business
      operationId: post_documents_smart_extract
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocSmartExtractRequest'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '200':
          description: Extraction result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DocSmartExtractResult'
        '400':
          description: Unreadable body, missing data, file over 10 MB, unsupported legacy .doc, or (bundle) PDF could not be rasterized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key
        '422':
          description: 'docx_empty: no readable text in the Word document'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited
        '500':
          description: Extraction failed (detail has the cause)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: docx_not_supported on this deploy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /kyb:
    post:
      x-route-source:
        file: routes/kyb.js
        method: post
        path: /
      summary: Verify a business (KYB)
      description: 'Looks the company up in the official registry for its jurisdiction (US: SEC EDGAR, GB: Companies House), scores the name match and stores a KYB case. match_score >= 0.85 gives status approved, >= 0.60 pending, otherwise (or for unsupported jurisdictions or registry failure) manual_review. Rate limited to 30 requests/min per API key.'
      tags:
      - KYB / Business
      operationId: post_kyb
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KybRequest'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '201':
          description: KYB case created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KybCaseCreated'
        '400':
          description: company_name / jurisdiction missing or invalid, ubo_list not an array, ubo_list[i].name missing or ownership_pct outside 0-100
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key
        '429':
          description: Rate limited
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /kyb/{id}:
    get:
      x-route-source:
        file: routes/kyb.js
        method: get
        path: /:id
      summary: Get a KYB case
      description: Returns a KYB case created by POST /kyb, scoped to the calling API key.
      tags:
      - KYB / Business
      operationId: get_kyb_id
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
        description: KYC submission id
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '200':
          description: KYB case
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KybCase'
        '401':
          description: Missing or invalid API key
        '404':
          description: KYB case not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/kyb:
    post:
      x-route-source:
        file: routes/kyb.js
        method: post
        path: /
      summary: Verify a business (KYB)
      description: 'Looks the company up in the official registry for its jurisdiction (US: SEC EDGAR, GB: Companies House), scores the name match and stores a KYB case. match_score >= 0.85 gives status approved, >= 0.60 pending, otherwise (or for unsupported jurisdictions or registry failure) manual_review. Rate limited to 30 requests/min per API key.'
      tags:
      - KYB / Business
      operationId: createKybCase
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/KybRequest'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '201':
          description: KYB case created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KybCaseCreated'
        '400':
          description: company_name / jurisdiction missing or invalid, ubo_list not an array, ubo_list[i].name missing or ownership_pct outside 0-100
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key
        '429':
          description: Rate limited
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/kyb/{id}:
    get:
      x-route-source:
        file: routes/kyb.js
        method: get
        path: /:id
      summary: Get a KYB case
      description: Returns a KYB case created by POST /kyb, scoped to the calling API key.
      tags:
      - KYB / Business
      operationId: getKybCase
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
        description: KYC submission id
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '200':
          description: KYB case
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/KybCase'
        '401':
          description: Missing or invalid API key
        '404':
          description: KYB case not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/documents/smart-extract:
    post:
      x-route-source:
        file: routes/documents.js
        method: post
        path: /smart-extract
      summary: Extract entity fields from a CIS / corporate document
      description: AI extraction of a Client Information Sheet, company resume or filing (image, PDF or .docx) into structured entity fields, optionally creating a KYC submission (createEntity). With mode "bundle" a multi-document PDF is split into segments and each is extracted by type. If the extraction model is unavailable the call still answers 200 with empty `extracted` and a `warning`. Max 10 MB.
      tags:
      - KYB / Business
      operationId: smartExtract
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/DocSmartExtractRequest'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '200':
          description: Extraction result
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DocSmartExtractResult'
        '400':
          description: Unreadable body, missing data, file over 10 MB, unsupported legacy .doc, or (bundle) PDF could not be rasterized
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Missing or invalid API key
        '422':
          description: 'docx_empty: no readable text in the Word document'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited
        '500':
          description: Extraction failed (detail has the cause)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: docx_not_supported on this deploy
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    DocSmartExtractResult:
      type: object
      properties:
        extracted:
          type: object
          additionalProperties: true
          description: 'Entity fields (name, entityType, country, officers[], owners[], signatory, ...). Empty with `warning` when the model is unavailable: fill manually.'
        provider:
          type: string
        served_by:
          type: string
        warning:
          type: string
        discrepancies:
          type: array
          items:
            type: object
            additionalProperties: true
        pages_extracted:
          type: integer
        pipeline:
          type: string
        extraction_warnings:
          type: array
          items:
            type: string
        doc_plan:
          type:
          - object
          - 'null'
          additionalProperties: true
          description: Required documents plan (entity docs, per-person ID docs, conditional docs).
        entityId:
          type: string
          description: Present when createEntity created a submission.
        entityName:
          type: string
        entityType:
          type: string
        mode:
          type: string
          enum:
          - bundle
          description: Bundle mode only.
        segments:
          type: array
          items:
            $ref: '#/components/schemas/DocBundleSegment'
        mrz:
          type: object
          additionalProperties: true
          description: 'Bundle mode: MRZ cross-check of the ID/passport segment.'
        mrzAlert:
          type: boolean
          description: Bundle mode only.
        summary:
          type: object
          properties:
            totalSegments:
              type: integer
            docTypes:
              type: array
              items:
                type: string
            hasCIS:
              type: boolean
            mrzChecked:
              type: boolean
            mrzAlert:
              type: boolean
      description: Single-document mode returns extracted/provider/served_by/... (plus entityId/entityName/entityType when createEntity created a submission); bundle mode returns mode/segments/mrz/mrzAlert/summary.
    KybRequest:
      type: object
      properties:
        company_name:
          type: string
          maxLength: 500
          description: Legal name to verify (non-blank).
        jurisdiction:
          type: string
          pattern: ^[A-Za-z]{2}$
          description: ISO 3166-1 alpha-2 country code (trimmed, upper-cased). Only US (SEC EDGAR) and GB (Companies House) are looked up; any other jurisdiction goes to manual_review with reason jurisdiction_not_supported.
        registration_number:
          type: string
          description: Stored on the case; not used for the registry lookup.
        ubo_list:
          type: array
          items:
            type: object
            properties:
              name:
                type: string
              ownership_pct:
                type: number
                minimum: 0
                maximum: 100
            required:
            - name
            additionalProperties: true
      required:
      - company_name
      - jurisdiction
    DocSmartExtractRequest:
      type: object
      properties:
        filename:
          type: string
          description: Used for .docx/.doc detection when mimeType is missing.
        mimeType:
          type: string
          description: Image/PDF types as for /documents/extract, or the .docx MIME type for Word documents (text-direct path). Anything else is treated as application/pdf. Legacy .doc is refused.
        data:
          type: string
          format: byte
          description: Base64 file content, max 10 MB decoded.
        createEntity:
          type: boolean
          default: false
          description: Create a pending KYC submission from the extracted entity (needs a recognised name of 2+ characters). The extractor's entityType is normalised to a checklist type.
        mode:
          type: string
          enum:
          - bundle
          description: '"bundle": multi-document PDF; every page is classified and extracted by document type (data must be a PDF).'
        riskTier:
          type: string
          description: Tier used for the returned doc_plan (default "medium").
        submissionId:
          type: string
          description: Existing submission to plan against; in bundle mode a found CIS segment auto-populates its EDD checks.
      required:
      - data
      description: Multipart form-data is converted upstream; send JSON here.
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: string
    KybCaseCreated:
      type: object
      properties:
        kyb_case_id:
          type: string
        status:
          type: string
          enum:
          - approved
          - pending
          - manual_review
        company_name:
          type: string
        verified_name:
          type: string
        match_score:
          type: number
          description: 0-1 combined registry/name similarity.
        jurisdiction:
          type: string
        ubo_count:
          type: integer
        lookup_source:
          type:
          - string
          - 'null'
          enum:
          - SEC_EDGAR
          - Companies_House
          - null
        reason:
          type: string
          enum:
          - jurisdiction_not_supported
          - name_similarity_below_threshold
          - low_match_score
          description: Omitted when approved.
        createdAt:
          type: string
          format: date-time
        _links:
          type: object
          properties:
            status:
              type: string
    KybCase:
      type: object
      properties:
        kyb_case_id:
          type: string
        status:
          type: string
          enum:
          - approved
          - pending
          - manual_review
        company_name:
          type: string
        verified_name:
          type: string
        match_score:
          type: number
        jurisdiction:
          type: string
        registration_number:
          type:
          - string
          - 'null'
        ubo_list:
          type: array
          items:
            type: object
            additionalProperties: true
        ubo_count:
          type: integer
        lookup_source:
          type:
          - string
          - 'null'
          enum:
          - SEC_EDGAR
          - Companies_House
          - null
        reason:
          type: string
          description: Omitted when approved.
        createdAt:
          type: string
          format: date-time
    DocBundleSegment:
      type: object
      properties:
        segmentIdx:
          type: integer
        docType:
          type: string
        pages:
          description: Page range or list covered by the segment.
        confidence:
          type: number
        warnings:
          type: array
          items:
            type: string
        extracted:
          type: object
          additionalProperties: true
        provider:
          type: string
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
    BearerAuth:
      type: http
      scheme: bearer