Developers

The Market Intelligence API

Everything last30days learns about your topics — the findings ledger with citations and cross-cycle status, entities with verified relationships, and a per-cycle change stream — readable over REST and pushed via signed webhooks. Machine-readable spec at /openapi.json.

API access is part of Intelligence Ops — keys are minted per workspace from the dashboard.

Authentication

Send your workspace key as a bearer token. Keys are shown once at creation and stored only as a hash; revoke and re-mint anytime from the dashboard.

curl https://www.last30days.xyz/api/v1/topics \
  -H "Authorization: Bearer l30d_..."

Fair-use limit: 1,000 requests per hour per key (429 with Retry-After beyond it).

Endpoints

GET/api/v1/topics

Every topic in the workspace, newest first.

{
  "data": [
    {
      "id": "9c2e…",
      "query": "Quantum AI",
      "heartbeat": "weekly",
      "status": "active",
      "createdAt": "2026-06-01T09:00:00Z"
    }
  ]
}

GET/api/v1/topics/{id}/findings

A topic's findings with their cross-cycle lifecycle status (New / Holding up / Disputed / Quiet), evidence grade, sightings lineage, and per-finding source citations.

  • id (path) — Topic id
{
  "data": {
    "topic": {
      "id": "9c2e…",
      "query": "Quantum AI",
      "heartbeat": "weekly"
    },
    "findings": [
      {
        "key": "federal-pqc-migration-mandate",
        "text": "Federal agencies received a dated post-quantum migration mandate.",
        "status": "repeated",
        "statusLabel": "Holding up",
        "tag": "fact",
        "confidence": "high",
        "impact": "high",
        "sightings": 3,
        "firstSeen": "2026-05-14T08:00:00Z",
        "lastSeen": "2026-07-01T08:00:00Z",
        "citations": [
          {
            "source": "Reuters",
            "url": "https://…"
          }
        ]
      }
    ],
    "truncated": false
  }
}

GET/api/v1/topics/{id}/entities

A topic's claim-linked entities plus typed relationships. Only judge-verified, non-retracted edges are served — held or retracted edges never appear.

  • id (path) — Topic id
{
  "data": {
    "topic": {
      "id": "9c2e…",
      "query": "Quantum AI"
    },
    "entities": [
      {
        "id": "e1…",
        "name": "GlobalFoundries",
        "type": "company",
        "mentions": 6,
        "firstSeen": "2026-06-02T…",
        "lastSeen": "2026-07-01T…"
      }
    ],
    "edges": [
      {
        "src": {
          "id": "e1…",
          "name": "GlobalFoundries",
          "type": "company"
        },
        "kind": "partners_with",
        "dst": {
          "id": "e2…",
          "name": "US CHIPS Program",
          "type": "regulator"
        },
        "confidence": "reported",
        "evidenceFindingKey": "gf-chips-quantum-award"
      }
    ]
  }
}

GET/api/v1/events

Everything that changed, cycle by cycle: brief.published, finding.new, finding.status_changed, finding.merged, edge.verified. Newest first. The same stream webhooks deliver — poll this if you don't run a receiver.

  • topic_id (query) — Filter to one topic
  • since (query) — ISO timestamp lower bound
  • limit (query) — Max rows (default 100, cap 200)
{
  "data": [
    {
      "id": "ev1…",
      "topicId": "9c2e…",
      "briefId": "b7…",
      "type": "finding.status_changed",
      "payload": {
        "key": "federal-pqc-migration-mandate",
        "from": "emerging",
        "to": "repeated",
        "text": "…"
      },
      "createdAt": "2026-07-01T08:04:00Z"
    }
  ]
}

Webhooks

Register one endpoint per workspace and receive each cycle's events as a single JSON batch, signed with HMAC-SHA256 over the exact body. Missed a delivery? The events endpoint above is the durable log — poll with ?since=.

import { createHmac, timingSafeEqual } from "crypto";

function verify(signatureHeader: string, rawBody: string, secret: string): boolean {
  const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
  return timingSafeEqual(Buffer.from(signatureHeader), Buffer.from(expected));
}
// Header: X-L30D-Signature — computed over the exact request body.

What teams build with it

Client portals

Serve each client their topics' findings and verified relationships inside your own product — white-label all the way down.

Slack / internal alerts

Subscribe to the event stream and post when a finding flips to Disputed or a new relationship is verified.

Your data stack

Sync the ledger into a warehouse; join market intelligence against your own pipeline or portfolio data.

AI agents

The API is agent-ready: point an agent at the OpenAPI spec and let it query the intelligence directly.

Ready to build on your intelligence? API access ships with Intelligence Ops.

Talk to us