Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: Jid Screen API
version: 1.3.0
summary: The trust API for AI agents.
description: 'Before an agent pays, signs, books, hires or buys, Jid checks the business it is dealing with: real, active, licensed for this activity, not sanctioned, with the receipts. Every fact is cited to the registry that issued it. Decisions apply the published rules (https://jid.com/decision-rules, version 2026-10-15.1) and are not legal advice. No key: 10 requests a minute and 100 a day per IP. A free key (no card) includes 1,000 checks a month. Business information only; not a consumer report and not for FCRA purposes.'
termsOfService: https://jid.com/api-terms
contact:
name: Jid
email: hello@jid.com
url: https://jid.com
servers:
- url: https://jid.com
security:
- {}
- bearer: []
tags:
- name: screen
description: 'Engage or not: a fast, deterministic answer for a lead, sender, vendor or website'
paths:
/v1/screen:
get:
tags:
- screen
operationId: screenGet
summary: Should you engage? (query parameters)
description: Same as POST /v1/screen, with the fields as query parameters.
parameters:
- name: domain
in: query
required: false
schema:
type: string
- name: url
in: query
required: false
schema:
type: string
- name: email
in: query
required: false
schema:
type: string
- name: phone
in: query
required: false
schema:
type: string
- name: company_name
in: query
required: false
schema:
type: string
- name: name
in: query
required: false
schema:
type: string
- name: context
in: query
required: false
schema:
type: string
- name: policy
in: query
required: false
schema:
type: string
- name: amount
in: query
required: false
schema:
type: number
- name: country
in: query
required: false
schema:
type: string
- name: ip_country
in: query
required: false
schema:
type: string
- name: ip_region
in: query
required: false
schema:
type: string
- name: ip_asn
in: query
required: false
schema:
type: string
- name: browser_timezone
in: query
required: false
schema:
type: string
- name: stated_country
in: query
required: false
schema:
type: string
- name: signal
in: query
required: false
schema:
type: string
- name: site
in: query
required: false
schema:
type: string
responses:
'200':
description: Screen result
content:
application/json:
schema:
$ref: '#/components/schemas/ScreenResult'
'400':
$ref: '#/components/responses/Error'
'402':
$ref: '#/components/responses/Error'
'429':
$ref: '#/components/responses/Error'
post:
tags:
- screen
operationId: screen
summary: Should you engage? A fast, deterministic engage-or-not answer
description: 'No key: free tier (rate-limited per IP). With a key: 1 check. No AI in the decision. Pass any of domain, url, email, phone or company_name; the context; an amount; a policy. Returns engage (true/false), risk, confidence, subject_type, reasons with sources, mitigations, checks, a read (headline, engage | verify_first | do_not_engage, failed checks, lookup links: render the read for humans), the matched Jid file and a signed receipt. Hard rules (engage=false under every policy): confirmed exclusion, possible sanctions or export-list name match (manual review, never a finding), registry hard failure, phishing or malware listing, disposable e-mail, domain with no MX and no website, domain under 30 days old with an amount of $1,000 or more, and (strict only) an affiliation mismatch. Individuals get technical signals only. engage is advisory. Rules version 2026-10-05.2: https://jid.com/screen-rules'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
domain:
type: string
maxLength: 253
url:
type: string
maxLength: 2000
description: Only the host is used.
email:
type: string
maxLength: 254
phone:
type: string
maxLength: 40
description: Ideally +E.164.
company_name:
type: string
maxLength: 200
name:
type: string
maxLength: 200
description: 'A person''s name: accepted, never looked up.'
context:
type: string
enum:
- lead
- inbound_email
- partnership
- vendor
- purchase
- marketplace_seller
- agent_action
description: Default lead, or purchase when only a url or domain is given.
policy:
type: string
enum:
- strict
- balanced
- permissive
default: balanced
amount:
type: number
minimum: 0
description: USD at stake
country:
type: string
pattern: ^[A-Z]{2}$
description: Default country for a phone number without +
retain:
type: boolean
description: Keep the receipt 13 months instead of 30 days
ip_country:
type: string
pattern: ^[A-Z]{2}$
description: 'Location check: country of the request (e.g. x-vercel-ip-country)'
ip_region:
type: string
description: 'Location check: ISO 3166-2 region of the request'
ip_city:
type: string
description: Accepted, not compared, not stored
ip_asn:
type: integer
description: 'Location check: ASN of the request''s network (hosting/VPN recognition)'
ip:
type: string
description: 'Optional raw IP: used in memory for the Tor and ASN lookups only, never stored or returned'
browser_timezone:
type: string
description: 'Location check: IANA time zone from the browser'
stated_country:
type: string
pattern: ^[A-Z]{2}$
description: 'Location check: the country the counterparty stated'
signal:
type: string
description: 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:
type: string
description: 'The submitting website''s domain. Binds the signal token loosely: a token issued to another site is skipped.'
responses:
'200':
description: Screen result
content:
application/json:
schema:
$ref: '#/components/schemas/ScreenResult'
'400':
$ref: '#/components/responses/Error'
'402':
$ref: '#/components/responses/Error'
'429':
$ref: '#/components/responses/Error'
/v1/email-check:
post:
tags:
- screen
operationId: emailCheck
summary: Is this e-mail really from who it says? (raw headers in, checks and read out)
description: 'No key: free tier (rate-limited per IP). With a key: 1 check. Reads the receiving server''s Authentication-Results (SPF, DKIM, DMARC), Received-SPF, DKIM alignment with From, Reply-To vs From, and whether the From domain or a business display name imitates a known company''s registered domain. Returns checks and a read (headline, engage | verify_first | do_not_engage, failed checks, lookup links), the From and Reply-To domains and the authentication results. The headers are processed in memory and never stored. Deterministic, no AI.'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- headers
properties:
headers:
type: string
maxLength: 65536
description: The raw message headers (Show original / View source); the body is not needed.
responses:
'200':
description: Checks and read
content:
application/json:
schema:
type: object
'400':
$ref: '#/components/responses/Error'
'402':
$ref: '#/components/responses/Error'
'429':
$ref: '#/components/responses/Error'
components:
schemas:
OutcomeLinks:
type: object
description: 'Keyed calls only: signed one-click URLs that record an outcome (POST /v1/outcomes) without a login.'
properties:
legit:
type: string
sales_pitch:
type: string
spam:
type: string
scam:
type: string
closed:
type: string
good:
type: string
description: 2026-10-05 button, still accepted
junk:
type: string
description: 2026-10-05 button, still accepted
ScreenResult:
type: object
properties:
engage:
type: boolean
risk:
type: string
enum:
- low
- medium
- high
- unknown
confidence:
type: number
minimum: 0
maximum: 1
subject_type:
type: string
enum:
- business
- individual_or_unverified
- website
summary:
type: string
hard_rules:
type: array
items:
type: string
risk_points:
type: number
reasons:
type: array
items:
type: object
properties:
code:
type: string
kind:
type: string
enum:
- hard
- negative
- positive
- info
- skipped
points:
type: number
text:
type: string
source:
type: string
source_url:
type:
- string
- 'null'
checked_at:
type:
- string
- 'null'
mitigations:
type: array
items:
type: object
properties:
code:
type: string
text:
type: string
entity:
type:
- object
- 'null'
properties:
id:
type: string
name:
type: string
url:
type: string
match_confidence:
type: string
relied_on:
type: boolean
checks:
type: array
items:
$ref: '#/components/schemas/Check'
read:
$ref: '#/components/schemas/Read'
website_declared:
oneOf:
- $ref: '#/components/schemas/WebsiteDeclared'
- type: 'null'
outcome_links:
$ref: '#/components/schemas/OutcomeLinks'
check_runs:
type: object
description: Which live lookups ran (this was `checks` before 2026-10-05).
additionalProperties:
type: string
enum:
- done
- cached
- skipped
- not_applicable
- failed
receipt_id:
type: string
receipt_url:
type: string
rules_version:
type: string
latency_ms:
type: number
checks_used:
type: number
location:
type: object
description: Present when location inputs were given
properties:
consistent:
type:
- boolean
- string
description: true, false or "unknown"
reference:
type:
- object
- 'null'
signals:
type: array
items:
type: object
network:
type: object
properties:
type:
type: string
enum:
- tor
- hosting_or_vpn
- other
- unknown
asn:
type:
- integer
- 'null'
source:
type: string
detail:
type: string
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
required:
- code
- message
WebsiteDeclared:
type: object
description: '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.'
properties:
tier:
type: string
enum:
- website_declared
domain:
type: string
legal_name:
type: string
description: As printed, with its legal form
trade_name:
type:
- string
- 'null'
address:
type:
- string
- 'null'
description: As printed; null when the site prints addresses in several states
state:
type:
- string
- 'null'
postal_code:
type:
- string
- 'null'
source_url:
type: string
read_at:
type: string
format: date-time
how:
type: string
note:
type: string
Check:
type: object
description: One check from the registry. New checks add rows, never fields.
properties:
id:
type: string
description: '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:
type: string
group:
type: string
enum:
- identity
- legitimacy
- safety
- location
- capacity
- history
status:
type: string
enum:
- pass
- fail
- unknown
- na
severity:
type: string
enum:
- block
- warn
- info
description: 'What a fail means: block = do not engage, warn = verify first, info = never changes the recommendation'
evidence:
type: string
lookup:
type: object
properties:
label:
type: string
url:
type: string
phrase:
type: string
Read:
type: object
description: 'What to show a human: render this and nothing else.'
properties:
headline:
type: string
examples:
- 'Passed all 7 checks Jid could run. Recommendation: engage.'
- 'Passed 6 of 7 checks Jid could run: sanctions failed. Recommendation: do not engage.'
- 'Passed all 9 checks Jid could run. Not in an official registry Jid covers (Indonesia), so: verify first.'
recommendation:
type: string
enum:
- engage
- verify_first
- do_not_engage
passed:
type: integer
total:
type: integer
description: Checks that ran (status pass or fail) and decide (severity block or warn), plus location consistency, which is counted but never decides
reason:
type: string
description: '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:
type: array
maxItems: 4
items:
type: string
description: Labels of deciding checks that did not run or did not finish
sender:
type: string
description: 'Qualify only, response only (never stored): the Jid Signals location next to the stated place and the company domain''s age'
failed:
type: array
maxItems: 3
items:
type: object
properties:
label:
type: string
evidence:
type: string
lookup:
type: object
lookups:
type: array
maxItems: 4
items:
type: object
properties:
label:
type: string
url:
type: string
file_url:
type: string
subject:
type:
- string
- 'null'
responses:
Error:
description: Error
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
bearer:
type: http
scheme: bearer
description: 'jid_live_... key from https://jid.com/pricing (free key: no card).'
externalDocs:
description: API reference
url: https://jid.com/api-docs