Paldo Data API
Your intelligence, in your own tools.
Pull your feed, predictions, patterns and deal opportunities into your own platform, spreadsheets or AI assistant. Four read-only endpoints, one key, plain JSON.
Getting access
One key, your whole workspace.
API keys are currently issued by the Paldo team; self-serve key management from your dashboard is coming. A key can read data from every market you monitor with us, and nothing else. Keys are shown once at issue time and can be revoked instantly.
Base URL: https://www.paldoapp.com/api/public/v1. Send your
key on every request:
curl -H "Authorization: Bearer pk_live_your_key_here" \
https://www.paldoapp.com/api/public/v1/feed
All endpoints are read-only GET. Default limit of 5,000
requests per key per day. Errors come back as
{"error": "…"} with conventional status codes:
400 bad parameter (an unreadable date, a feed window
over 31 days, an unknown status), 401 bad or missing
key, 404 unknown market, 429 daily limit
reached.
Reference
The four endpoints.
/feed now
returns every key event between two dates, including tracked-topic
and M&A deal cards (it used to return only the latest feed per
market). /predictions now returns the
predictions your Predictions tab shows, with the chance of each
outcome. The cards /predictions used to return are
unchanged at the new /patterns endpoint, under the key
patterns.
GET/feed
Every key event across your markets between two dates: the same
items your Paldo Key Events tab shows, in one list, newest event
first. Each item has a kind:
"company" is a story about a company from your
intelligence feeds, "topic" is a research finding on
a topic you track, and "deal" is an M&A deal
card. A story that belongs to several of your markets is one item
listing all of them in markets.
date_range is when the events took place, and
sources lists the linked pages behind the item.
Company stories carry company and
topic: null. Topic cards carry the tracked topic's
name in topic and company: null. A deal
card looks like a company story when a company from your market
is in the deal; otherwise it carries
topic: "M&A radar". A feed is published about
daily and covers the week before it, so the same company story
recurs across overlapping feeds; those copies are folded into one
item that keeps the newest telling. first_seen and
last_seen say when Paldo found the item: the first
and last feed in your window that carried a company story, the
research runs that found a topic card, or when a deal card was
created.
| Param | Description |
|---|---|
| market | Optional market id (from any response's market.id or markets[].id) to fetch a single market. |
| since / until | Optional ISO dates or timestamps. Company stories are picked by when their feed was published; topic and deal cards by their event date (date_range.end). Default: the last 7 days. At most 31 days per request; for longer periods, ask a month at a time. A bare date as until covers that whole day. The window used comes back in the response. |
| limit / offset | Pagination over stories. Default 100, max 500. Follow next_offset until it is null; total is the number of stories in the window. |
curl -H "Authorization: Bearer pk_live_your_key_here" \
"https://www.paldoapp.com/api/public/v1/feed?since=2026-10-01&until=2026-10-14"
{
"bundle": "Your Company",
"since": "2026-10-01T00:00:00.000Z",
"until": "2026-10-14T23:59:59.999Z",
"stories": [
{
"kind": "topic",
"title": "EU agrees battery passport rules for industrial batteries",
"company": null,
"topic": "EU battery regulation",
"markets": [{ "id": "…", "name": "Nordic Industrials" }],
"summary": "…",
"detailed_summary": null,
"event_type": "Market Signal",
"sentiment": "neutral",
"importance_score": 8,
"strategic_signals": [],
"key_insights": [],
"date_range": { "start": "2026-10-10", "end": "2026-10-11" },
"sources": [{ "url": "https://…", "title": "…", "date": "2026-10-11" }],
"first_seen": "2026-10-12T…",
"last_seen": "2026-10-13T…"
},
{
"kind": "company",
"title": "Competitor X: expands into Sweden",
"company": "Competitor X",
"topic": null,
"markets": [{ "id": "…", "name": "Nordic Industrials" }],
"summary": "…",
"detailed_summary": "…",
"event_type": "expansion",
"sentiment": "neutral",
"importance_score": 8,
"strategic_signals": ["…"],
"key_insights": ["…"],
"date_range": { "start": "2026-10-06T…", "end": "2026-10-08T…" },
"sources": [{ "url": "https://…", "title": "…", "date": "2026-10-07T…" }],
"first_seen": "2026-10-09T…",
"last_seen": "2026-10-14T…"
}
],
"total": 142,
"next_offset": 100
}
GET/predictions
The predictions your Paldo Predictions tab shows: a concrete call about your market with a deadline, the chance of each outcome now, why it matters to you, and the research behind it. Each prediction is researched again as news comes in; you always get its latest research. Newest first. Predictions dismissed in the app are excluded.
status is pending (written, not yet
researched: chances is null and
evidence is empty), tracking (researched,
open) or resolved (settled: resolved is
{"outcome": "yes", "at": "…"}). chances
maps each option to its probability now, 0 to 1.
deadline is a date (YYYY-MM-DD), and
language is the language the card is written in
(for example "Norwegian"; null means
English).
brief is the latest research written up, one text
per section: bottom_line,
where_it_stands, wider (the wider
context), against (why it could still go the other
way), settles (what would settle it) and
watch (what to look for next). Sources are linked
inline as Markdown [words](https://…); paragraphs
are split by a blank line. evidence lists the
developments the research found, each with the option it
favours, its strength (1 to 5) and
every source that reports it. wider_context has the
same shape: what is happening around the prediction beyond the
organisations it names. A source from Paldo's own signals has
url: null.
| Param | Description |
|---|---|
| market | Optional market id. |
| status | Optional: tracking, pending or resolved. |
| since / until | Optional ISO dates, filtering on when the prediction was first written (first_authored). |
| limit / offset | Pagination. Default 100, max 500. Follow next_offset until it is null. |
curl -H "Authorization: Bearer pk_live_your_key_here" \
"https://www.paldoapp.com/api/public/v1/predictions?status=tracking"
{
"bundle": "Your Company",
"predictions": [
{
"id": "…",
"market": { "id": "…", "name": "Nordic Industrials" },
"prediction": "Competitor X opens a production site in Sweden by 30 June 2027",
"options": ["yes", "no"],
"status": "tracking",
"chances": { "yes": 0.62, "no": 0.38 },
"deadline": "2027-06-30",
"resolved": null,
"language": "English",
"why_it_matters": "…",
"brief": {
"bottom_line": "…",
"where_it_stands": "…",
"wider": "…",
"against": "…",
"settles": "…",
"watch": "…"
},
"evidence": [
{
"text": "…",
"favours": "yes",
"strength": 4,
"date": "2026-10-09",
"sources": [{ "url": "https://…", "title": "…", "date": "2026-10-09" }]
}
],
"wider_context": [],
"last_researched": "2026-10-16T…",
"first_authored": "2026-10-02T…",
"last_updated": "2026-10-16T…"
}
],
"next_offset": null
}
GET/patterns
Forward-looking pattern cards across your markets (served at
/predictions until October 2026, same fields): what
we expect to happen, the reasoning, the evidence, and the
tripwires that would confirm it. Dismissed and archived cards are excluded.
Note: window is only set when the underlying material
contains a real, documented deadline (a tender close, a permit
expiry, a stated date); we never invent dates. For all other cards,
lead_time_horizon carries the honest, fuzzier timing.
Each card carries a scope: "company" cards
are about one named company, while "market" cards are
market-wide calls (regulation, structural shifts, cross-company
patterns) and carry company: null by design.
| Param | Description |
|---|---|
| market | Optional market id. |
| state | Optional card state filter. |
| since / until | Optional ISO dates, filtering on when the card was first observed. |
| limit / offset | Pagination as above. |
curl -H "Authorization: Bearer pk_live_your_key_here" \
"https://www.paldoapp.com/api/public/v1/patterns?since=2026-09-01"
{
"bundle": "Your Company",
"patterns": [
{
"id": "…",
"market": { "id": "…", "name": "Nordic Industrials" },
"scope": "company",
"company": "Competitor X",
"title": "…",
"description": "…",
"kind": "…",
"state": "…",
"endorsed": false,
"lead_time_horizon": "…",
"window": { "text": "Q4 2026", "date": "2026-11-01" },
"evidence": [],
"tripwires": [],
"first_observed": "2026-08-01T…",
"last_updated_at": "2026-08-15T…"
}
],
"next_offset": null
}
GET/opportunities
Deal opportunities surfaced across your markets: tenders, buying signals and early-stage openings, with deadlines, buyers, rivals and suggested actions.
| Param | Description |
|---|---|
| market | Optional market id. |
| status | Optional deal lifecycle: active, forming, dormant or resolved. |
| verdict | Optional, orthogonal to lifecycle: endorsed, dismissed or any. This is the customer's own call on a card; a deal can be active and endorsed at once. Default: everything not dismissed. |
| since | Optional ISO date, filtering on first observation. |
| limit / offset | Pagination as above. |
{
"bundle": "Your Company",
"opportunities": [
{
"id": "…",
"market": { "id": "…", "name": "Nordic Industrials" },
"title": "Oslo kommune: framework tender for …",
"description": "…",
"buyer": "Oslo kommune",
"deadline": "2026-09-12",
"estimated_value": "…",
"state": "active",
"endorsed": true,
"dismissed": false,
"suggested_action": "…",
"why_us": "…",
"rivals": [],
"evidence": [],
"first_observed": "2026-08-10T…",
"last_updated_at": "2026-08-16T…"
}
],
"next_offset": null
}
For agents
Machine-readable definition.
A compact definition of the same four endpoints, for agents and code generators. (This is a documented HTTP API, not a hosted MCP server; point any HTTP-capable tool at it.)
{
"name": "paldo_data_api",
"description": "Read-only access to a customer's Paldo competitive intelligence: feed stories between two dates, predictions with the chance of each outcome, pattern cards, deal opportunities. Scope: the markets in the customer's Paldo workspace.",
"base_url": "https://www.paldoapp.com/api/public/v1",
"auth": { "type": "http_bearer", "header": "Authorization: Bearer <api_key>", "obtain": "Issued by Paldo support; ask the user for their key. Never guess or fabricate keys." },
"endpoints": [
{ "method": "GET", "path": "/feed", "params": { "market": "optional market id", "since": "optional ISO date; on feed publish time for company stories, on event date (date_range.end) for topic and deal cards; default 7 days before until", "until": "optional ISO date, default now; a bare date covers the whole day; window at most 31 days", "limit": "1-500, default 100, over stories", "offset": "pagination offset" }, "returns": "the Key Events in the window as one list, newest event first, recurring feed copies folded into one: {bundle, since, until, stories[{kind ('company'|'topic'|'deal'), title, company (null for topic cards), topic (tracked topic name, or 'M&A radar' for deals with no market company; null for company stories), markets[{id,name}], summary, detailed_summary, event_type, sentiment, importance_score, strategic_signals[], key_insights[], date_range{start,end}, sources[{url,title,date}], first_seen, last_seen}], total, next_offset}" },
{ "method": "GET", "path": "/predictions", "params": { "market": "optional market id", "status": "optional: tracking|pending|resolved", "since": "optional ISO date, on first_authored", "until": "optional ISO date, on first_authored", "limit": "1-500, default 100", "offset": "pagination offset" }, "returns": "{bundle, predictions[{id, market{id,name}, prediction, options[] (e.g. ['yes','no']), status, chances{option: 0-1} (null until first researched), deadline (YYYY-MM-DD), resolved{outcome,at}|null, language, why_it_matters, brief{bottom_line, where_it_stands, wider, against, settles, watch} (Markdown-linked text)|null, evidence[{text, favours, strength 1-5, date, sources[{url, title, date}]}], wider_context[same as evidence], last_researched, first_authored, last_updated}], next_offset}" },
{ "method": "GET", "path": "/patterns", "params": { "market": "optional market id", "state": "optional state filter", "since": "optional ISO date, on first_observed", "until": "optional ISO date, on first_observed", "limit": "1-500, default 100", "offset": "pagination offset" }, "returns": "{bundle, patterns[{id, market{id,name}, scope ('company'|'market' — market-wide calls have company:null), company, title, description, kind, state, endorsed, lead_time_horizon, window{text,date}, evidence[], tripwires[], first_observed, last_updated_at}], next_offset}" },
{ "method": "GET", "path": "/opportunities", "params": { "market": "optional market id", "status": "deal lifecycle: active|forming|dormant|resolved", "verdict": "customer's call, orthogonal to status: endorsed|dismissed|any, default not-dismissed", "since": "optional ISO date", "limit": "1-500, default 100", "offset": "pagination offset" }, "returns": "{bundle, opportunities[{id, market{id,name}, title, description, buyer, deadline, estimated_value, state, endorsed, dismissed, suggested_action, why_us, rivals[], evidence[], first_observed, last_updated_at}], next_offset}" }
],
"pagination": "follow next_offset until null",
"errors": { "400": "bad parameter: unreadable date, since after until, feed window over 31 days, unknown status/verdict", "401": "missing/invalid/revoked key", "404": "market outside key scope", "429": "daily limit reached" },
"rate_limit": "5000 requests/key/day (default)"
}