API Reference

Get an inquiry

Read the current status, metadata, and optional identity snapshot for an inquiry.

Request

GET/api/v1/customer/inquiries/{inquiryId}

Returns the current lifecycle status and merchant-facing metadata for an inquiry belonging to your tenant. When the status is APPROVED, NEEDS_REVIEW, or FAILED, the response also includes an optional identity snapshot (personal information and extracted ID document data).

Headers and path

NameTypeRequiredDescription
X-Api-KeyheaderRequiredTenant-scoped key with a zk_live_ prefix and 32-character Base64URL secret.
X-Correlation-IdheaderOptionalOptional trace identifier. Zippy generates a UUID when omitted.
inquiryIduuidRequiredCanonical hyphenated UUID returned when the inquiry was opened.

Path validation

inquiryId must match the canonical hyphenated UUID shape. UUID version is not restricted. A malformed value such as inquiry-123 returns 400 HTTP_400.

A valid UUID that does not belong to the API key's tenant returns 404 INQUIRY_NOT_FOUND. This prevents cross-tenant inquiry discovery.

Response

Use this endpoint for inquiry-level state and metadata. Prefer webhooks for decisions and poll this endpoint only as a recovery path. Treat identity as optional: check whether the key is present, then handle nested branches that may still be null.

When identity is present

NameTypeDescription
APPROVEDidentity presentTop-level identity object is included. personalInfo or document may still each be null.
NEEDS_REVIEWidentity presentTop-level identity object is included with the same branch rules as APPROVED.
FAILEDidentity presentTop-level identity object is included with the same branch rules as APPROVED.
Other statusesidentity omittedCREATED, PENDING, COMPLETED, EXPIRED, DECLINED, PURGED, and other values omit the identity key entirely (not returned as null).

200 — mid-flow (no identity)

json
{
  "inquiryId": "96b1f81d-87cd-4a71-8bc4-e2718bcd6097",
  "status": "PENDING",
  "reviewReasons": [],
  "portalDecisionNote": null,
  "portalDecidedAt": null,
  "referenceId": "customer-84721",
  "note": "Verify before enabling withdrawals.",
  "openedAt": "2026-07-18T08:15:30.000Z",
  "expiresAt": "2026-07-19T08:15:30.000Z",
  "inquiryTemplateId": "bf3746ab-4bec-4b99-b0d7-5eb05769ab1e"
}

200 — NEEDS_REVIEW (with identity and addressDetails)

json
{
  "inquiryId": "96b1f81d-87cd-4a71-8bc4-e2718bcd6097",
  "status": "NEEDS_REVIEW",
  "reviewReasons": [
    "Face match confidence is below the automatic approval threshold"
  ],
  "portalDecisionNote": null,
  "portalDecidedAt": null,
  "referenceId": "customer-84721",
  "note": "Verify before enabling withdrawals.",
  "openedAt": "2026-07-18T08:15:30.000Z",
  "expiresAt": "2026-07-19T08:15:30.000Z",
  "inquiryTemplateId": "bf3746ab-4bec-4b99-b0d7-5eb05769ab1e",
  "identity": {
    "personalInfo": {
      "fullName": "Jane Marie Doe",
      "country": "US",
      "email": "jane@example.com",
      "phone": "+14155552671"
    },
    "document": {
      "documentType": "DRIVING_LICENSE",
      "fullName": "Jane Marie Doe",
      "dateOfIssue": "12-01-2020",
      "dateOfBirth": "15-03-1990",
      "dateOfExpiry": "11-01-2030",
      "documentNumber": "D12345678",
      "sex": "F",
      "address": "96 Henry St Fl 1, Hartford, CT, 06114-1736, US",
      "addressDetails": {
        "street": "96 Henry St Fl 1",
        "city": "Hartford",
        "state": "CT",
        "postalCode": "06114-1736",
        "country": "US"
      }
    }
  }
}

200 — APPROVED (with identity and addressDetails)

json
{
  "inquiryId": "96b1f81d-87cd-4a71-8bc4-e2718bcd6097",
  "status": "APPROVED",
  "reviewReasons": [
    "Manual review required: the name on the identity document does not match the name entered in personal info."
  ],
  "portalDecisionNote": "Looks good",
  "portalDecidedAt": "2026-07-18T09:00:00.000Z",
  "referenceId": "customer-84721",
  "note": "Verify before enabling withdrawals.",
  "openedAt": "2026-07-18T08:15:30.000Z",
  "expiresAt": "2026-07-19T08:15:30.000Z",
  "inquiryTemplateId": "bf3746ab-4bec-4b99-b0d7-5eb05769ab1e",
  "identity": {
    "personalInfo": {
      "fullName": "Jane Marie Doe",
      "country": "US",
      "email": "jane@example.com",
      "phone": "+14155552671"
    },
    "document": {
      "documentType": "DRIVING_LICENSE",
      "fullName": "Jane Marie Doe",
      "dateOfIssue": "12-01-2020",
      "dateOfBirth": "15-03-1990",
      "dateOfExpiry": "11-01-2030",
      "documentNumber": "D12345678",
      "sex": "F",
      "address": "96 Henry St Fl 1, Hartford, CT, 06114-1736, US",
      "addressDetails": {
        "street": "96 Henry St Fl 1",
        "city": "Hartford",
        "state": "CT",
        "postalCode": "06114-1736",
        "country": "US"
      }
    }
  }
}

Top-level response fields

NameTypeDescription
inquiryIduuidIdentifier used by subsequent inquiry requests.
statusenumCurrent inquiry lifecycle status.
reviewReasonsstring[]Why the inquiry needed manual review. Retained after a later portal approve or decline. Empty array or missing means none stored.
portalDecisionNotestring | nullNote from the latest portal approve or decline.
portalDecidedAtdate-time | nullUTC timestamp of the latest portal decision.
referenceIdstring | nullMerchant-provided reference.
notestring | nullMerchant-provided internal note.
openedAtdate-timeInquiry creation timestamp.
expiresAtdate-timeInquiry lifetime expiry.
inquiryTemplateIduuidTemplate pinned to this inquiry.
identityobjectPersonal info and extracted document data. Present only when status is APPROVED, NEEDS_REVIEW, or FAILED. Omitted for all other statuses.

Identity snapshot

When present, identity has two branches. Each may be null if that step never completed successfully.

identity

NameTypeDescription
personalInfoobject | nullLatest successful personal-information step. Null when personal info was never completed successfully.
documentobject | nullExtracted fields from the latest successful ID scan (passport, national ID, or driving licence). Null when no successful ID scan exists.

identity.personalInfo

NameTypeDescription
fullNamestringCustomer-submitted full name.
countrystringISO 3166-1 alpha-2 country code (for example "US" or "IN").
emailstring | nullWhen collected by the template; otherwise null.
phonestring | nullE.164 phone number when collected; otherwise null.

identity.document

NameTypeDescription
documentTypeenumPASSPORT, NATIONAL_ID, or DRIVING_LICENSE.
fullNamestring | nullName read from the document. Field name is fullName (not name).
dateOfIssuestring | nullIssue date. Prefer DD-MM-YYYY when parseable; may not be ISO-8601.
dateOfBirthstring | nullDate of birth. Prefer DD-MM-YYYY when parseable; may not be ISO-8601.
dateOfExpirystring | nullExpiry date. Prefer DD-MM-YYYY when parseable; may not be ISO-8601.
documentNumberstring | nullDocument, passport, or licence number.
sexstring | nullSex or gender marker when present (for example "M" or "F").
addressstring | nullDisplay address line built by Zippy (see address rules below).
addressDetailsobject | nullStructured address from the document when components are available.

identity.document.addressDetails

NameTypeDescription
streetstring | nullStreet line from the document.
citystring | nullCity from the document.
statestring | nullState or region from the document.
postalCodestring | nullPostal or ZIP code from the document.
countrystring | nullCountry text or code from the document (not necessarily the same as personalInfo.country).

document.address is a response-only helper and does not change stored document data:

  1. Prefer free-text document address when non-empty.
  2. Otherwise join non-empty addressDetails parts with ", ": street, city, state, postalCode, country.
  3. If nothing usable is available, address is null.

200 — APPROVED (with identity and addressDetails)

json
{
  "inquiryId": "96b1f81d-87cd-4a71-8bc4-e2718bcd6097",
  "status": "APPROVED",
  "reviewReasons": [
    "Manual review required: the name on the identity document does not match the name entered in personal info."
  ],
  "portalDecisionNote": "Looks good",
  "portalDecidedAt": "2026-07-18T09:00:00.000Z",
  "referenceId": "customer-84721",
  "note": "Verify before enabling withdrawals.",
  "openedAt": "2026-07-18T08:15:30.000Z",
  "expiresAt": "2026-07-19T08:15:30.000Z",
  "inquiryTemplateId": "bf3746ab-4bec-4b99-b0d7-5eb05769ab1e",
  "identity": {
    "personalInfo": {
      "fullName": "Jane Marie Doe",
      "country": "US",
      "email": "jane@example.com",
      "phone": "+14155552671"
    },
    "document": {
      "documentType": "DRIVING_LICENSE",
      "fullName": "Jane Marie Doe",
      "dateOfIssue": "12-01-2020",
      "dateOfBirth": "15-03-1990",
      "dateOfExpiry": "11-01-2030",
      "documentNumber": "D12345678",
      "sex": "F",
      "address": "96 Henry St Fl 1, Hartford, CT, 06114-1736, US",
      "addressDetails": {
        "street": "96 Henry St Fl 1",
        "city": "Hartford",
        "state": "CT",
        "postalCode": "06114-1736",
        "country": "US"
      }
    }
  }
}

Status values

Status values

NameTypeDescription
CREATEDactiveInquiry is open, but verification has not started.
PENDINGactiveCustomer verification is in progress.
COMPLETEDtransitionalConfigured checks finished and the decision policy is being applied.
NEEDS_REVIEWreviewAn operator must complete manual review. identity is included when available; document image URLs can be retrieved.
APPROVEDterminalInquiry was approved. identity is included when available; documents can be retrieved.
DECLINEDterminalInquiry was declined. identity is not included.
FAILEDterminalVerification reached a hard failure or attempt limit. identity is included when available.
EXPIREDterminalInquiry lifetime elapsed before approval.
PURGEDterminalInquiry data was removed through a purge action.

Errors

NameTypeDescription
400Bad RequestinquiryId is not a canonical UUID.
401UnauthorizedMissing, invalid, expired, or revoked API key.
404Not FoundInquiry does not exist or is outside the key's tenant.
429Too Many RequestsRate limit exceeded. Retry after the Retry-After duration.