infinihash-com Approvals API

The Approvals API from infinihash-com — 2 operation(s) for approvals.

Operations 4

POST /kyc/{submissionId}/signoff Record a four-eyes sign-off #
GET /kyc/{submissionId}/signoff Get sign-off state #
POST /api/kyc/{submissionId}/signoff Record a four-eyes sign-off #
GET /api/kyc/{submissionId}/signoff Get sign-off state #

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-approvals-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-approvals-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Infinihash KYC Approvals 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: Approvals
paths:
  /kyc/{submissionId}/signoff:
    post:
      x-route-source:
        file: routes/signoff.js
        method: post
        path: /:submissionId/signoff
      summary: Record a four-eyes sign-off
      description: Records the line1 or line2 approve/reject decision (one record per role; re-submitting overwrites). line1 and line2 must be different people (409 same_signer; matched on email or normalized name). Any rejection immediately sets the submission to `rejected`; when both lines have approved the submission becomes `approved`, except that entity types requiring UBO verification are blocked (400 ubo_verification_incomplete) until all UBO verifications are completed. Closed submissions (rejected/approved/complete) accept no further sign-offs. Approve/reject fires the kyc.approved / kyc.rejected webhook.
      tags:
      - Approvals
      operationId: post_kyc_submissionId_signoff
      parameters:
      - name: submissionId
        in: path
        required: true
        schema:
          type: string
        description: KYC submission id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SignoffRequest'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '201':
          description: Sign-off recorded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignoffResult'
        '400':
          description: Validation error, submission already closed, or ubo_verification_incomplete (with pending_ubos)
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/Error'
                - $ref: '#/components/schemas/SignoffUboIncomplete'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Submission not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: 'same_signer: line1 and line2 must be different people'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignoffConflict'
        '429':
          description: Rate limited (global per-IP limit)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    get:
      x-route-source:
        file: routes/signoff.js
        method: get
        path: /:submissionId/signoff
      summary: Get sign-off state
      description: Returns the current line1 and line2 sign-off records (null when not yet given), whether both approved, and the submission status.
      tags:
      - Approvals
      operationId: get_kyc_submissionId_signoff
      parameters:
      - name: submissionId
        in: path
        required: true
        schema:
          type: string
        description: KYC submission id
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '200':
          description: Sign-off state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignoffState'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Submission not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited (global per-IP limit)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /api/kyc/{submissionId}/signoff:
    post:
      x-route-source:
        file: routes/signoff.js
        method: post
        path: /:submissionId/signoff
      summary: Record a four-eyes sign-off
      description: Records the line1 or line2 approve/reject decision (one record per role; re-submitting overwrites). line1 and line2 must be different people (409 same_signer; matched on email or normalized name). Any rejection immediately sets the submission to `rejected`; when both lines have approved the submission becomes `approved`, except that entity types requiring UBO verification are blocked (400 ubo_verification_incomplete) until all UBO verifications are completed. Closed submissions (rejected/approved/complete) accept no further sign-offs. Approve/reject fires the kyc.approved / kyc.rejected webhook.
      tags:
      - Approvals
      operationId: recordSignoff
      parameters:
      - name: submissionId
        in: path
        required: true
        schema:
          type: string
        description: KYC submission id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SignoffRequest'
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '201':
          description: Sign-off recorded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignoffResult'
        '400':
          description: Validation error, submission already closed, or ubo_verification_incomplete (with pending_ubos)
          content:
            application/json:
              schema:
                oneOf:
                - $ref: '#/components/schemas/Error'
                - $ref: '#/components/schemas/SignoffUboIncomplete'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Submission not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: 'same_signer: line1 and line2 must be different people'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignoffConflict'
        '429':
          description: Rate limited (global per-IP limit)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    get:
      x-route-source:
        file: routes/signoff.js
        method: get
        path: /:submissionId/signoff
      summary: Get sign-off state
      description: Returns the current line1 and line2 sign-off records (null when not yet given), whether both approved, and the submission status.
      tags:
      - Approvals
      operationId: getSignoff
      parameters:
      - name: submissionId
        in: path
        required: true
        schema:
          type: string
        description: KYC submission id
      security:
      - ApiKeyAuth: []
      - BearerAuth: []
      responses:
        '200':
          description: Sign-off state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignoffState'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Submission not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited (global per-IP limit)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    SignoffResult:
      type: object
      required:
      - signoff
      - submissionStatus
      properties:
        signoff:
          $ref: '#/components/schemas/ApprovalSignoff'
        submissionStatus:
          type:
          - string
          - 'null'
          enum:
          - approved
          - rejected
          - null
          description: '`rejected` after any rejection, `approved` once line1 and line2 have both approved, otherwise null (still pending the other line).'
    SignoffUboIncomplete:
      type: object
      required:
      - error
      - reason
      - message
      - pending_ubos
      properties:
        error:
          type: string
          enum:
          - ubo_verification_incomplete
        reason:
          type: string
          enum:
          - ubo_verification_not_started
          - ubo_verification_pending
        message:
          type: string
        pending_ubos:
          type: array
          items:
            type: object
            properties:
              id:
                type: integer
              ubo_name:
                type: string
              ubo_email:
                type: string
              status:
                type: string
    SignoffState:
      type: object
      required:
      - line1
      - line2
      - bothApproved
      - status
      properties:
        line1:
          allOf:
          - $ref: '#/components/schemas/ApprovalSignoff'
        line2:
          allOf:
          - $ref: '#/components/schemas/ApprovalSignoff'
        bothApproved:
          type: boolean
        status:
          type: string
          description: Current submission status.
    SignoffRequest:
      type: object
      required:
      - role
      - decision
      - approverName
      description: Four-eyes sign-off. line1 and line2 must be different people (409 same_signer). Entity types requiring UBO liveness cannot be finally approved until UBO verification has been initiated and completed (400 ubo_verification_incomplete).
      properties:
        role:
          type: string
          enum:
          - line1
          - line2
        decision:
          type: string
          enum:
          - approve
          - reject
        approverName:
          type: string
        approverEmail:
          type: string
          description: 'Optional but recommended: the stronger identity for the four-eyes check.'
        notes:
          type: string
      example:
        role: line1
        decision: approve
        approverName: Jane Reviewer
        approverEmail: jane@example.com
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: string
    SignoffConflict:
      type: object
      required:
      - error
      - message
      properties:
        error:
          type: string
          enum:
          - same_signer
        message:
          type: string
    ApprovalSignoff:
      type: object
      required:
      - id
      - submissionId
      - apiKeyId
      - role
      - approverName
      - decision
      - createdAt
      properties:
        id:
          type: string
        submissionId:
          type: string
        apiKeyId:
          type: string
        role:
          type: string
          enum:
          - line1
          - line2
        approverName:
          type: string
        approverEmail:
          type:
          - string
          - 'null'
        decision:
          type: string
          enum:
          - approve
          - reject
        notes:
          type:
          - string
          - 'null'
        createdAt:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-Key
    BearerAuth:
      type: http
      scheme: bearer