CormorantDocumentationRequest access

Web data infrastructure for AI agents and research

  • Searches the web
  • Fetches any page or PDF
  • Looks up companies in official registers

One API that tells you what every call cost.

Every arc is a web page fetched, a web search or a company-register read, drawn a minute after it happened. Countries only; no sites, searches, companies or customers are shown.

/ What you get /

Four things, one key.

Search

Several engines asked at once, results merged by agreement and cached, so the same question costs once.

POST /v1/search
50,000

Batch

Up to 50,000 searches or fetches per job, with a callback to your server when it is done.

POST /v1/batch/fetch

Fetch

Any page or PDF as clean text plus the exact bytes, with paywall and archive handling built in.

POST /v1/fetch

Company data

One structured register with source attribution, built from official registers in 13 countries, GLEIF, SEC EDGAR and EU filings.

GET /v1/companies/{id}
/v1/status

Public status page and status API

People read /status; your monitors poll /v1/status. Incidents and maintenance are posted there first.

Usage and spend limits per key

Give every key its own monthly budget and request quota, and see usage per key, project and day.

signed

Webhooks and callbacks

Signed notifications when a batch finishes, a limit is near or a watched company changes.

1×

Idempotent batches

Send the same batch twice with one idempotency key and it runs once, and is charged once.

90 days

Hosted in the EU

API, storage and logs run on servers in Germany. Request logs are deleted after 90 days.

One search, then a fetch. Several engines are asked at once and their results merged by agreement. Then any page or PDF comes back as clean text plus the exact bytes. Quickstart →

Request
# 1. Search the web
curl -sS https://api.cormorant.ch/v1/search \
  -H "Authorization: Bearer $CORMORANT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"query": "Holcim annual report 2025", "max_results": 5}'

# 2. Fetch the page you picked
curl -sS https://api.cormorant.ch/v1/fetch \
  -H "Authorization: Bearer $CORMORANT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.holcim.com/investors"}'
import os

import httpx

client = httpx.Client(
    base_url="https://api.cormorant.ch",
    headers={"Authorization": f"Bearer {os.environ['CORMORANT_API_KEY']}"},
    timeout=180,
)

# 1. Search the web
hits = client.post(
    "/v1/search", json={"query": "Holcim annual report 2025", "max_results": 5}
).json()["results"]

# 2. Fetch the first result
page = client.post("/v1/fetch", json={"url": hits[0]["url"]}).json()
if page["error"] is None:
    print(page["title"], page["tier"], page["billing_category"])
    print(page["text"][:500])
Fetch answer · reference example, shortened
{
  "status": 200,
  "tier": "direct",
  "attempts": [
    {"tier": "direct", "status": 200, "reason": "ok", "ms": 412}
  ],
  "title": "Annual Report 2025",
  "sha256": "a3f1...",
  "bytes": 2483112,
  "cached": false,
  "cost_usd": 0.0,
  "billing_category": "fetch_own"
}

One call. The whole pipeline. Cormorant takes the fastest route that works and goes deeper only when a page needs it.

/ Fastest /
  1. /01/CacheInstant answers for pages fetched recently.cached
  2. /02/Direct fetchA plain request that carries a real browser's TLS and HTTP/2 fingerprint.TLS fingerprint
  3. /03/Headless browserRenders JavaScript-heavy pages and waits out interstitials.JS rendering
  4. /04/Residential networkFor sites that block data-centre traffic, from a country you choose if needed.geo-targeted
  5. /05/Archives & alternative copiesWhen the original is gone or paywalled: snapshots and verified copies elsewhere.archive
/ Deepest /

The catch, with a receipt. You get back clean text and the exact bytes with their SHA-256, the route that worked, timings for every step and how the call is billed.

text · markdown
clean page text, or the main content with headings, tables and links
sha256 · bytes
the exact bytes, fingerprinted
tier · attempts
the route that worked, and every route tried before it
timing
timings for every step
cached
whether the answer came from the shared cache
cost_usd · billing
how the call is billed, priced like your invoice

Company data, with its sources. Official registers and gazettes from Switzerland to Japan, joined with GLEIF, SEC EDGAR and EU filings into one record that names the source of every field. Company data in the docs →

GET /v1/companies/ch_uid:CHE-101.329.561 · reference example, shortened
{
  "id": "cmp_01JA2B3C4D5E6F7G8H9J0KMNPQ",
  "names": {"legal": "UBS AG", "display": "UBS AG"},
  "jurisdiction": {"country": "CH"},
  "identifiers": [
    {"scheme": "ch_uid", "value": "CHE-101.329.561"},
    {"scheme": "lei", "value": "BFM8T61CT2L1QCEMIK50"}
  ],
  "sources": [{"source": "gleif",
    "retrieved_at": "2026-10-19T08:00:00+00:00"}]
}
/ On the scroll: a haiku by Matsuo Bashō, written in 1688 after watching cormorant fishing on the Nagara River. /
/ Sources /GET /v1/companies/sources · the live list

Europe

  • CHZefix, UID register, SOGC, cantonal register excerpts, BAG register of health insurers
  • GBCompanies House
  • FRINSEE Sirene, Recherche d'entreprises, BODACC
  • NOBrønnøysund Registers
  • SEBolagsverket
  • DKCVR
  • FIPRH Trade Register
  • CZARES
  • PLNational Court Register (KRS)

Asia and Pacific

  • JPEDINET
  • KROpenDART
  • TWCompany register (MOEA)
  • SGACRA

Americas

  • USSEC EDGAR, SEC litigation releases, EPA enforcement, federal court dockets
  • BRCNPJ (Receita Federal)

Across borders

  • LEIGLEIF: legal entities, parents, ISIN to LEI
  • EUESEF annual reports, ESMA registers, TED public contracts
  • SANSanctions lists: SECO, EU, UN, OFAC, UK
  • MKTMarket data and filings for listed companies

Every field names the source it came from and when. Official registers and gazettes in 13 countries.

Status in the open. People read /status; your monitors poll /v1/status. Incidents and maintenance are posted there first. Status page →

GET /v1/status · live
  • Loading the live status…

/ Usage-based pricing /

Tell us about your workload. You pay for what you use, and every call reports how it was billed.

Cormorant escalates to heavier routes only when a page needs them. We reply with a price for your volume and an API key to try it.

We use these details only to answer you. See privacy.