Developer reference
GET /v1/lookup/:domain
Returns the stored technology profile for a public hostname. A cache miss scans the homepage over HTTPS and upserts the result.
Authentication
Send a workspace key in x-api-key. Calls with no key, or with the public demo key demo_free_key, are limited to 10 lookups per IP per UTC day and read the same cached profile.
curl https://your-host/v1/lookup/allbirds.com \ -H "x-api-key: sk_live_your_key"
Success body
{
"domain": "allbirds.com",
"technologies": {
"eCommerce": ["Shopify Plus"],
"Payment": ["Stripe", "PayPal", "Shop Pay"],
"Buy Now Pay Later": ["Afterpay"],
"Marketing": ["Klaviyo"],
"Advertising": ["Meta Pixel", "TikTok Pixel"],
"Analytics": ["GA4"],
"Tag Management": ["Google Tag Manager"],
"Reviews": ["Yotpo"],
"Infrastructure": ["Cloudflare"]
},
"last_scanned_at": "2026-10-24 05:00:00",
"cached": true
}
Successful responses set Cache-Control: public, max-age=604800, s-maxage=2592000 so browsers keep a copy for 7 days and a shared edge, including Cloudflare, can keep it for 30 days. Quota figures are response headers, not part of the cached body.
- X-Quota-Monthly-Used
- X-Quota-Monthly-Total
- X-Quota-Topup
- X-Quota-Source: monthly | topup
- X-Payment-Warning: past_due
Supported technologies
GET /v1/technologies lists every technology the scanner can detect, grouped by category. It is free and does not use quota.
Bulk export
GET /v1/export/csv streams matching domains as CSV. GET /v1/export/count returns how many domains match without charging anything. Both need a paid x-api-key. Non-developers can use the same filters at /export.html.
| Parameter | Meaning |
|---|---|
| ecommerce | Comma-separated platforms, e.g. shopify,woocommerce |
| payment | Comma-separated gateways, e.g. stripe,paypal |
| marketing | Comma-separated tools, e.g. klaviyo,ga4,meta_pixel |
| tech | Any technology name from /v1/technologies |
| limit | Rows to return. Default 1,000, maximum 50,000 |
Values inside one parameter are OR; parameters are combined with AND. Matching is case-insensitive and shopify also matches Shopify Plus.
curl -o leads.csv "https://your-host/v1/export/csv?ecommerce=shopify&payment=stripe&marketing=klaviyo&limit=5000" \ -H "x-api-key: sk_live_your_key"
You are charged one credit per row actually delivered: min(limit, matches). The monthly quota is used first, then rollover credits. If the balance is short the request returns 402 with required and available and nothing is charged. Columns: Domain, eCommerce, Payment, Marketing, Analytics, Infrastructure, LastScannedAt, Other.
Quota and rollover
| Plan | Price | Monthly lookups |
|---|---|---|
| Starter | $99 | 10,000 |
| Business | $299 | 50,000 |
| Enterprise | $799 | 200,000 |
The monthly counter resets at 00:00 UTC on the 1st. One-time packs are $29 for 3,000, $99 for 20,000, and $199 for 60,000. They are deducted only after the monthly quota is gone, and each lot expires 12 months after purchase.
Dunning
past_dueopens a 7-day grace period. Calls succeed and includeX-Payment-Warning: past_due.- When grace ends, the key becomes inactive and returns
402. Remaining top-up credits can still be spent until they hit zero. subscription.canceledcloses the workspace immediately, including unused top-up credits.
Errors
| Status | When |
|---|---|
| 400 | The domain is not a public hostname. |
| 401 | The API key does not exist. |
| 402 | Quota is gone, grace has ended, or the subscription is canceled. |
| 429 | The free daily diagnostic limit was reached. |
| 502 | The origin could not be scanned. The credit is refunded. |
Billing events
Subscription and top-up payments are confirmed on StackPulse's side. A completed subscription resets monthly_quota_used to 0. A completed top-up adds a 12-month credit lot. You do not need to configure a callback URL.