API Recipe: How to Run Full KYB Verification on a Business Profile

Last updated: March 31, 2026

This guide walks through the complete API workflow for running Know Your Business (KYB) verification using Business Profiles. Each step builds on the previous one, and callbacks are sent at every stage so you can track progress in real time.

Base URL: https://api.aiprise.com/api/v1/verify

Authentication: All requests require the x-api-key header.

Complete Flow Diagram

aiprise_kyb_enhanced_flow.png

Overview

Step

Endpoint

Purpose

1

POST /create_business_profile

Create the business entity

2

POST /run_verification_for_business_profile_id

Run KYB checks (registry lookup, AML, etc.)

3a

POST /related_person_v2

Add a related person (UBO/director)

3b

POST /run_verification_for_user_profile_id

Run KYC on the related person

3c

POST /create_verification_session_url_for_user_profile

Generate a verification link instead

4a

POST /related_company_v2

Add a related company

4b

POST /run_verification_for_business_profile_id

Run KYB on the related company (using its business profile ID)

5a

POST /add_business_document

Upload a business document

5b

POST /run_check_on_business_document

Run document check

6

POST /make_decision_with_risk_scoring

Run risk scoring / decisioning

7

POST /update_business_profile_result

Set final decision (Approve/Decline/Review)


Step 1: Create a Business Profile

Create a persistent business entity that will hold all verification data, related persons, companies, and documents.

POST /api/v1/verify/create_business_profile

Request

{
  "name": "Acme Corporation",
  "alternate_name": "Acme Corp",
  "tax_identification_number": "12-3456789",
  "website": "<https://acme.com>",
  "country_code": "US",
  "state_code": "DE",
  "formation_date": "2015-03-15",
  "business_entity_id": "your-internal-id-123",
  "client_reference_id": "your-internal-tracking-id",
  "client_reference_data": {
    "internal_case_number": "CASE-2024-001",
    "onboarding_source": "partner-api"
  },
  "addresses": [
    {
      "address_street_1": "123 Main St",
      "address_street_2": "Suite 400",
      "address_city": "Wilmington",
      "address_state": "DE",
      "address_zip_code": "19801",
      "address_country": "US"
    }
  ],
  "phone_numbers": ["+13025551234"],
  "email_addresses": ["compliance@acme.com"],
  "tags": ["high-value", "fintech"]
}
  • client_reference_id — your internal reference ID for tracking this business across systems

  • client_reference_data — arbitrary JSON metadata you want attached to this profile (carried forward to all verification sessions)

Response

{
  "business_profile_id": "bp_a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

Callback

Event type: BUSINESS_PROFILE_CREATE

{
  "callback_event_id": "evt_...",
  "event_type": "BUSINESS_PROFILE_CREATE",
  "business_profile_id": "bp_a1b2c3d4-..."
}

Save the business_profile_id — you will use it in every subsequent call.


Step 2: Run Verification on the Business Profile

This triggers the KYB workflow configured in your template (e.g. registry lookup, TIN verification, AML screening, adverse media).

POST /api/v1/verify/run_verification_for_business_profile_id

Request

{
  "business_profile_id": "bp_a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "template_id": "your-kyb-template-id"
}

The client_reference_id and client_reference_data set during profile creation are automatically carried forward to the verification session. You do not need to pass them again.

Response

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "aiprise_result": {
    "verification_session_id": "vs_...",
    "business_profile_id": "bp_a1b2c3d4-...",
    "business_profile_result": "UNKNOWN",
    "lookup_info": {
      "company_name": "Acme Corporation",
      "registration_number": "1234567",
      "status": "Active",
      "jurisdiction": "Delaware",
      "officers": []
    },
    "related_persons": [],
    "related_companies": [],
    "documents": []
  }
}

The lookup_info contains the registry data pulled in real time. It may also return suggested officers/directors from the registry which you can then add as related persons.

Callback

Event type: RUN_BUSINESS_VERIFICATION

The callback payload contains the full business verification result. This is sent to your events_callback_url.

Additionally, when the verification session completes, a VERIFICATION_SESSION_COMPLETION callback is sent to your callback_url with the complete business profile data.


Step 3: Add Related Persons and Run Verification

3a. Add a Related Person (UBO / Director / Officer)

POST /api/v1/verify/related_person_v2

In the v2 API, related persons are backed by a full user profile, enabling richer data and n-level entity hierarchies.

Request

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "user_profile": {
    "first_name": "Jane",
    "last_name": "Doe",
    "date_of_birth": "1985-06-15",
    "email_address": "jane.doe@acme.com",
    "phone_number": "+13025559876",
    "address": {
      "address_street_1": "456 Oak Ave",
      "address_city": "Wilmington",
      "address_state": "DE",
      "address_zip_code": "19801",
      "address_country": "US"
    },
    "client_reference_id": "your-person-ref-id",
    "client_reference_data": {}
  },
  "ownership_percent": 25.0,
  "shares_allocated": 1000,
  "roles": ["UBO", "Director"]
}

Response

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "person_reference_id": "pr_f1e2d3c4-..."
}

Callback

Event type: ADD_BUSINESS_OFFICER — payload includes the full related person object.


3b. Run KYC Verification on the Related Person

Once the related person is added, run KYC on their user profile. The person_reference_id returned in step 3a corresponds to a user profile that you can verify.

POST /api/v1/verify/run_verification_for_user_profile_id

Request

{
  "user_profile_id": "pr_f1e2d3c4-...",
  "template_id": "your-kyc-template-id",
  "user_data": {
    "first_name": "Jane",
    "last_name": "Doe",
    "date_of_birth": "1985-06-15",
    "email_address": "jane.doe@acme.com"
  },
  "additional_info": [
    {
      "additional_info_type": "PROOF_OF_ADDRESS",
      "additional_info_data": "<base64-encoded-document>"
    }
  ]
}

user_data is pre-populated from the related person record created in step 3a. Fields you pass here will override the stored values.

Response

{
  "verification_session_id": "vs_...",
  "user_profile_id": "pr_f1e2d3c4-...",
  "user_profile_result": "UNKNOWN"
}

Callback

Event type: BUSINESS_OFFICER_RUN_KYC — payload includes the KYC verification result plus the person_reference_id.


3c. Generate a Verification Link (Alternative to Inline)

Use this when you want the person to complete KYC themselves via a hosted verification flow.

POST /api/v1/verify/create_verification_session_url_for_user_profile

Request

{
  "user_profile_id": "pr_f1e2d3c4-...",
  "template_id": "your-kyc-template-id",
  "redirect_uri": "<https://your-app.com/verification-complete>"
}

Optional fields: client_reference_id, client_reference_data, theme_options, ui_options.

Response

{
  "verification_url": "<https://verify.aiprise.io/session/>..."
}

Share this URL with the person. When they complete the flow, a BUSINESS_OFFICER_RUN_KYC callback is sent automatically.

Callback

Event type: USER_PROFILE_CREATE_SESSION_URL

{
  "callback_event_id": "evt_...",
  "event_type": "USER_PROFILE_CREATE_SESSION_URL",
  "user_profile_id": "pr_f1e2d3c4-...",
  "session_url": "<https://verify.aiprise.io/session/>...",
  "verification_session_id": "vs_...",
  "expires_at": 1735689600000
}

Step 4: Add Related Companies and Run Verification

4a. Add a Related Company

POST /api/v1/verify/related_company_v2

In the v2 API, related companies are backed by their own business profile, enabling recursive multi-level KYB hierarchies (e.g. parent company > subsidiary > sub-subsidiary).

Request

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "relationship_type": "PARENT",
  "business_profile": {
    "name": "Acme Holdings LLC",
    "tax_identification_number": "98-7654321",
    "country_code": "US",
    "state_code": "DE",
    "addresses": [
      {
        "address_street_1": "789 Corporate Blvd",
        "address_city": "Dover",
        "address_state": "DE",
        "address_zip_code": "19901",
        "address_country": "US"
      }
    ],
    "client_reference_id": "your-company-ref-id",
    "client_reference_data": {}
  },
  "ownership_percent": 100.0,
  "shares_allocated": 5000,
  "roles": ["Parent Company"]
}

Response

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "company_reference_id": "cr_g7h8i9j0-..."
}

Callback

Event type: ADD_RELATED_COMPANY — payload includes the full related company object.


4b. Run KYB on the Related Company

Since v2 related companies are backed by their own business profile, you run verification using the same endpoint as Step 2 — just pass the related company's company_reference_id (which is its own business profile ID).

POST /api/v1/verify/run_verification_for_business_profile_id

Request

{
  "business_profile_id": "cr_g7h8i9j0-...",
  "template_id": "your-kyb-template-id"
}

The company_reference_id returned in step 4a is a business profile ID. Pass it directly as business_profile_id here. The related company's data (name, TIN, address, etc.) was already set when you created it in step 4a.

Response

{
  "business_profile_id": "cr_g7h8i9j0-...",
  "aiprise_result": {
    "verification_session_id": "vs_...",
    "business_profile_id": "cr_g7h8i9j0-...",
    "business_profile_result": "UNKNOWN",
    "lookup_info": {}
  }
}

Callback

Event type: RUN_BUSINESS_VERIFICATION — same callback structure as Step 2, scoped to the related company's business profile.


Step 5: Upload and Check Business Documents

5a. Upload a Document

POST /api/v1/verify/add_business_document

Request

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "file_name": "certificate_of_incorporation.pdf",
  "file_type": "CERTIFICATE_OF_INCORPORATION",
  "file_blob": "<base64-encoded-file>"
}

Max file size: 50 MB. Supported formats: PDF, PNG, JPG, JPEG.

Response

{
  "file_uuid": "file_k1l2m3n4-..."
}

Callback

Event type: ADD_ADDITIONAL_MEDIA


5b. Run a Check on the Document

POST /api/v1/verify/run_check_on_business_document

Request

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "template_id": "your-document-check-template-id",
  "file_uuid": "file_k1l2m3n4-...",
  "document_input_title": "Certificate of Incorporation"
}

Response

The response contains the document check results including OCR extraction, tampering detection, and any configured document verification checks.

{
  "verification_session_id": "vs_...",
  "document_check_result": {}
}

Callback

Event type: RUN_BUSINESS_DOCUMENT_CHECK


Step 6: Run Risk Scoring / Decisioning

Risk scoring uses the same endpoint as decisioning, but with a risk scoring template ID instead of a regular KYB template. The risk scoring template aggregates results from all previous steps (registry data, UBO KYC results, document checks, etc.) and produces a risk score.

POST /api/v1/verify/make_decision_with_risk_scoring

Request

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "template_id": "your-risk-scoring-template-id"
}

The template_id here must be a template configured as a risk scoring or decisioning template. This is a different template from the one used in Step 2.

Response

{
  "verification_session_id": "vs_...",
  "business_profile_id": "bp_a1b2c3d4-..."
}

Callback

Event type: RUN_RISK_SCORING (for risk scoring templates) or MAKE_DECISION (for decisioning templates)

Risk scoring/decisioning requires that all child sessions (UBO KYC, related company KYB, document checks) have completed. If any child session is still pending, the risk scoring workflow will not have full data to work with.


Step 7 (Optional): Manually Set the Final Decision

If you want to override or manually set the business profile result:

POST /api/v1/verify/update_business_profile_result

Request

{
  "business_profile_id": "bp_a1b2c3d4-...",
  "result": "APPROVED"
}

Valid values for result: APPROVED, DECLINED, REVIEW, DEACTIVATED

If you are setting DECLINEDas a value, reason_code is required.

Callback

Event type: RESULT_UPDATE

The full business profile is sent to your callback_url, and an incremental event update is sent to your events_callback_url.


Callbacks Reference

Setup

Callback URLs are configured on your template in the AiPrise dashboard:

  • callback_url — receives the full business profile payload when a verification session completes (VERIFICATION_SESSION_COMPLETION)

  • events_callback_url — receives incremental event updates as each action happens on the business profile

Security

All callbacks include an HMAC-SHA256 signature in the X-HMAC-SIGNATURE header, computed from the payload using your company's secret key. Always validate this signature before processing.

Event Types

Event

Trigger

BUSINESS_PROFILE_CREATE

Business profile created

RUN_BUSINESS_VERIFICATION

KYB verification run on the business

ADD_BUSINESS_OFFICER

Related person added

EDIT_BUSINESS_OFFICER

Related person updated

DELETE_BUSINESS_OFFICER

Related person removed

BUSINESS_OFFICER_RUN_KYC

KYC verification run on a related person

BUSINESS_OFFICER_CREATE_SESSION_URL

Verification link generated for a related person

ADD_RELATED_COMPANY

Related company added

EDIT_RELATED_COMPANY

Related company updated

DELETE_RELATED_COMPANY

Related company removed

RELATED_COMPANY_RUN_KYB

KYB verification run on a related company

ADD_ADDITIONAL_MEDIA

Business document uploaded

UPDATE_ADDITIONAL_MEDIA

Business document updated

DELETE_ADDITIONAL_MEDIA

Business document removed

RUN_BUSINESS_DOCUMENT_CHECK

Document check run

RUN_RISK_SCORING

Risk scoring executed

MAKE_DECISION

Decisioning executed

RESULT_UPDATE

Business profile result manually updated

VERIFICATION_REQUEST_SUBMITTED

Verification request submitted via email invite

BUSINESS_PROFILE_INFO_UPDATE

Business profile info updated

Callback Payload Structure

All event callbacks follow this structure:

{
  "callback_event_id": "unique-event-id",
  "event_type": "EVENT_TYPE",
  "business_profile_id": "bp_...",
  "verification_session_id": "vs_... (when applicable)",
  "target_id": "person or company reference ID (when applicable)"
}

Retries

Callbacks are delivered asynchronously. If your endpoint returns a non-2xx response, the callback will be retried automatically.


API Reference Links