Search
Several engines asked at once, results merged by agreement and cached, so the same question costs once.
POST /v1/searchOne 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.
Several engines asked at once, results merged by agreement and cached, so the same question costs once.
POST /v1/searchUp to 50,000 searches or fetches per job, with a callback to your server when it is done.
POST /v1/batch/fetchAny page or PDF as clean text plus the exact bytes, with paywall and archive handling built in.
POST /v1/fetchOne structured register with source attribution, built from official registers in 13 countries, GLEIF, SEC EDGAR and EU filings.
GET /v1/companies/{id}People read /status; your monitors poll /v1/status. Incidents and maintenance are posted there first.
Give every key its own monthly budget and request quota, and see usage per key, project and day.
Signed notifications when a batch finishes, a limit is near or a watched company changes.
Send the same batch twice with one idempotency key and it runs once, and is charged once.
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 →
# 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]){
"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.
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.
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 →
{
"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"}]
}GET /v1/companies/sources · the live listEvery 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 →
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.