API reference

Every endpoint of the Vindex API, with its fields, what it returns, the errors it can give, and code you can paste. Signed in? Try any of them in test mode.

Base URL

https://api.vindexgrid.com/v1

Authentication

Authorization: Bearer vdx_test_…

Version

2026-11-05

Errors are problem details with a stable code; there are 22 of them. Every POST takes an Idempotency-Key. Keys, limits and paging are explained in Keys, limits and conventions.

Account

Who you are calling as.

GET/v1/me

Check your key

Which partner, environment and key a request authenticates as. Free; handy for testing your setup.

Read limit

Returns

200 A key info object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/me \
  -H "Authorization: Bearer $VINDEX_API_KEY"
Response
{
  "object": "api_key_info",
  "livemode": false,
  "api_version": "2026-11-05",
  "partner": {
    "id": "ptn_0vZ3aB4cD5eF6gH7iJ8kL9",
    "name": "Acme Lending",
    "status": "live"
  },
  "key": {
    "id": "key_0vZ3aB4cD5eF6gH7iJ8kM1",
    "name": "Production server",
    "scopes": [
      "*"
    ]
  }
}

Verifications

Verify a person (KYC) or a company (KYB) through Vindex's hosted flow.

POST/v1/verifications

Create a verification

Start verifying a person or a company. Returns the verification with a hosted link to send to your customer; they complete Vindex's flow (documents, consent, face check) there.

The verification's price is held from your credits now and charged when the customer submits. If the link expires or you cancel first, the hold is released and nothing is charged.

In test mode nothing reaches Vindex's reviewers. The outcome comes from test_scenario, or from the last name (or company name) ending in Approved, Conditional, Rejected or ActionRequired; anything else is approved.

Key permission verifications:writeWrite limit

Body

  • typeenumrequired

    Verify a person (KYC) or a company (KYB).

    One ofindividualcompany
  • companyobjectnullable

    Required when type is company.

    Show its fieldsHide its fields
    • countrystringrequired

      Country of incorporation (ISO alpha-2)

      two-letter country code

    • legal_namestringrequired

      1–200 characters

    • addressobjectnullable
      Show its fieldsHide its fields
      • citystringnullable

        up to 100 characters

      • countrystringnullable

        ISO 3166-1 alpha-2, e.g. IN

        two-letter country code

      • line1stringnullable

        up to 200 characters

      • line2stringnullable

        up to 200 characters

      • postal_codestringnullable

        up to 20 characters

      • statestringnullable

        up to 100 characters

    • contactobjectnullable

      The person who will complete the hosted flow

      Show its fieldsHide its fields
      • designationstringnullable

        up to 100 characters

      • emailstringnullable

        up to 254 characters

      • namestringnullable

        up to 200 characters

      • phonestringnullable

        up to 32 characters

    • registration_numberstringnullable

      CIN, company number or equivalent

      up to 64 characters

    • websitestringnullable

      up to 300 characters

  • external_referencestringnullable

    Your id for this customer. Searchable; not unique.

    up to 255 characters

  • individualobjectnullable

    Required when type is individual.

    Show its fieldsHide its fields
    • first_namestringrequired

      1–100 characters

    • last_namestringrequired

      1–100 characters

    • addressobjectnullable
      Show its fieldsHide its fields
      • citystringnullable

        up to 100 characters

      • countrystringnullable

        ISO 3166-1 alpha-2, e.g. IN

        two-letter country code

      • line1stringnullable

        up to 200 characters

      • line2stringnullable

        up to 200 characters

      • postal_codestringnullable

        up to 20 characters

      • statestringnullable

        up to 100 characters

    • company_namestringnullable

      Employer or company they act for

      up to 200 characters

    • countrystringnullable

      Country of residence (ISO alpha-2)

      two-letter country code

    • date_of_birthdatenullable
    • designationstringnullable

      Their role at that company

      up to 100 characters

    • emailstringnullable

      up to 254 characters

    • middle_namestringnullable

      up to 100 characters

    • nationalitystringnullable

      two-letter country code

    • phonestringnullable

      E.164 if possible, e.g. +919876543210

      up to 32 characters

  • localestringnullable

    format ^[a-z]{2}(-[A-Z]{2})?$

  • metadatamap of stringnullable

    Up to 50 keys of your own. No personal data.

  • redirect_urlstringnullable

    Where the customer goes when they finish (https).

    up to 2048 characters

  • test_scenarioenumnullable

    Test mode only: the outcome to simulate after the customer submits.

    One ofapproveapprove_with_conditionsrejectaction_required

Returns

201 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/verifications \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "individual",
    "external_reference": "crm-42",
    "individual": {
      "first_name": "Aarav",
      "last_name": "Sharma",
      "email": "aarav.sharma@example.com",
      "country": "IN",
      "date_of_birth": "1990-04-12"
    },
    "redirect_url": "https://acme.example/kyc/done",
    "metadata": {
      "plan": "gold"
    }
  }'
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "created",
  "stage": "awaiting_customer",
  "outcome": null,
  "risk_rating": null,
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": null,
  "hosted_link": {
    "url": "https://vindexgrid.com/verify/#vlt_x8Qm2Lr0Hc5Wk9Ts3Ny7Vb1Pd4Zf6Ga",
    "expires_at": "2026-11-12T10:24:51Z",
    "active": true
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 70,
    "charged": 0
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": false,
      "generated_at": null
    },
    {
      "type": "customer_report",
      "available": false,
      "generated_at": null
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": null,
  "submitted_at": null,
  "action_required_at": null,
  "decided_at": null,
  "expired_at": null,
  "canceled_at": null,
  "updated_at": "2026-11-05T10:24:51Z"
}
GET/v1/verifications

List verifications

Newest first. Page with starting_after set to the last id you received while has_more is true.

Key permission verifications:readRead limit

Query parameters

  • limitinteger

    1 to 100 · default 10

  • starting_afterstringnullable

    Cursor: the last id of the previous page

  • statusenumnullable

    Only this status

    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • external_referencestringnullable
  • created_gtedate-timenullable

    Created at or after (ISO 8601)

  • created_ltdate-timenullable

    Created before (ISO 8601)

Returns

200 A verification list object.

› Show its fields
  • dataarray of objectsrequired
    Show its fieldsHide its fields
    • action_required_atstringrequirednullable
    • canceled_atstringrequirednullable
    • case_referencestringrequirednullable

      Vindex's case reference; quote it to Vindex support

    • conditionsarray of stringrequired

      Conditions attached to an approval with conditions

    • created_atstringrequirednullable
    • creditsobjectrequired
      Show its fieldsHide its fields
      • chargedintegerrequired
      • heldintegerrequired

        Reserved now; charged when the customer submits

      • priceintegerrequired

        What the verification costs, in credits

    • decided_atstringrequirednullable
    • expired_atstringrequirednullable
    • external_referencestringrequirednullable
    • idstringrequired
    • livemodebooleanrequired
    • localestringrequirednullable
    • metadatamap of stringrequired
    • objectstringrequired
    • outcomeenumrequirednullable

      Vindex's recommendation once decided

      One ofapprovedapproved_with_conditionsrejected
    • partner_decisionobjectrequirednullable
      Show its fieldsHide its fields
    • redirect_urlstringrequirednullable
    • reportsarray of objectsrequired
      Show its fieldsHide its fields
    • risk_ratingstringrequirednullable

      low, medium, high (or Vindex's rating)

    • stagestringrequired

      Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

    • started_atstringrequirednullable
    • statusenumrequired
      One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
    • submitted_atstringrequirednullable
    • typeenumrequired
      One ofindividualcompany
    • updated_atstringrequirednullable
  • has_morebooleanrequired
  • objectstringrequired
  • urlstringrequired

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl -G https://api.vindexgrid.com/v1/verifications \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -d limit=10 \
  -d status=decided
Response
{
  "object": "list",
  "data": [
    {
      "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "verification",
      "livemode": false,
      "type": "individual",
      "status": "decided",
      "stage": "decided",
      "outcome": "approved",
      "risk_rating": "low",
      "conditions": [],
      "external_reference": "crm-42",
      "metadata": {
        "plan": "gold"
      },
      "case_reference": "KYC-7F3A9C21",
      "hosted_link": {
        "url": null,
        "expires_at": null,
        "active": false
      },
      "redirect_url": "https://acme.example/kyc/done",
      "locale": "en",
      "credits": {
        "price": 70,
        "held": 0,
        "charged": 70
      },
      "reports": [
        {
          "type": "outcome_letter",
          "available": true,
          "generated_at": "2026-11-07T15:02:11Z"
        },
        {
          "type": "customer_report",
          "available": true,
          "generated_at": "2026-11-07T15:02:09Z"
        }
      ],
      "partner_decision": null,
      "created_at": "2026-11-05T10:24:51Z",
      "started_at": "2026-11-05T11:02:40Z",
      "submitted_at": "2026-11-05T11:19:03Z",
      "action_required_at": null,
      "decided_at": "2026-11-07T15:01:58Z",
      "expired_at": null,
      "canceled_at": null,
      "updated_at": "2026-11-07T15:02:11Z"
    }
  ],
  "has_more": false,
  "url": "/v1/verifications"
}
GET/v1/verifications/{verification_id}

Retrieve a verification

The current status, stage, outcome and risk rating.

Key permission verifications:readRead limit

Path parameters

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy \
  -H "Authorization: Bearer $VINDEX_API_KEY"
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "decided",
  "stage": "decided",
  "outcome": "approved",
  "risk_rating": "low",
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": "KYC-7F3A9C21",
  "hosted_link": {
    "url": null,
    "expires_at": null,
    "active": false
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 0,
    "charged": 70
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": true,
      "generated_at": "2026-11-07T15:02:11Z"
    },
    {
      "type": "customer_report",
      "available": true,
      "generated_at": "2026-11-07T15:02:09Z"
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": "2026-11-05T11:02:40Z",
  "submitted_at": "2026-11-05T11:19:03Z",
  "action_required_at": null,
  "decided_at": "2026-11-07T15:01:58Z",
  "expired_at": null,
  "canceled_at": null,
  "updated_at": "2026-11-07T15:02:11Z"
}
POST/v1/verifications/{verification_id}/cancel

Cancel a verification

Cancel before the customer submits. The link stops working and held credits are released.

Key permission verifications:writeWrite limit

Path parameters

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/cancel \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "canceled",
  "stage": "canceled",
  "outcome": null,
  "risk_rating": null,
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": null,
  "hosted_link": {
    "url": null,
    "expires_at": null,
    "active": false
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 0,
    "charged": 0
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": false,
      "generated_at": null
    },
    {
      "type": "customer_report",
      "available": false,
      "generated_at": null
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": null,
  "submitted_at": null,
  "action_required_at": null,
  "decided_at": null,
  "expired_at": null,
  "canceled_at": "2026-11-05T12:00:00Z",
  "updated_at": "2026-11-05T10:24:51Z"
}
POST/v1/verifications/{verification_id}/partner_decision

Record your decision

Vindex's outcome is a recommendation; the decision to onboard stays yours. Record it here so the audit trail shows who decided what, and when.

Key permission verifications:writeWrite limit

Path parameters

Body

  • decisionenumrequired

    What you decided after Vindex's outcome.

    One ofacceptedrejected
  • decided_bystringnullable

    Who decided (name or staff id).

    up to 200 characters

  • notestringnullable

    up to 2000 characters

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/partner_decision \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "decision": "accepted",
    "decided_by": "Priya Nair, onboarding team",
    "note": "Onboard on the standard plan."
  }'
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "decided",
  "stage": "decided",
  "outcome": "approved",
  "risk_rating": "low",
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": "KYC-7F3A9C21",
  "hosted_link": {
    "url": null,
    "expires_at": null,
    "active": false
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 0,
    "charged": 70
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": true,
      "generated_at": "2026-11-07T15:02:11Z"
    },
    {
      "type": "customer_report",
      "available": true,
      "generated_at": "2026-11-07T15:02:09Z"
    }
  ],
  "partner_decision": {
    "decision": "accepted",
    "decided_by": "Priya Nair, onboarding team",
    "note": "Onboard on the standard plan.",
    "decided_at": "2026-11-07T16:10:00Z"
  },
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": "2026-11-05T11:02:40Z",
  "submitted_at": "2026-11-05T11:19:03Z",
  "action_required_at": null,
  "decided_at": "2026-11-07T15:01:58Z",
  "expired_at": null,
  "canceled_at": null,
  "updated_at": "2026-11-07T15:02:11Z"
}

Reports

Download the outcome letter and customer report of a decided verification.

GET/v1/verifications/{verification_id}/report

Download a report

The PDF of a decided verification. outcome_letter exists for every decision; customer_report for approvals. Store it securely: it contains personal data.

Key permission verifications:readRead limit

Path parameters

Query parameters

  • typeenum

    Which report: the outcome letter (every decision) or the customer report (approvals)

    One ofoutcome_lettercustomer_report

    default "outcome_letter"

Returns

200 The PDF file (application/pdf).

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl -G https://api.vindexgrid.com/v1/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/report \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -d type=outcome_letter \
  -o outcome-letter.pdf
Response
200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename="KYC-7F3A9C21 - Outcome letter.pdf"

%PDF-1.7 …

Screenings

Screen people and companies against sanctions, PEP and adverse-media lists.

POST/v1/screenings

Screen a name

Screen one person or company and get the result straight away. Charged only when the screen completes.

In test mode, names containing Sanctioned, Pep, Adverse or Multimatch return matches and Unavailable simulates a provider outage; anything else is no_match.

Key permission screenings:writeScreening limit

Body

  • subjectobjectrequired
    Show its fieldsHide its fields
    • typeenumrequired
      One ofpersoncompany
    • countrystringnullable

      two-letter country code

    • date_of_birthdatenullable

      People only; narrows namesake matches

    • first_namestringnullable

      up to 100 characters

    • genderenumnullable
      One ofmalefemaleunspecified
    • last_namestringnullable

      up to 100 characters

    • namestringnullable

      Full name (or use first_name and last_name)

      up to 300 characters

    • registration_numberstringnullable

      Companies only

      up to 64 characters

  • external_referencestringnullable

    up to 255 characters

  • metadatamap of stringnullable
  • Why you are screening (kept for audit).

    One ofonboardingperiodic_reviewtransaction_monitoringother

    default "onboarding"

Returns

201 A screening object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests503 Provider unavailable

curl https://api.vindexgrid.com/v1/screenings \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "subject": {
      "type": "person",
      "name": "Aarav Sharma",
      "date_of_birth": "1990-04-12",
      "country": "IN"
    },
    "purpose": "onboarding",
    "external_reference": "crm-42"
  }'
Response
{
  "id": "scr_0vZ3mT4cQw8nX2Lb9Pk1Ra",
  "object": "screening",
  "livemode": false,
  "batch_id": null,
  "status": "completed",
  "subject": {
    "type": "person",
    "country": "IN"
  },
  "result": {
    "outcome": "no_match",
    "screened_at": "2026-11-05T10:31:12Z",
    "provider": "test",
    "match_count": 0,
    "categories": []
  },
  "error": null,
  "purpose": "onboarding",
  "external_reference": "crm-42",
  "metadata": {},
  "credits_charged": 1,
  "created_at": "2026-11-05T10:31:11Z",
  "completed_at": "2026-11-05T10:31:12Z"
}
GET/v1/screenings

List screenings

Key permission screenings:readRead limit

Query parameters

Returns

200 A screening list object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl -G https://api.vindexgrid.com/v1/screenings \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -d limit=10
Response
{
  "object": "list",
  "data": [
    {
      "id": "scr_0vZ3mT4cQw8nX2Lb9Pk1Ra",
      "object": "screening",
      "livemode": false,
      "batch_id": null,
      "status": "completed",
      "subject": {
        "type": "person",
        "country": "IN"
      },
      "result": {
        "outcome": "no_match",
        "screened_at": "2026-11-05T10:31:12Z",
        "provider": "test",
        "match_count": 0,
        "categories": []
      },
      "error": null,
      "purpose": "onboarding",
      "external_reference": "crm-42",
      "metadata": {},
      "credits_charged": 1,
      "created_at": "2026-11-05T10:31:11Z",
      "completed_at": "2026-11-05T10:31:12Z"
    }
  ],
  "has_more": false,
  "url": "/v1/screenings"
}
GET/v1/screenings/{screening_id}

Retrieve a screening

Key permission screenings:readRead limit

Path parameters

Returns

200 A screening object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/screenings/scr_0vZ3mT4cQw8nX2Lb9Pk1Ra \
  -H "Authorization: Bearer $VINDEX_API_KEY"
Response
{
  "id": "scr_0vZ3mT4cQw8nX2Lb9Pk1Ra",
  "object": "screening",
  "livemode": false,
  "batch_id": null,
  "status": "completed",
  "subject": {
    "type": "person",
    "country": "IN"
  },
  "result": {
    "outcome": "no_match",
    "screened_at": "2026-11-05T10:31:12Z",
    "provider": "test",
    "match_count": 0,
    "categories": []
  },
  "error": null,
  "purpose": "onboarding",
  "external_reference": "crm-42",
  "metadata": {},
  "credits_charged": 1,
  "created_at": "2026-11-05T10:31:11Z",
  "completed_at": "2026-11-05T10:31:12Z"
}
POST/v1/screening_batches

Screen up to 100 names

Screen up to 100 subjects in the background. The total price is held up front and charged per subject screened; the rest is released. You get screening_batch.completed when it is done.

Key permission screenings:writeScreening limit

Body

  • subjectsarray of objectsrequired

    1 to 100 items

    Show its fieldsHide its fields
    • subjectobjectrequired
      Show its fieldsHide its fields
      • typeenumrequired
        One ofpersoncompany
      • countrystringnullable

        two-letter country code

      • date_of_birthdatenullable

        People only; narrows namesake matches

      • first_namestringnullable

        up to 100 characters

      • genderenumnullable
        One ofmalefemaleunspecified
      • last_namestringnullable

        up to 100 characters

      • namestringnullable

        Full name (or use first_name and last_name)

        up to 300 characters

      • registration_numberstringnullable

        Companies only

        up to 64 characters

    • external_referencestringnullable

      up to 255 characters

    • metadatamap of stringnullable
  • external_referencestringnullable

    up to 255 characters

  • metadatamap of stringnullable
  • One ofonboardingperiodic_reviewtransaction_monitoringother

    default "onboarding"

Returns

202 A screening batch object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/screening_batches \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "subjects": [
      {
        "subject": {
          "type": "person",
          "name": "Aarav Sharma",
          "country": "IN"
        },
        "external_reference": "row-1"
      },
      {
        "subject": {
          "type": "company",
          "name": "Bright Widgets Ltd",
          "country": "GB"
        },
        "external_reference": "row-2"
      }
    ],
    "purpose": "periodic_review",
    "external_reference": "review-2026-11"
  }'
Response
{
  "id": "sbt_0vZ3nY7dRe1pZ5Mc3Qv8Tb",
  "object": "screening_batch",
  "livemode": false,
  "status": "processing",
  "total": 2,
  "completed": 0,
  "failed": 0,
  "with_matches": 0,
  "credits": {
    "held": 2,
    "charged": 0
  },
  "external_reference": "review-2026-11",
  "metadata": {},
  "created_at": "2026-11-05T10:40:00Z",
  "completed_at": null
}
GET/v1/screening_batches/{batch_id}

Retrieve a batch

The batch with every screening in it.

Key permission screenings:readRead limit

Path parameters

Returns

200 A screening batch object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/screening_batches/sbt_0vZ3nY7dRe1pZ5Mc3Qv8Tb \
  -H "Authorization: Bearer $VINDEX_API_KEY"
Response
{
  "id": "sbt_0vZ3nY7dRe1pZ5Mc3Qv8Tb",
  "object": "screening_batch",
  "livemode": false,
  "status": "completed",
  "total": 2,
  "completed": 2,
  "failed": 0,
  "with_matches": 0,
  "credits": {
    "held": 2,
    "charged": 2
  },
  "external_reference": "review-2026-11",
  "metadata": {},
  "created_at": "2026-11-05T10:40:00Z",
  "completed_at": "2026-11-05T10:40:04Z",
  "screenings": [
    {
      "id": "scr_0vZ3mT4cQw8nX2Lb9Pk1Ra",
      "object": "screening",
      "livemode": false,
      "batch_id": null,
      "status": "completed",
      "subject": {
        "type": "person",
        "country": "IN"
      },
      "result": {
        "outcome": "no_match",
        "screened_at": "2026-11-05T10:31:12Z",
        "provider": "test",
        "match_count": 0,
        "categories": []
      },
      "error": null,
      "purpose": "onboarding",
      "external_reference": "crm-42",
      "metadata": {},
      "credits_charged": 1,
      "created_at": "2026-11-05T10:31:11Z",
      "completed_at": "2026-11-05T10:31:12Z"
    }
  ]
}

Balance

Your prepaid credits.

GET/v1/balance

Retrieve your balance

Key permission balance:readRead limit

Returns

200 A balance object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/balance \
  -H "Authorization: Bearer $VINDEX_API_KEY"
Response
{
  "object": "balance",
  "livemode": true,
  "available": 1204,
  "held": 140,
  "frozen": 0,
  "low_balance_threshold": 140,
  "expiring_soon": [
    {
      "credits": 25,
      "expires_at": "2026-11-28T09:00:00Z"
    }
  ]
}

Events

What happened in your account, also sent to your webhook endpoints.

GET/v1/events

List events

Events from the last 30 days, newest first. Use this to catch up after your endpoint was down.

Key permission events:readRead limit

Query parameters

  • limitinteger

    1 to 100 · default 10

  • starting_afterstringnullable
  • typestringnullable

    An event type, or a group such as verification.*

  • object_idstringnullable

    Events about one object

Returns

200 A event list object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl -G https://api.vindexgrid.com/v1/events \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -d limit=10 \
  -d type=verification.*
Response
{
  "object": "list",
  "data": [
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.decided",
      "created_at": "2026-11-07T15:01:59Z",
      "livemode": false,
      "data": {
        "object": "verification",
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "type": "individual",
        "status": "decided",
        "stage": "decided",
        "outcome": "approved",
        "risk_rating": "low",
        "external_reference": "crm-42"
      }
    }
  ],
  "has_more": false,
  "url": "/v1/events"
}
GET/v1/events/{event_id}

Retrieve an event

Key permission events:readRead limit

Path parameters

Returns

200 A event object.

› Show its fields

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/events/evt_0vZ3kq9XfJ1mB7c2Lr8sTy \
  -H "Authorization: Bearer $VINDEX_API_KEY"
Response
{
  "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "event",
  "type": "verification.decided",
  "created_at": "2026-11-07T15:01:59Z",
  "livemode": false,
  "data": {
    "object": "verification",
    "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
    "type": "individual",
    "status": "decided",
    "stage": "decided",
    "outcome": "approved",
    "risk_rating": "low",
    "external_reference": "crm-42"
  }
}

Test helpers

Test mode only: move a verification through its life cycle.

POST/v1/test_helpers/verifications/{verification_id}/submit

Simulate the customer submitting

Key permission verifications:writeWrite limitTest keys only

Path parameters

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/test_helpers/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/submit \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "submitted",
  "stage": "under_review",
  "outcome": null,
  "risk_rating": null,
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": null,
  "hosted_link": {
    "url": null,
    "expires_at": "2026-11-12T10:24:51Z",
    "active": true
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 0,
    "charged": 70
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": false,
      "generated_at": null
    },
    {
      "type": "customer_report",
      "available": false,
      "generated_at": null
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": null,
  "submitted_at": null,
  "action_required_at": null,
  "decided_at": null,
  "expired_at": null,
  "canceled_at": null,
  "updated_at": "2026-11-05T10:24:51Z"
}
POST/v1/test_helpers/verifications/{verification_id}/request_action

Simulate Vindex asking the customer for more

Key permission verifications:writeWrite limitTest keys only

Path parameters

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/test_helpers/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/request_action \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "action_required",
  "stage": "awaiting_customer_response",
  "outcome": null,
  "risk_rating": null,
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": null,
  "hosted_link": {
    "url": "https://vindexgrid.com/verify/#vlt_x8Qm2Lr0Hc5Wk9Ts3Ny7Vb1Pd4Zf6Ga",
    "expires_at": "2026-11-12T10:24:51Z",
    "active": true
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 70,
    "charged": 0
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": false,
      "generated_at": null
    },
    {
      "type": "customer_report",
      "available": false,
      "generated_at": null
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": null,
  "submitted_at": null,
  "action_required_at": null,
  "decided_at": null,
  "expired_at": null,
  "canceled_at": null,
  "updated_at": "2026-11-05T10:24:51Z"
}
POST/v1/test_helpers/verifications/{verification_id}/respond

Simulate the customer answering

Key permission verifications:writeWrite limitTest keys only

Path parameters

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/test_helpers/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/respond \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "submitted",
  "stage": "under_review",
  "outcome": null,
  "risk_rating": null,
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": null,
  "hosted_link": {
    "url": "https://vindexgrid.com/verify/#vlt_x8Qm2Lr0Hc5Wk9Ts3Ny7Vb1Pd4Zf6Ga",
    "expires_at": "2026-11-12T10:24:51Z",
    "active": true
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 70,
    "charged": 0
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": false,
      "generated_at": null
    },
    {
      "type": "customer_report",
      "available": false,
      "generated_at": null
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": null,
  "submitted_at": null,
  "action_required_at": null,
  "decided_at": null,
  "expired_at": null,
  "canceled_at": null,
  "updated_at": "2026-11-05T10:24:51Z"
}
POST/v1/test_helpers/verifications/{verification_id}/decide

Simulate Vindex's decision

Key permission verifications:writeWrite limitTest keys only

Path parameters

Body

  • outcomeenumrequired
    One ofapprovedapproved_with_conditionsrejected

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/test_helpers/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/decide \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
    "outcome": "approved"
  }'
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "decided",
  "stage": "decided",
  "outcome": "approved",
  "risk_rating": "low",
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": "KYC-7F3A9C21",
  "hosted_link": {
    "url": null,
    "expires_at": null,
    "active": false
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 0,
    "charged": 70
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": true,
      "generated_at": "2026-11-07T15:02:11Z"
    },
    {
      "type": "customer_report",
      "available": true,
      "generated_at": "2026-11-07T15:02:09Z"
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": "2026-11-05T11:02:40Z",
  "submitted_at": "2026-11-05T11:19:03Z",
  "action_required_at": null,
  "decided_at": "2026-11-07T15:01:58Z",
  "expired_at": null,
  "canceled_at": null,
  "updated_at": "2026-11-07T15:02:11Z"
}
POST/v1/test_helpers/verifications/{verification_id}/expire

Expire the hosted link now

Key permission verifications:writeWrite limitTest keys only

Path parameters

Returns

200 A verification object.

› Show its fields
  • action_required_atstringrequirednullable
  • canceled_atstringrequirednullable
  • case_referencestringrequirednullable

    Vindex's case reference; quote it to Vindex support

  • conditionsarray of stringrequired

    Conditions attached to an approval with conditions

  • created_atstringrequirednullable
  • creditsobjectrequired
    Show its fieldsHide its fields
    • chargedintegerrequired
    • heldintegerrequired

      Reserved now; charged when the customer submits

    • priceintegerrequired

      What the verification costs, in credits

  • decided_atstringrequirednullable
  • expired_atstringrequirednullable
  • external_referencestringrequirednullable
  • idstringrequired
  • livemodebooleanrequired
  • localestringrequirednullable
  • metadatamap of stringrequired
  • objectstringrequired
  • outcomeenumrequirednullable

    Vindex's recommendation once decided

    One ofapprovedapproved_with_conditionsrejected
  • partner_decisionobjectrequirednullable
    Show its fieldsHide its fields
  • redirect_urlstringrequirednullable
  • reportsarray of objectsrequired
    Show its fieldsHide its fields
  • risk_ratingstringrequirednullable

    low, medium, high (or Vindex's rating)

  • stagestringrequired

    Finer progress for display: awaiting_customer, customer_in_progress, screening, under_review, final_review, awaiting_customer_response, appeal_review, decided

  • started_atstringrequirednullable
  • statusenumrequired
    One ofcreatedin_progresssubmittedaction_requireddecidedexpiredcanceled
  • submitted_atstringrequirednullable
  • typeenumrequired
    One ofindividualcompany
  • updated_atstringrequirednullable

Errors

400 Bad request401 Not authenticated402 Not enough credits403 Not allowed404 Not found409 Conflict422 Invalid fields429 Too many requests

curl https://api.vindexgrid.com/v1/test_helpers/verifications/ver_0vZ3kq9XfJ1mB7c2Lr8sTy/expire \
  -H "Authorization: Bearer $VINDEX_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
Response
{
  "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
  "object": "verification",
  "livemode": false,
  "type": "individual",
  "status": "expired",
  "stage": "expired",
  "outcome": null,
  "risk_rating": null,
  "conditions": [],
  "external_reference": "crm-42",
  "metadata": {
    "plan": "gold"
  },
  "case_reference": null,
  "hosted_link": {
    "url": null,
    "expires_at": null,
    "active": false
  },
  "redirect_url": "https://acme.example/kyc/done",
  "locale": "en",
  "credits": {
    "price": 70,
    "held": 0,
    "charged": 0
  },
  "reports": [
    {
      "type": "outcome_letter",
      "available": false,
      "generated_at": null
    },
    {
      "type": "customer_report",
      "available": false,
      "generated_at": null
    }
  ],
  "partner_decision": null,
  "created_at": "2026-11-05T10:24:51Z",
  "started_at": null,
  "submitted_at": null,
  "action_required_at": null,
  "decided_at": null,
  "expired_at": "2026-11-05T12:00:00Z",
  "canceled_at": null,
  "updated_at": "2026-11-05T10:24:51Z"
}

Webhook events

Webhook payloads are thin: they say what happened to which object, with its status, and never carry personal data. Fetch the object with your key when you need more. Every payload has the same envelope.

Verifications

  • ›verification.createdA verification was created and its hosted link issued.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.created",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "created",
        "stage": "awaiting_customer",
        "outcome": null,
        "risk_rating": null,
        "external_reference": "crm-42"
      }
    }
  • ›verification.startedThe customer opened the hosted link and started.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.started",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "in_progress",
        "stage": "customer_in_progress",
        "outcome": null,
        "risk_rating": null,
        "external_reference": "crm-42"
      }
    }
  • ›verification.submittedThe customer submitted; Vindex review has started.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.submitted",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "submitted",
        "stage": "under_review",
        "outcome": null,
        "risk_rating": null,
        "external_reference": "crm-42"
      }
    }
  • ›verification.action_requiredVindex needs more from the customer. Send them their hosted link again.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.action_required",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "action_required",
        "stage": "awaiting_customer_response",
        "outcome": null,
        "risk_rating": null,
        "external_reference": "crm-42"
      }
    }
  • ›verification.resubmittedThe customer answered Vindex's request; review continues.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.resubmitted",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "submitted",
        "stage": "under_review",
        "outcome": null,
        "risk_rating": null,
        "external_reference": "crm-42"
      }
    }
  • ›verification.decidedVindex reached its outcome: approved, approved with conditions, or rejected.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.decided",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "decided",
        "stage": "decided",
        "outcome": "approved",
        "risk_rating": "low",
        "external_reference": "crm-42"
      }
    }
  • ›verification.expiredThe hosted link expired before the customer submitted. Held credits were released.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.expired",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "expired",
        "stage": "expired",
        "outcome": null,
        "risk_rating": null,
        "external_reference": "crm-42"
      }
    }
  • ›verification.canceledThe verification was canceled. Held credits were released.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "verification.canceled",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "verification",
        "type": "individual",
        "status": "canceled",
        "stage": "canceled",
        "outcome": null,
        "risk_rating": null,
        "external_reference": "crm-42"
      }
    }
  • ›report.readyA report PDF (customer report or outcome letter) can be downloaded.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "report.ready",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "object": "report",
        "external_reference": "crm-42",
        "verification_id": "ver_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "report_type": "outcome_letter"
      }
    }

Screenings

  • ›screening_batch.completedEvery subject in a batch screening has been screened.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "screening_batch.completed",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "sbt_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "screening_batch",
        "status": "completed",
        "total": 25,
        "with_matches": 2
      }
    }

Billing

  • ›billing.credits_purchasedCredits were added to your live balance after a payment.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "billing.credits_purchased",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "pur_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "credit_purchase",
        "status": "paid",
        "credits": 525
      }
    }
  • ›billing.balance_lowYour live balance dropped to or below your alert threshold.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "billing.balance_low",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "object": "balance",
        "available": 120,
        "held": 70,
        "threshold": 140
      }
    }
  • ›billing.credits_exhaustedYour live balance reached zero; paid calls now return 402.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "billing.credits_exhausted",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "object": "balance",
        "available": 120,
        "held": 70,
        "threshold": 140
      }
    }
  • ›billing.credits_expiringSome credits expire within the next 30 days.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "billing.credits_expiring",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "object": "balance",
        "available": 120,
        "held": 70,
        "threshold": 140
      }
    }
  • ›billing.auto_recharge_failedAn automatic top-up failed; auto-recharge is paused.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "billing.auto_recharge_failed",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "object": "balance",
        "available": 120,
        "held": 70,
        "threshold": 140
      }
    }

Account

  • ›api_key.expiringAn API key expires within 7 days.
    Payload
    {
      "id": "evt_0vZ3kq9XfJ1mB7c2Lr8sTy",
      "object": "event",
      "type": "api_key.expiring",
      "livemode": true,
      "created_at": "2026-11-05T10:24:51.204Z",
      "data": {
        "id": "key_0vZ3kq9XfJ1mB7c2Lr8sTy",
        "object": "api_key",
        "name": "Production server",
        "expires_at": "2026-12-01T00:00:00Z"
      }
    }

Something missing or unclear? Signed-in users can tell us from Feedback in the app.