Docs
One set of API keys. One bill. Familiar conventions across every service. Pick a service below to get started, explore its API reference, or sign in to try a request right here.
Services
4 available- Job monitorsAlerts you when a scheduled job misses its check-in, runs too long, or fails. $0.50 per monitor per month.
/job_monitors - Feature flagsControl feature releases and configuration with user targeting, gradual rollouts, and experiments. $0.03 per 1,000 remote evaluations.
/feature_flags - Phone numbersFinds, buys, and releases US phone numbers for texting. $1.60 per number per month.
/phone_numbers - WebhooksSends signed webhooks to customer endpoints with retries and delivery logs, and verifies incoming ones. $1.00 per 100K messages + $5.00 per 100K deliveries.
/webhooks
Motor platform
3 available- Client tokensIssue scoped tokens for browsers and mobile apps.
- EventsSubscribe to events generated by Motor.
- UsageView daily charges by service, meter, and key.
Authentication
Send a secret API key in the Authorization header of each request. Create keys on the API keys page. Choose which APIs each key can access and set a monthly spending limit. Existing job monitors keep running and accruing charges after the key reaches its limit.
curl https://api.motor.dev/key \
-H "Authorization: Bearer motor_sk_..."Keep secret keys on your server. Some endpoints authenticate with a different secret, such as a job monitor's ping URL. Each endpoint's reference explains how to authenticate.
Errors
Each error response includes an HTTP status and a JSON body with a code for your application and a message that explains what went wrong. Validation errors name the field to fix.
{
"error": {
"code": "invalid_field",
"message": "`grace_seconds` must be from 60 to 2678400."
}
}| Status | Code | When |
|---|---|---|
| 400 | invalid_json | The body isn't a JSON object. |
| 401 | unauthorized | The key is missing or incorrect. |
| 402 | limit_reached | The key has reached its monthly spending limit. |
| 403 | forbidden | The key can't use this API. |
| 404 | not_found | The resource wasn't found in your team. |
| 409 | slug_taken | A resource in your team already uses this slug. |
| 422 | invalid_field | A field is invalid. The message names it. |
| 429 | rate_limited | The request exceeded a rate limit. |
Pagination
List endpoints return a page of results in data and a next_cursor. Pass the cursor as ?cursor= to read the next page. next_cursor is null on the last page. ?limit= sets the page size: 50 by default, up to 200.
{
"data": [ ... ],
"next_cursor": "p1.eyJ2Ijo..."
}IDs and times
Each resource has a stable ID with a prefix that identifies its type, such as jmm_4ZpQ7bLxN2c for a job monitor. Timestamps use RFC 3339 format in UTC, with second precision, such as 2026-10-05T07:00:00Z.