---
title: "Qualify a business lead or counterparty from a form submission or outreach"
method: POST
path: "/v1/qualify"
tags: ["qualify"]
---

# Qualify a business lead or counterparty from a form submission or outreach

`POST /v1/qualify`

## Request

- Base URL: `https://jid.com`
- URL: `https://jid.com/v1/qualify`
- Auth: HTTP bearer

API key required; counts as 2 checks. Checks the domain (MX, SPF, DMARC, RDAP registration date, one website fetch), matches it to a Jid file and reads the file's standing, licences, filings, capital raises, loans and adverse records. Returns signals with sources, legitimacy/capacity/consistency scores (0 to 100, with reasons), a recommendation, a next step, questions to ask, checks and a read (headline, engage | verify_first | do_not_engage, failed checks, lookup links: render the read for humans), and a signed receipt. Businesses only: personal webmail, a disposable address or no confident business match returns assessment individual_or_unverified with no scores. A possible list match is effect review, never a finding. The raw message is hashed and never stored unless retain is true. Not for credit, employment, insurance or housing decisions about individuals.

## Request body

- union
  - object
    - `email` string, required
    - `domain` string
    - `company_name` string
    - `context` object
      - `form_type` 'seller_application' | 'acquisition_inquiry' | 'buyer_registration' | 'nda_request' | 'sourcing_request' | 'listing_request' | 'consultation' | 'partnership' | 'contact' | 'other' | 'vendor_claim' | 'listing_claim' | 'sponsor_inquiry' | 'advertiser' | 'broker_request' | 'buyer_inquiry' | 'seller_inquiry' | 'data_purchase'
      - `message` string
      - `stated_value` number: USD
      - `stated_role` 'buyer' | 'seller' | 'supplier' | 'investor' | 'operator'
      - `country` string
      - `activity` 'general_commerce' | 'sell_prescription_drugs' | 'manufacture_drugs' | 'sell_medical_devices' | 'haul_freight' | 'broker_freight' | 'sell_alcohol' | 'produce_spirits' | 'provide_investment_advice' | 'accept_deposits' | 'lend' | 'bill_medicare_medicaid' | 'healthcare_supplier' | 'federal_contracting' | 'charitable_solicitation' | 'construction' | 'operate_psilocybin_healing_center'
      - `claimed_website` string: vendor_claim / listing_claim: the website of the business or listing being claimed. Enables the affiliation check.
      - `stated_location` string: The place or market the sender stated ("Jakarta"): shown on read.sender, never stored
    - `ip_country` string: Location check: country of the request (e.g. x-vercel-ip-country). Stored.
    - `ip_region` string: Location check: ISO 3166-2 region of the request (US-CA or CA). Stored.
    - `ip_city` string: Accepted, not compared, not stored, not returned
    - `ip_asn` integer: Location check: ASN of the request's network (hosting/VPN recognition). Not stored.
    - `browser_timezone` string: Location check: IANA time zone from the browser. Compared, not stored.
    - `stated_country` string: Location check: the country the submitter stated (same as context.country; either may be sent)
    - `ip` string: Optional raw IP: used in memory for the Tor and network lookups (Jid's Tor and GeoLite2 copies; IPinfo when enabled). Never stored, hashed or returned.
    - `phone` string: Optional business phone: validity and country code (compared with the location), in memory only, never stored
    - `signal` string: Jid Signals token from the visitor's browser (the jid_signal form field set by https://jid.com/s/1.js; jid_signal is also accepted). When it verifies, its country, region, city, network type and time zone replace the ip_* fields and browser_timezone. Expired, altered or other-site tokens are skipped, never negative. See /signals.
    - `site` string: The submitting website's domain. Binds the signal token loosely: a token issued to another site is skipped.
    - `summary` boolean: Add a short summary written only from the signals.
    - `policy` 'strict' | 'balanced' | 'permissive': How cautious `engage` is. Default balanced.
    - `retain` boolean: Opt in to keeping the message with the result for 13 months (default: hash only, 30 days).
  - object
    - `email` string
    - `domain` string, required
    - `company_name` string
    - `context` object
      - `form_type` 'seller_application' | 'acquisition_inquiry' | 'buyer_registration' | 'nda_request' | 'sourcing_request' | 'listing_request' | 'consultation' | 'partnership' | 'contact' | 'other' | 'vendor_claim' | 'listing_claim' | 'sponsor_inquiry' | 'advertiser' | 'broker_request' | 'buyer_inquiry' | 'seller_inquiry' | 'data_purchase'
      - `message` string
      - `stated_value` number: USD
      - `stated_role` 'buyer' | 'seller' | 'supplier' | 'investor' | 'operator'
      - `country` string
      - `activity` 'general_commerce' | 'sell_prescription_drugs' | 'manufacture_drugs' | 'sell_medical_devices' | 'haul_freight' | 'broker_freight' | 'sell_alcohol' | 'produce_spirits' | 'provide_investment_advice' | 'accept_deposits' | 'lend' | 'bill_medicare_medicaid' | 'healthcare_supplier' | 'federal_contracting' | 'charitable_solicitation' | 'construction' | 'operate_psilocybin_healing_center'
      - `claimed_website` string: vendor_claim / listing_claim: the website of the business or listing being claimed. Enables the affiliation check.
      - `stated_location` string: The place or market the sender stated ("Jakarta"): shown on read.sender, never stored
    - `ip_country` string: Location check: country of the request (e.g. x-vercel-ip-country). Stored.
    - `ip_region` string: Location check: ISO 3166-2 region of the request (US-CA or CA). Stored.
    - `ip_city` string: Accepted, not compared, not stored, not returned
    - `ip_asn` integer: Location check: ASN of the request's network (hosting/VPN recognition). Not stored.
    - `browser_timezone` string: Location check: IANA time zone from the browser. Compared, not stored.
    - `stated_country` string: Location check: the country the submitter stated (same as context.country; either may be sent)
    - `ip` string: Optional raw IP: used in memory for the Tor and network lookups (Jid's Tor and GeoLite2 copies; IPinfo when enabled). Never stored, hashed or returned.
    - `phone` string: Optional business phone: validity and country code (compared with the location), in memory only, never stored
    - `signal` string: Jid Signals token from the visitor's browser (the jid_signal form field set by https://jid.com/s/1.js; jid_signal is also accepted). When it verifies, its country, region, city, network type and time zone replace the ip_* fields and browser_timezone. Expired, altered or other-site tokens are skipped, never negative. See /signals.
    - `site` string: The submitting website's domain. Binds the signal token loosely: a token issued to another site is skipped.
    - `summary` boolean: Add a short summary written only from the signals.
    - `policy` 'strict' | 'balanced' | 'permissive': How cautious `engage` is. Default balanced.
    - `retain` boolean: Opt in to keeping the message with the result for 13 months (default: hash only, 30 days).

## Response `200`

Qualification

- Qualification
  - `id` string
  - `assessment` 'business' | 'individual_or_unverified'
  - `entity` object, nullable
    - `id` string
    - `name` string
    - `confidence` 'high' | 'medium' | 'low'
    - `method` string
    - `relied_on` boolean
    - `url` string
  - `signals` object[]
    - `name` string
    - `label` string
    - `value` unknown
    - `effect` '+' | '-' | 'neutral' | 'review'
    - `detail` string
    - `source` string
    - `source_url` string, nullable
    - `verified_at` string, nullable
  - `legitimacy` SubScore
    - `score` integer, nullable: null when assessment is individual_or_unverified
    - `reasons` object[]
      - `text` string
      - `points` number
  - `capacity` SubScore
    - `score` integer, nullable: null when assessment is individual_or_unverified
    - `reasons` object[]
      - `text` string
      - `points` number
  - `consistency` SubScore
    - `score` integer, nullable: null when assessment is individual_or_unverified
    - `reasons` object[]
      - `text` string
      - `points` number
  - `recommendation` 'fast_track' | 'standard' | 'verify_first' | 'low_priority'
  - `engage` boolean: Binary answer from the shared screen rules (same as /v1/screen) under `policy`. Advisory.
  - `risk` 'low' | 'medium' | 'high' | 'unknown'
  - `mitigations` object[]
    - `code` string
    - `text` string
  - `engage_policy` 'strict' | 'balanced' | 'permissive'
  - `suggested_next_step` string
  - `questions_to_ask` string[]
  - `checks` Check[]
    - `id` string: Stable id: registered, sanctions, threat_feeds, email_address, mail_domain, domain_age, website, affiliation, adverse_records, licence, phone, location, enquiry, funding, complaints, lookalike_domain, email_auth, history
    - `label` string
    - `group` 'identity' | 'legitimacy' | 'safety' | 'location' | 'capacity' | 'history'
    - `status` 'pass' | 'fail' | 'unknown' | 'na'
    - `severity` 'block' | 'warn' | 'info': What a fail means: block = do not engage, warn = verify first, info = never changes the recommendation
    - `evidence` string
    - `lookup` object
      - `label` string
      - `url` string
    - `phrase` string
  - `read` Read: What to show a human: render this and nothing else.
    - `headline` string
    - `recommendation` 'engage' | 'verify_first' | 'do_not_engage'
    - `passed` integer
    - `total` integer: Checks that ran (status pass or fail) and decide (severity block or warn), plus location consistency, which is counted but never decides
    - `reason` string: Why a read with no registry match is not engage, e.g. "Not found on the registers Jid checks for Indonesia (LEI records only)". Also in the headline, followed by ", so: verify first".
    - `not_checked` string[]: Labels of deciding checks that did not run or did not finish
    - `sender` string: Qualify only, response only (never stored): the Jid Signals location next to the stated place and the company domain's age
    - `failed` object[]
      - `label` string
      - `evidence` string
      - `lookup` object
    - `lookups` object[]
      - `label` string
      - `url` string
    - `file_url` string
    - `subject` string, nullable
  - `website_declared` WebsiteDeclared: What a company's own website states about itself (provenance tier website_declared): identity context only, never a registry result. Present only when no Jid file holds or is associated with the domain.
    - `tier` 'website_declared'
    - `domain` string
    - `legal_name` string: As printed, with its legal form
    - `trade_name` string, nullable
    - `address` string, nullable: As printed; null when the site prints addresses in several states
    - `state` string, nullable
    - `postal_code` string, nullable
    - `source_url` string
    - `read_at` string, date-time
    - `how` string
    - `note` string
  - `outcome_links` OutcomeLinks: Keyed calls only: signed one-click URLs that record an outcome (POST /v1/outcomes) without a login.
    - `legit` string
    - `sales_pitch` string
    - `spam` string
    - `scam` string
    - `closed` string
    - `good` string: 2026-10-05 button, still accepted
    - `junk` string: 2026-10-05 button, still accepted
  - `affiliation` object, nullable: Claims only: does the address's domain match the claimed business (same domain, a registry domain of the business, or a link between the two websites)? A mismatch means manual review, never rejection.
    - `status` 'matched' | 'mismatched' | 'unknown'
    - `email_domain` string, nullable
    - `claimed_domain` string, nullable
    - `evidence` object[]
      - `text` string
      - `source` string
      - `source_url` string, nullable
  - `location` object, nullable: Present when location inputs were given: the same block as /v1/screen. A mismatch, Tor exit or hosting/VPN network adds risk only alongside another negative signal and never sets engage=false on its own. Jid keeps only ip_country, ip_region, network type and consistent.
    - `consistent` union: true, false or "unknown"
      - boolean
      - string
    - `reference` object, nullable
    - `signals` object[]
    - `network` object
      - `type` 'tor' | 'hosting_or_vpn' | 'other' | 'unknown'
      - `asn` integer, nullable
      - `source` string
    - `detail` string
  - `summary` string, nullable
  - `rules_version` string
  - `receipt` Receipt
    - `receipt_id` string
    - `url` string
    - `statement` object: Exactly what was signed: type, version, receipt_id, issued_at, issuer, entity, inputs, decision, rules_version, reasons (code, met, effect, fact_ids, source, verified_at, fresh_until), facts (id, predicate, source, value_sha256, verified_at), terms.
    - `signature` object
      - `alg` 'Ed25519'
      - `kid` string
      - `canonicalization` 'sorted-keys-json'
      - `sig` string: base64url
    - `verify` string
  - `retention` object
    - `result_until` string
    - `message_stored` boolean
  - `checks_used` integer

## Other responses

- `400`: Error
- `401`: Error
- `402`: Error
- `429`: Error

---

[API](https://skmtc.dev/jid/apis/jid-api.md) · [All operations](https://skmtc.dev/jid/apis/jid-api/llms.txt) · [OpenAPI document](https://skmtc.dev/jid/apis/jid-api/revisions/453a19ce3d5d?raw)
