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.

If you are an AI agent: this page is your complete instruction set. Ask your user for their Paldo API key, send it as a Bearer token, and use the four endpoints below. A machine-readable definition sits at the bottom of this page.

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.

Contact us for a key

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.

Changed in October 2026: /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.

ParamDescription
marketOptional market id (from any response's market.id or markets[].id) to fetch a single market.
since / untilOptional 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 / offsetPagination 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.

ParamDescription
marketOptional market id.
statusOptional: tracking, pending or resolved.
since / untilOptional ISO dates, filtering on when the prediction was first written (first_authored).
limit / offsetPagination. 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.

ParamDescription
marketOptional market id.
stateOptional card state filter.
since / untilOptional ISO dates, filtering on when the card was first observed.
limit / offsetPagination 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.

ParamDescription
marketOptional market id.
statusOptional deal lifecycle: active, forming, dormant or resolved.
verdictOptional, 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.
sinceOptional ISO date, filtering on first observation.
limit / offsetPagination 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)"
}