Quota

Each project has a monthly quota of /schedule calls. Every valid /schedule call uses one unit while you have quota left, whether it creates a trigger or edits one. Cancelling, the other endpoints, and your triggers firing don't use quota.

Limits

PlanMonthly limit
Free500 /schedule calls
FlexUnlimited
  • New accounts start on the Free plan.
  • TimeTriggers can set a custom limit for a project, which replaces the plan's limit. This applies on Flex too.
  • All API keys of a project share the same quota.
  • You can't change your plan or limit through the API or the dashboard.

The month is a calendar month in UTC. Your usage resets to zero at 00:00 UTC on the 1st of each month, and unused calls don't carry over.

What uses quota

A /schedule request uses one unit once it passes request validation, unless your quota is already used up, in which case it gets 402 and costs nothing. See When the quota is used up.

Requests rejected with 400 or 401 don't use quota. That covers a missing ttr-api-keyheader or ttr-urlheader, an invalid ttr-urlheader or ttr-tagsheader, an invalid API key, an unreadable ttr-scheduled-atheader or cron(...) expression, a body that can't be read, and a lowercase or unknown method name. See Errors for the checks in the order they run.

A request that passes validation uses one unit, whatever happens next:

  • New triggers, one-shot or recurring. A recurring trigger costs one unit for the /schedule call, not one per instance.
  • Edits by ttr-trigger-idheader or ttr-custom-keyheader, one-shot or recurring. See Edit a trigger.
  • Past-dated triggers stored as skipped, which never fire. See Past-dated triggers.
  • Calls that then fail with 404 (Trigger not found, Generator not found) or 410 (Job is no longer in registered state, Generator is no longer active).

Units are never refunded. Cancelling a trigger doesn't give its unit back.

What doesn't use quota

These never use quota and keep working when your quota is used up:

Triggers you've already scheduled keep firing after you run out, and recurring triggers keep creating instances.

Checking your remaining quota

Every successful /schedule response includes monthQuotaRemaining:

{
"triggerId": "3f2b8c1e-7d4a-4e5b-9c2f-1a2b3c4d5e6f",
"scheduledAt": "2030-01-01T09:00:00.000Z",
"operation": "schedule",
"kind": "job",
"monthQuotaRemaining": 499
}
  • It's the number of /schedule calls your project has left this month, after this call. On the Free plan, the first call of the month returns 499 and the last call you're allowed returns 0.
  • It's null when your project has no monthly limit (Flex without a custom limit). If you use a client generated from the OpenAPI spec, make sure it accepts null here.
  • It's the only place your usage appears. No endpoint or dashboard page shows your plan, limit or usage, so to check your usage you have to make a /schedule call, which uses a unit.
  • HEAD responses have no body, so they don't include it. See HTTP method.

When the quota is used up

Once you've used your monthly limit, /schedule returns 402 Payment Required:

{
"_tag": "QuotaExceeded",
"message": "Monthly quota of 500 triggers exceeded"
}
  • The number in the message is your project's limit. The message says "triggers", but the limit counts /schedule calls.
  • Every valid /schedule call gets 402, including edits by ID or custom key and cron(...) calls. You can't edit triggers through /schedule while your quota is used up.
  • A 402 changes nothing. No trigger is created or updated, a trigger that already holds the same custom key is left alone, and the call doesn't use a unit.
  • Validation runs first, so a request that fails it still gets 400 or 401, not 402.
  • Retrying won't help until the quota resets at 00:00 UTC on the 1st or your limit changes. Until then, you can still cancel triggers and use the endpoints that don't use quota.

See Errors for the error format.

Limitations

The limit is enforced exactly for requests sent one after another. If several /schedule calls arrive at the same moment while you're close to the limit, more of them can be accepted than you had units left. Their monthQuotaRemaining values can repeat, so they don't show that you went over. Once the limit is reached, every later call gets 402.

TimeTriggers — Schedule HTTP requests at any time.