User Limits & Usage

Cap how many actions an individual end-user can run per billing cycle with monthly_action_limit, and read usage figures from the API, with copy-pasteable examples and the common mistakes to avoid.

Overview

Two related features let you meter your end-users so you can build your own free and paid tiers:

  1. Per-user action limit. Set monthly_action_limit on an end-user to cap how many actions that user may run per billing cycle. You manage it yourself, one user at a time. There is no account-wide cap and no built-in tier model, so you express your tiers by setting each user's limit.
  2. Usage API. Read how many actions have run in the current cycle (or an explicit date range), for the whole account or a single user.

An action is one unit of work a workflow performs, like an API call or a code step. A single workflow run produces one or more actions. Both the limit and the usage figure count actions, not runs.

Read this first

Most trouble here comes from a few recurring errors: treating an omitted limit as zero (it means unlimited), capping against workflow runs instead of actions, or expecting usage to reset on the 1st of the calendar month. If the numbers don't behave the way you expect, check Common mistakes first.

Jump to Common mistakes

Setting a user's monthly action limit

monthly_action_limit is an integer, or null. null or omitted means unlimited (no cap). Set it two ways. Either path works, and each applies the field only when you include it, so they don't overwrite each other.

REST API, with PUT /api/v1/users/{key}:

1
{ "monthly_action_limit": 5000 }

Discover JWT, by including a monthly_action_limit claim:

1
2
3
4
5
6
7
{
  "sub": "user_key_123",
  "name": "Alice",
  "email": "alice@example.com",
  "monthly_action_limit": 5000,
  "discover": true
}

The value is returned on the user object from GET /api/v1/users/{key} as monthly_action_limit (integer or null), so you can read back the current cap.

The limit is for end-users

monthly_action_limit is ignored for your account's own main (default) user on both the API and JWT paths. Set it on the end-users you want to bound.

How the limit is enforced

  • The cap is checked when a new workflow run is about to start for that user. If the user has already run at or above their monthly_action_limit for the current billing cycle, the new run is refused.
  • Runs already in progress finish. The limit never interrupts a run that has already started, so a user can end a cycle slightly above their limit. Treat the cap as a soft ceiling, not an exact cutoff. (A run can still stop early for unrelated reasons, like an action error, a callback that times out, or an explicit cancellation.)
  • A null limit skips the check entirely (unlimited).
No notification and no auto-pause

Nothing alerts you or the user when the cap is hit, and the workflow is not disabled. Refused runs simply don't start, and the user can run again automatically at the next billing cycle. If you need to act on consumption, poll the usage API.

Reading usage

1
GET /api/v1/account/usage

All query parameters are optional:

ParamMeaning
user_keyScope the figures to a single end-user. Omit for the whole account.
start_timeStart of a custom window, ISO 8601.
end_timeEnd of a custom window, ISO 8601.

For a custom window, pass both start_time and end_time. If either is missing, the response covers the current billing cycle.

Response keys:

KeyTypeMeaning
usageintegerNumber of actions run in the window. This is what the limit caps.
executions_countintegerNumber of workflow executions (runs) in the window. Distinct from actions.
active_workflows_countintegerNumber of active (on) workflows.
users_countintegerNumber of users in the account.
start_timestringStart of the window used.
end_timestringEnd of the window used.

For one user's current-cycle usage, GET /api/v1/account/usage?user_key=user_key_123:

1
2
3
4
5
6
7
8
{
  "usage": 1523,
  "executions_count": 847,
  "active_workflows_count": 42,
  "users_count": 150,
  "start_time": "2026-11-15T00:00:00Z",
  "end_time": "2026-12-14T23:59:59Z"
}

Usage is whole-account or single-user (by user_key). There is no ranked or all-users breakdown endpoint.

Two details to keep in mind:

  • When you pass user_key, the usage, executions_count, and active_workflows_count figures are scoped to that user, but users_count is always account-wide.
  • On the default (current-cycle) response, start_time and end_time come back as ISO 8601. If you pass them explicitly, the response echoes the exact strings you sent rather than normalizing them.

Billing cycle

The billing cycle is anchored to the account's creation day of the month, not the calendar month. Both the per-user limit and the default usage window use this cycle, so the numbers line up.

  • An account created on the 15th runs each cycle from the 15th through the 14th of the next month.
  • Short months are clamped. An account created on the 31st uses the last day of a shorter month, so a February cycle starts on Feb 28.
  • A cycle starts at 00:00:00 and ends one second before the next cycle begins.

Common mistakes

These are the real support issues. Run through them before you rely on limits.

SymptomCauseFix
Setting one account-wide number doesn't cap anyoneThe limit is per-user, not per-account. There is no single account-wide capSet monthly_action_limit on each end-user you want to bound
A user with no limit set is being blocked, or isn'tTreating an omitted field as zero. null or omitted means unlimited, not blockedTo block a user from running anything, set 0. To leave them uncapped, use null
The cap trips sooner or later than your run count suggestsCapping against runs. The limit counts actions (usage), and one run can spend several actionsCap against usage. executions_count is reported separately; don't cap against it
A user's count doesn't reset on the 1stThe cycle is the account's anniversary day, not the calendar monthExpect the reset on the account's creation day of the month
A user finishes a cycle slightly over their limitThe limit doesn't stop a run that's already in progressTreat the cap as a soft ceiling, not an exact hard stop
Nothing happens when a user hits the capThere's no notification and no pause; the workflow just resumes next cyclePoll the usage API if you need to detect and act on it
Changing the limit through one path seems ignoredEach path applies the field only when included, so the other path doesn't reset itTo change the value through a path, include the new value in that path (API or JWT)

Next steps