Overview
Two related features let you meter your end-users so you can build your own free and paid tiers:
- Per-user action limit. Set
monthly_action_limiton 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. - 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.
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.
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.
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_limitfor 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
nulllimit skips the check entirely (unlimited).
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
1GET /api/v1/account/usage
All query parameters are optional:
| Param | Meaning |
|---|---|
user_key | Scope the figures to a single end-user. Omit for the whole account. |
start_time | Start of a custom window, ISO 8601. |
end_time | End 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:
| Key | Type | Meaning |
|---|---|---|
usage | integer | Number of actions run in the window. This is what the limit caps. |
executions_count | integer | Number of workflow executions (runs) in the window. Distinct from actions. |
active_workflows_count | integer | Number of active (on) workflows. |
users_count | integer | Number of users in the account. |
start_time | string | Start of the window used. |
end_time | string | End 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, theusage,executions_count, andactive_workflows_countfigures are scoped to that user, butusers_countis always account-wide. - On the default (current-cycle) response,
start_timeandend_timecome 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:00and ends one second before the next cycle begins.
Common mistakes
These are the real support issues. Run through them before you rely on limits.
| Symptom | Cause | Fix |
|---|---|---|
| Setting one account-wide number doesn't cap anyone | The limit is per-user, not per-account. There is no single account-wide cap | Set monthly_action_limit on each end-user you want to bound |
| A user with no limit set is being blocked, or isn't | Treating an omitted field as zero. null or omitted means unlimited, not blocked | To block a user from running anything, set 0. To leave them uncapped, use null |
| The cap trips sooner or later than your run count suggests | Capping against runs. The limit counts actions (usage), and one run can spend several actions | Cap against usage. executions_count is reported separately; don't cap against it |
| A user's count doesn't reset on the 1st | The cycle is the account's anniversary day, not the calendar month | Expect the reset on the account's creation day of the month |
| A user finishes a cycle slightly over their limit | The limit doesn't stop a run that's already in progress | Treat the cap as a soft ceiling, not an exact hard stop |
| Nothing happens when a user hits the cap | There's no notification and no pause; the workflow just resumes next cycle | Poll the usage API if you need to detect and act on it |
| Changing the limit through one path seems ignored | Each path applies the field only when included, so the other path doesn't reset it | To change the value through a path, include the new value in that path (API or JWT) |
Next steps
- Retrieve Account Usage: the usage endpoint reference
- Account API: the full account endpoints
- Groups & Visibility: gate which items each end-user can see
