Data API
Data API
Programmatic access to stored price records with source links where available, published API changes, and webhooks.
Public API health checkHTTP
$ curl https://api.modelpricelab.com/health
# Returns service status and timestamp
Quick start
Fetch stored model price records with a single request.
curl -H "Authorization: Bearer mpl_your_api_key" \
"https://api.modelpricelab.com/v1/prices"Endpoint reference
API Free can call only GET /v1/prices. /v1/changes and all webhook routes require a current Developer plan ($39/mo, see Pricing).
| Endpoint | Method | Auth | Description | Limit |
|---|---|---|---|---|
| /v1/prices | GET | API key | Returns stored model price records across vendors and platforms. | API Free or current paid entitlement |
| /v1/changes | GET | API key | Returns published price and API changes; incidents are excluded by default. | Current paid entitlement required |
| /v1/webhooks | GET | API key | List configured webhook endpoints. | Current paid entitlement required |
| /v1/webhooks | POST | API key | Subscribe an HTTPS URL to change.alert events. | Current paid entitlement required |
| /v1/webhooks/{id} | DELETE | API key | Remove a webhook subscription. | Current paid entitlement required |
Webhook signature verification
Only accounts on a current Developer plan receive deliveries. Verify the exact raw body with HMAC SHA-256 from x-mpl-signature (sha256=…).
import { createHmac, timingSafeEqual } from 'node:crypto';
const signature = req.headers['x-mpl-signature'];
// Capture the exact raw UTF-8 request bytes before JSON parsing.
const rawBody = req.rawBody;
const expected = 'sha256=' + createHmac('sha256', WEBHOOK_SECRET)
.update(rawBody)
.digest('hex');
const valid = typeof signature === 'string'
&& signature.length === expected.length
&& timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
if (!valid) {
res.status(401).send('Invalid signature');
return;
}Rate limits & quotas
Each API key has a daily request quota based on its plan. Requests exceeding the quota return HTTP 429.
API Free
Requests: 100/day
Record semantics: Stored records; no fixed freshness promise
Developer plan ($39/mo)
Requests: 10,000/day, incl. changes & webhooks
Record semantics: Stored records; not promised real-time
Quotas reset daily at UTC midnight. When exhausted, buy a top-up pack ($5 / 50,000 requests / 30 days, stackable) to keep calling immediately — responses then carry X-RateLimit-Topup: true. GET /v1/usage reports balance and reset time at any time (introspection is unmetered).
curl "https://api.modelpricelab.com/v1/usage" -H "Authorization: Bearer $MPL_KEY"
# → { "plan": "developer", "daily_quota": { "limit": 10000, "remaining": 9962,
# "reset_at": "2026-10-06T00:00:00Z" }, "topup": { "remaining": 49997 } }