Peritus
Cited, dated, replayable

Cited facts about the world, for AI agents

Sanctions, travel advisories, and hazards, each with its source and its date. When the record can't answer, your agent is told why.

Fig. 01 - The known world, with sources[n] Every fact carries its source, its dates and its tier.

Read from the publishers

active_sources
19
Sources whose status is active: captured on schedule and served. · generated 2026-10-30 02:30 UTC
served_sources
19
Sources a caller without a key may see: active, degraded, unavailable, and discontinued. Internal-only and disabled sources are not counted. · generated 2026-10-30 02:30 UTC
fields
20
Fields holding at least one current fact that a caller without a key may see: broad mode, no attestations. · generated 2026-10-30 02:30 UTC
countries
509
Country entities holding at least one current fact that a caller without a key may see, counted per source entity until the reference layer. · generated 2026-10-30 02:30 UTC
current_facts
283,579
Current facts a caller without a key may see: broad mode, no attestations, served sources only. · generated 2026-10-30 02:30 UTC
How it works

Your agent asks. The record answers.

Peritus fetches and stores publisher records, then answers agents with cited facts. When a field is missing, an agent can request it.

Use cases

01POST /v1/ask

Ask anything about a country, a counterparty, or a rule

Ask in plain words. The answer comes back as sentences, each tied to the facts it rests on, with the plan that was run.

Sample responseGET /v1/samples/ask
resp_06GR5VVKH9TSQAMANY5B2VQ7R4
agent → POST /v1/ask{"question":"Is OFAC UID 3751 sanctioned?","mode":"standard"}
answer.sentences · template · templates/v1

MOA NICKEL SA is listed on SDN List (OFAC Sanctions List Service (SDN and Consolidated non-SDN lists)). Citation 1

MOA NICKEL SA is listed under program CUBA on SDN List. Citation 2

MOA NICKEL SA is listed under program CUBA-EO14404 on SDN List. Citation 3

  1. [1]OFAC Sanctions List Service (SDN and Consolidated non-SDN lists)sanctions.listing_status · verified · valid from 1995-05-23
  2. [2]OFAC Sanctions List Service (SDN and Consolidated non-SDN lists)sanctions.program · verified · valid from 2026-10-21
  3. [3]OFAC Sanctions List Service (SDN and Consolidated non-SDN lists)sanctions.program · verified · valid from 2026-10-21

AttributionU.S. Department of the Treasury, Office of Foreign Assets Control (OFAC), Sanctions List Service

Fig. 02Sample response, GET /v1/samples/ask, shown as returned.
02POST /v1/facts:fetch

Cited facts, as of any date

Fetch named fields for an entity, now or as of a date. Each value carries its source, the passage it was read from, when it held, and when it was recorded.

Sample responseGET /v1/samples/fetch
resp_06GR5VVKG1VK1FDZBRNXMBAYG8
agent → POST /v1/facts:fetch{"references":[{"identifier":{"scheme":"ofac_uid","value":"3751"}}],"fields":["sanctions.listing_status","sanctions.program"],"mode":"standard"}

MOA NICKEL SA

ent_06GR5VVHPDW2Q1HYD75X1W4YNM · org · sanctions.listing_status

Tier verifiedClaim type fact
list
SDN List
status
listed
measures
Block
legal_bases
Cuban Assets Control Regulations (CACR)Executive Order 14404 (Cuba)
Valid timeFrom 1995-05-23, no end dateDay precision
Recorded time2026-10-28 14:33 UTCWhen Peritus knew it

AttributionU.S. Department of the Treasury, Office of Foreign Assets Control (OFAC), Sanctions List Service

Fig. 03Sample response, GET /v1/samples/fetch, shown as returned.
03POST /v1/entities:resolve

From a name to the right entity

Resolve a name or an identifier to an entity. Each candidate says how it matched, and a name-only match stays ambiguous until you pass an identifier or choose.

Sample responseGET /v1/samples/resolve
resp_06GR5VVKGNXB145ZZQT7PXWW3C
agent → POST /v1/entities:resolve{"mentions":[{"text":"MOA NICKEL","kind":"org"},{"identifier":{"scheme":"ofac_uid","value":"3751"}}]}
mention · text "MOA NICKEL" · kind orgresolved · ambiguous · NAME_ONLY_MATCH
MOA NICKEL SAent_06GR5VVHPDW2Q1HYD75X1W4YNM
basis
fuzzy_name
matched
moa, nickel
score
1
score_is_calibrated
false
query_coverage
1

AttributionU.S. Department of the Treasury, Office of Foreign Assets Control (OFAC), Sanctions List Service

Fig. 04Sample response, GET /v1/samples/resolve, shown as returned.
04POST /v1/entities:enrich

A country with its context

Enrich an entity with a bundle of parts in one call, each part cited. A part that cannot be served says why, and the rest still arrive.

Sample responseGET /v1/samples/enrich
resp_06GR5VVKKXTVFDXP6XNN43EFDM
agent → POST /v1/entities:enrich{"reference":{"identifier":{"scheme":"ofac_uid","value":"3751"}},"mode":"standard"}
MOA NICKEL SAstatus · partial
sanctions_exposureok
identityok
Abstained: STALESOURCE_UNREADABLE · sanctions.identifier
Ask again after the source's next successful fetch, or use standard mode to see the value labeled with its freshness.

AttributionU.S. Department of the Treasury, Office of Foreign Assets Control (OFAC), Sanctions List Service

Fig. 05Sample response, GET /v1/samples/enrich, shown as returned.
05POST /v1/search

Find what matches

Search by field and value. Results come back with the entities that matched, the facts they matched on, and a cursor for the next page.

Sample responseGET /v1/samples/search
resp_06GR5VVKMXZCQ1JVJEP66BJTDW
agent → POST /v1/search{"filter":{"field":"sanctions.program","key":"program","op":"eq","value":"CUBA-EO14404"},"mode":"standard"}
entities · 1
MOA NICKEL SAmatched_on · sanctions.program
next_cursor · ""total · null

AttributionU.S. Department of the Treasury, Office of Foreign Assets Control (OFAC), Sanctions List Service

Fig. 06Sample response, GET /v1/samples/search, shown as returned.
06GET /v1/changes and POST /v1/compare

What changed, and why

Follow the change feed, each change with its cause. Keep the response_id of an answer you rely on, and compare tells you later what changed since.

Sample responseGET /v1/samples/changes and /compare
resp_06GR5VVKQ1Z2K8TV3J6JX6JZ0M
agent → GET /v1/changes?limit=3
events · 3 · MOA NICKEL SA
added · sanctions.aliascause · SOURCE_CHANGED
occurred_at 2026-10-28T14:33:52.635305Z · effective_at null
added · sanctions.listing_datecause · SOURCE_CHANGED
occurred_at 2026-10-28T14:33:52.635305Z · effective_at 1995-05-23T00:00:00Z
added · sanctions.listing_statuscause · SOURCE_CHANGED
occurred_at 2026-10-28T14:33:52.635305Z · effective_at 1995-05-23T00:00:00Z
comparePOST /v1/compare on resp_06GR5VVKG1VK1FDZBRNXMBAYG8 · no differences since

AttributionU.S. Department of the Treasury, Office of Foreign Assets Control (OFAC), Sanctions List Service

Fig. 07Sample response, GET /v1/samples/changes and /compare, shown as returned.
07POST /v1/field-requests

Missing data becomes a build

When a field is not in the catalog, request it. The request gets an ID and a status you can track as it is matched, queued, and built.

Sample responseGET /v1/samples/field_requests
freq_06GR5VVKPHW071265X3SWEEW88
agent → POST /v1/field-requests{"request":"Whether the Paso Canoas border crossing is open"}
freq_06GR5VVKPHW071265X3SWEEW88status · queued
Whether the Paso Canoas border crossing is open
matched_field
null
similarity
0.08695652335882187
created_at
2026-10-28T14:34:53.236618Z
updated_at
2026-10-28T14:34:53.236618Z
Fig. 08Sample response, GET /v1/samples/field_requests, shown as returned.
08none

Silence is never an answer

When the record cannot answer, the response says so with a typed code, what was checked, and what would resolve it. It is a normal result, not an error.

Sample responseGET /v1/samples/abstention_not_covered
resp_06GR5VVKP5VT59M8SJ3X1P77XR
agent → POST /v1/ask{"question":"What is the tariff on HTS code 8413.70.20?","mode":"standard"}
Abstained: NOT_COVEREDNO_SUCH_FIELD

hts 8413.70.20tariff.base_rate

What was checked
CheckNoteResult
coveragenot covered: NO_SUCH_FIELDfailed

ResolutionAsk for a field in the catalog.

Fig. 09Sample response, GET /v1/samples/abstention_not_covered, shown as returned.
What we won't say

A missing answer is an answer.

When the record can't support an answer, the response names the reason, what was checked, and what would resolve it. Three recorded responses:

Abstained: STALECALLER_MAX_AGE

Data is older than the caller or the source allows.

agent → POST /v1/facts:fetch{"references":[{"identifier":{"scheme":"ofac_uid","value":"3751"}}],"fields":["sanctions.listing_status"],"mode":"standard","max_age_seconds":1}
Checked
  • coveragefield, entity, source, and time range coveredpassed
  • subjectone entitypassed
  • timetime specification resolvedpassed
  • freshnesslast verified 1m0.590493s ago; max_age is 1sfailed
Resolution hintRaise max_age, or ask again after the source's next verification.
Sample response · GET /v1/samples/abstention_stale · resp_06GR5VVKNDZZSDEG86P61P4W2W
Abstained: AMBIGUOUS_SUBJECTNAME_ONLY_MATCH

More than one entity could be meant.

agent → POST /v1/ask{"question":"Is MOA NICKEL sanctioned?","mode":"standard"}
Checked
  • coveragefield, entity, source, and time range coveredpassed
  • subjectsubject is not one entityfailed
Resolution hintPass a kind hint or a discriminator such as an identifier, or choose a candidate by its ID.
Sample response · GET /v1/samples/abstention_ambiguous_subject · resp_06GR5VVKNSZNSCWM59TFSVYDGG
Abstained: NOT_COVEREDNO_SUCH_FIELD

The question is outside what is ingested.

agent → POST /v1/ask{"question":"What is the tariff on HTS code 8413.70.20?","mode":"standard"}
Checked
  • coveragenot covered: NO_SUCH_FIELDfailed
Resolution hintAsk for a field in the catalog.
Sample response · GET /v1/samples/abstention_not_covered · resp_06GR5VVKP5VT59M8SJ3X1P77XR
Presets

One preset for each kind of work

A preset bundles the fields and defaults a team needs, so an agent can ask for the whole package in one call.

An 1815 account registerSanctions and compliancesanctions_compliance“Is MOA NICKEL SA on the SDN List, and under which programs?”
An 1898 lithograph, dispatch boat DolphinTrade and procurementtrade_procurement“Is this supplier listed on the UK Sanctions List or the EU consolidated list?”
Generated: crosshair grid over halftoneTravel and securitytravel_security“What is the travel advisory level for Colombia?”
A topographic survey sheetPolitical-risk insurancepolitical_risk_insurance“Which tropical cyclones does the National Hurricane Center list as active?”
Generated: graticule over halftoneResearch and agentsresearch_agents“What changed on the SDN List for this entity, and why?”
Generated halftone stoneNewsroom and NGOnewsroom_ngo“What did the U.S. and U.K. advisories for Colombia say on 1 October?”
Before you connect an agent

What builders ask first

Most answers point to a page of the public record, so you can check them yourself.

What does "cited" mean here?
Every item carries its source by name with a link to the source's terms, the exact passage it was read from, when the fact held (valid time), and when it was recorded. Repeat the response's attribution text wherever you show the data.
What does my agent get when there is no answer?
A typed abstention, not an error. Its code says why, such as STALE, AMBIGUOUS_SUBJECT, or NOT_COVERED. It lists what was checked, and its resolution hint says what would resolve it.
Can I see which sources are live, and how fresh they are?
Yes. The Status page lists every served source with its freshness, last verification, and outages. Answers come only from those sources, and every item carries its own fetched and verified times.
Status
Can I ask what was known on a past date?
Yes. An as-of query takes two dates: valid_at, for when something applied, and known_at, for what the record held at that moment. You can ask what was true on a date as it was known then.
What happens when a fact was wrong?
Each correction to a served fact is listed in the public Corrections log, with the fact versions it changed. From the console you can report a wrong fact by its response ID.
Corrections log
What is it not?
It is not legal, trading, or investment advice. It reports what publishers' records say, with their dates. A negative result covers only the lists and versions it names.
How do I connect an agent?
Install the MCP server from the Integrate page, or give your agent the skill file with Copy Skill. The HTTP API takes the same key.
Integrate

Give your agents the record.