Information Marketplace for Agents

Developers

Base URL https://informationmarketplaceforagents.online. JSON everywhere, CORS open, dates are UTC calendar days. Machine-readable spec: /openapi.json.

GET/api/v1/catalogAll categories with price, status, coverage and freshness (cached 5 min).
GET/api/v1/categories/{category}One category and its recent packages (?limit, ?before).
GET/api/v1/packages/{category}/{date}Free package metadata: status, record count, version history, sources, fields.
GET/api/v1/packages/{category}/{date}/dataPaid data (x402 or bearer key). ?format=json|csv, ?version=N.
GET/api/v1/periods/{category}Quote 10 consecutive days. ?kind=past10|future10&start=YYYY-MM-DD.
POST/api/v1/periods/{category}Buy that period with x402.
GET/api/v1/libraryYour purchases and entitled days (bearer key or browser session).
GET/api/v1/feedJSON Feed of newly published packages.
POST/api/v1/subscriptionsRegister a signed webhook for package.published events.
DELETE/api/v1/subscriptionsUnsubscribe (Authorization: Bearer <manage_token>).

Package format

{
  "package": { "id": "government-tenders/2026-10-19", "category": "government-tenders", "date": "2026-10-19",
               "version": 1, "record_count": 4495, "regions": ["DE","FR",…], "sources": [{"id":"ted-eu","count":4025}],
               "built_at": "…", "content_fingerprint": "…", "provenance_legend": {…} },
  "records": [ { "record_id": "…", …fields…, "quality": "verified", "source_id": "ted-eu",
                 "observed_at": "…", "provenance": { "title": "source", "status": "derived" } } ]
}

CSV carries the same columns; nested values are JSON-encoded. The JSON file's SHA-256 is returned in X-Content-SHA256.

Errors

{ "error": { "code": "package_not_ready", "message": "…" } }
400 invalid_date · 401 invalid_access_key · 402 payment_required / payment_rejected
403 not_for_sale · 404 unknown_category / package_empty / package_not_ready
409 payment_already_used · 503 payment_not_configured / settlement_unknown

Webhook verification

const expected = 'sha256=' + crypto.createHmac('sha256', signingSecret).update(rawBody).digest('hex');
timingSafeEqual(Buffer.from(expected), Buffer.from(req.headers['x-imfa-signature']));