Calls

curl
curl -s https://data.wearedeepworks.com/v1/feeds/nhc-storms/sample

curl -s https://data.wearedeepworks.com/v1/feeds \
  -H "Authorization: Bearer $DEEP_DATA_KEY"

curl -s https://data.wearedeepworks.com/v1/feeds/nhc-storms \
  -H "Authorization: Bearer $DEEP_DATA_KEY"

curl -s https://data.wearedeepworks.com/v1/status

The sample does not need a key. It returns the latest stored NHC envelope, or a committed fixture with fetched_at null when no snapshot is available.

Authentication

Send Authorization: Bearer dd_live_…. Keys are shown once in the dashboard and stored as a SHA-256 digest. Missing or unknown keys return 401 with error.code unauthorized.

Sign in to create a key

Rate limits

Free is 10 requests per minute and 100 per day, with no credit debit inside that quota. Starter is 60 per minute. Pro is 300 per minute. Over the limit returns 429 rate_limited. Starter and Pro also need a credit or the call returns 402 payment_required. Billing opens soon, so new accounts stay on the free quota.

Errors

304Not modified. No body and no credit debit. The call still counts toward the per-key rate limit.
400 invalid_querylimit, cursor, omit, or feed was not valid. This does not count toward the quota.
401 unauthorizedNo bearer token, or the key was not recognized.
402 payment_requiredPaid plan with no credits left.
404 not_foundUnknown feed, or a sample slug other than nhc-storms.
429 rate_limitedMinute or daily cap for the plan.
503 database_unavailableThe database could not be reached.

Error bodies use { "error": { "code", "message" } }.

Caching

Feed reads send ETag and Cache-Control: private, max-age=15. Send the ETag back as If-None-Match. A 304 has an empty body and does not debit a credit. It still counts toward the per-key minute and day caps, because the key was checked.

GET /v1/status, the NHC sample, OpenAPI, and llms.txt are public caches. Status accepts ?feed=nhc-storms when you only need one row. A feed list does not include record payloads.

omit=data on a feed or its history returns the envelope without the JSON payload. On a single feed, has_record says whether a row is stored.

Pages

History defaults to 30 changes and reports default to 10. Usage defaults to 50. limit can be from 1 to 100. The body includes page.next_cursor, and history sends a Link header with rel=next when another page exists. Pass cursor back unchanged. GET /v1/usage is not metered.

Endpoints

GET /v1/feedsCatalog with provenance. Metered.
GET /v1/feeds/{slug}Latest record. Metered.
GET /v1/feeds/nhc-storms/samplePublic sample. Not metered.
GET /v1/feeds/{slug}/historyChange page. limit, cursor, and omit=data. Metered.
GET /v1/feeds/{slug}/chartsChart series. Metered.
GET /v1/feeds/{slug}/reportsIngest reports. Metered.
GET /v1/statusPublic feed status. Not metered.
GET /v1/openapiOpenAPI document. Not metered.
POST /v1/billing/checkoutBilling opens soon.
POST /v1/billing/portalBilling opens soon.
/mcpReturns 501. MCP is not available yet.

What the status words mean

ok is a successful ingest inside the stale window. degraded means the upstream refused the fetch, currently ECCB HTTP 403, and no rates were stored. pending means the feed is enabled and has not completed a fetch yet. not_enabled means the slug is seeded only. stale means the last success is older than the feed's stale window. error means the worker recorded a failed fetch.

Informational only — not financial, legal, or safety advice. Verify with the cited source.

Open the status page