First request in five minutes
Base URL: https://api.databridge.world/v1. This is the public summary. The full docs and your real token live in the console.
Quickstart
-
Get a token
Generate one in the console under API after signup. The dbw_live_ prefix draws on your quota; dbw_test_ only reaches sample data and costs nothing.
-
Pick a source
Browse the catalog, or call GET /v1/sources for the full list with health status.
-
Make the first call
Three ways to do the same thing. All copy-paste.
curl -s "https://api.databridge.world/v1/feeds/tech-github-releases/items?limit=20" \
-H "Authorization: Bearer $DBW_TOKEN"
import os, requests
r = requests.get(
"https://api.databridge.world/v1/feeds/tech-github-releases/items",
params={"limit": 20},
headers={"Authorization": f"Bearer {os.environ['DBW_TOKEN']}"},
timeout=15,
)
r.raise_for_status()
for item in r.json()["items"]:
print(item["published_at"], item["title"])
const res = await fetch(
"https://api.databridge.world/v1/feeds/tech-github-releases/items?limit=20",
{ headers: { Authorization: `Bearer ${process.env.DBW_TOKEN}` } }
);
const { items } = await res.json();
console.log(items.map((i) => i.title));
Auth
Every request carries a Bearer token in Authorization. Tokens are bound to your account and stop working the moment you revoke them.
Authorization: Bearer dbw_live_9f21c8d4e7a04b31
Calling from the browser exposes the token. Proxy through your own server, and scope any token you hand out to a single source.
Endpoints
| Method | Path | Purpose |
|---|---|---|
| GET | /sources | All sources with domain, last fetch time and health |
| GET | /feeds | Feeds available to the current account |
| GET | /feeds/{feed_id} | Single-source metadata: description, cadence, field mapping |
| GET | /feeds/{feed_id}/items | Items with since / until / q / cursor / limit |
| GET | /feeds/{feed_id}/items/{item_id} | One item including revision history |
| POST | /webhooks | Register a delivery endpoint (Premium) |
Response shape
Field names are identical across domains. Below is the full structure of one item.
{
"feed": {
"id": "tech-github-releases",
"name": "GitHub · repository releases",
"category": "tech",
"updated_at": "2026-11-04T09:12:40Z"
},
"items": [
{
"id": "tech-github-releases:9f21c8d4",
"title": "v2.4.0 — streaming parser rewrite",
"url": "https://example.com/releases/v2.4.0",
"summary": "Replaces the buffered reader with an incremental...",
"content": null,
"author": "example",
"published_at": "2026-11-04T08:41:00Z",
"updated_at": null,
"lang": "en",
"tags": ["release"],
"hash": "9f21c8d4",
"revision": 0,
"deleted": false
}
],
"next_cursor": "eyJvIjoyMH0"
}
Paging and incremental fetch
Pull everything once, then only the delta. cursor is position-based rather than offset-based, so page 200 is as fast as page 1.
# Delta: only items after Nov 1
GET /v1/feeds/fin-cn-macro/items?since=2026-11-01T00:00:00Z
# Next page: pass the previous next_cursor back unchanged
GET /v1/feeds/fin-cn-macro/items?cursor=eyJvIjoyMH0
# next_cursor: null means you've reached the end
On dedupe: upsert keyed on id. Within a source it never changes; identical content across sources isn't merged for you, so compare hash yourself.
Quotas and rate limits
Quotas reset daily at 00:00 UTC+8. Live counters ride in response headers, so you can branch in code instead of guessing.
X-Quota-Limit: 20000
X-Quota-Used: 3412
X-Quota-Reset: 2026-11-05T00:00:00+08:00
X-Rate-Limit: 20 # requests per second
X-Rate-Remaining: 17
Exceeding quota returns 402; exceeding rate returns 429 with Retry-After. Neither costs money or suspends the account. Back off and retry.
Error codes
| Status | code | Meaning and handling |
|---|---|---|
| 401 | invalid_token | Missing or revoked. Regenerate in the console. |
| 403 | source_not_in_plan | Source outside your plan. Upgrade or switch. |
| 404 | feed_not_found | Typo in feed_id, or the source was retired. |
| 402 | quota_exceeded | Daily quota spent. Resets at midnight UTC+8. |
| 429 | rate_limited | Per-second ceiling hit. Honor Retry-After. |
| 410 | feed_disabled | Repeated failures after an origin redesign; fetching paused. |
| 503 | upstream_unavailable | Origin temporarily unreachable. Exponential backoff. |
Webhooks (Premium)
Skip polling. New items POST to your endpoint on ingest, signed so you can verify authenticity.
POST https://your-app.example.com/hooks/dbw
X-DBW-Signature: sha256=6b1f...e0
X-DBW-Feed: tech-github-releases
X-DBW-Delivery: 01JC2F8Q
{ "feed_id": "tech-github-releases", "items": [ { "id": "...", "title": "..." } ] }
Signature = HMAC-SHA256(raw body, webhook_secret). Five retries with exponential backoff (10s → 160s); after that the delivery is logged in the console and can be replayed manually.
It's the summary on the marketing site. Field names, endpoints and quotas follow the console docs. If the two disagree, the console wins, and we'd like to hear about it.
Grab a token and try it
The free tier gives you 500 calls a day, enough to run one source end to end.