Usage & Billing
Read the Usage tab, understand how plan limits are resolved and enforced, and manage your subscription through Stripe.
Every organization has a set of usage limits that come from its subscription plan. The Usage tab shows where you stand against each one; this page explains what the numbers mean, how limits are enforced, and how billing works underneath.
This page covers mechanics only. For current plans and prices, see the Dynamiq pricing page.
The Usage tab
Open organization Settings → Usage. The header shows your current plan as a label next to the Usage title, and limits are grouped into two sections:

- Total resource limits — caps on how many of a resource can exist at once, counted across all projects in the organization.
- Monthly usage limits — caps that reset each billing period; the section subtitle shows the reset date (Resets <date>).
Each row shows a progress bar with used / limit counts. Two special states replace the bar:
- Unlimited — no cap applies to this limit on your plan.
- Not available on plan — the limit is
0; upgrade to use the feature at all.
What is measured
| Limit | Group | Counts |
|---|---|---|
| Apps | Total | Apps across all projects (archived and deleted Apps don't count) |
| Inference endpoints | Total | Deployed inference endpoints across all projects |
| Databases | Total | Deployed databases across all projects |
| Knowledge bases | Total | Knowledge Bases across all projects |
| Fine-tuning jobs | Total | Fine-tuning jobs across all projects |
| Services | Total | Deployed services across all projects |
| Conversation messages | Monthly | Messages sent in Chat |
| Prompt test runs | Monthly | Prompt test executions |
| Prompt generations | Monthly | AI-assisted prompt generations |
| Router chat completions | Monthly | Chat completions through the model router |
| App invocations | Monthly | Runs of your deployed Apps |
| Knowledge base ingestions | Monthly | Documents ingested into Knowledge Bases |
| Knowledge base retrievals | Monthly | Retrieval queries against Knowledge Bases |
How limits are resolved
For each limit key, the effective value is determined in this order:
- Per-organization override — Dynamiq operators can set an explicit value for a single organization; it wins over everything else.
- Billing disabled — on installations where billing is turned off (e.g. self-hosted), every limit is unlimited.
- Active subscription plans — the limit comes from your plan; if multiple subscriptions are active, the highest value across them applies. A key your plan doesn't define is unlimited.
- No active subscription — restrictive defaults apply: 1 App, 1 Knowledge Base, and 0 for everything else.
How limits are enforced
- Total limits are checked when you create or deploy the resource — creating an App, Knowledge Base, database, service, inference endpoint, or fine-tuning job fails once the cap is reached.
- Monthly limits are checked when the action happens — sending a Chat message, invoking an App, ingesting or retrieving from a Knowledge Base — and a usage counter is incremented on success.
When an organization is at its cap, the API returns the error code subscription_limit_reached with the message "This organization has reached its subscription limit. Please upgrade the plan." In the UI this surfaces as an upgrade prompt with the plan picker.
Monthly counters are tracked per billing period. The period is anchored to your subscription's start date and rolls over monthly from there; without an active subscription it falls back to calendar months (UTC).
Plans and subscriptions
Billing runs on Stripe:
- Creating an organization creates a matching Stripe customer. On hosted Dynamiq, users with a business email get a free plan subscription automatically for their first organization.
- An organization whose billing status is unset (no subscription yet) is shown the plan picker — an embedded Stripe pricing table — before entering the workspace. Choosing a plan creates the subscription; limits update as Stripe confirms it via webhook.
- Manage Billing opens the Stripe billing portal, where you change plans, update payment methods, and download invoices. Dynamiq itself never stores card details.
- Deleting the organization cancels its subscriptions immediately.
Subscription statuses are active, inactive, and canceled; limits are computed from active subscriptions only.
Usage and billing via the API
All endpoints require a Personal Access Token. Status, subscriptions, and limits are readable by any org member; the billing portal requires the Owner or Admin role:
| Method | Path | Purpose |
|---|---|---|
GET | /v1/orgs/{org_id}/billing/status | disabled, unset, active, or inactive |
GET | /v1/orgs/{org_id}/billing/subscriptions | Subscriptions with their plan (filter with ?status=) |
GET | /v1/orgs/{org_id}/billing/limits | The full limits report shown on the Usage tab |
GET | /v1/orgs/{org_id}/billing/stripe/billing-portal | A URL to the Stripe billing portal (Owner/Admin) |
Fetch the limits report:
curl "https://api.getdynamiq.ai/v1/orgs/$ORG_ID/billing/limits" \
-H "Authorization: Bearer $DYNAMIQ_PAT"import os
import requests
resp = requests.get(
f"https://api.getdynamiq.ai/v1/orgs/{os.environ['ORG_ID']}/billing/limits",
headers={"Authorization": f"Bearer {os.environ['DYNAMIQ_PAT']}"},
)
resp.raise_for_status()
report = resp.json()["data"]
for entry in report["limits"]:
cap = entry.get("limit", "unlimited")
print(f"{entry['key']}: {entry['used']} / {cap}")const res = await fetch(
`https://api.getdynamiq.ai/v1/orgs/${process.env.ORG_ID}/billing/limits`,
{ headers: { Authorization: `Bearer ${process.env.DYNAMIQ_PAT}` } },
);
const { data } = await res.json();
for (const entry of data.limits) {
console.log(`${entry.key}: ${entry.used} / ${entry.limit ?? 'unlimited'}`);
}The response contains the plan, the current period_start / period_end, and a limits array where each entry has a key (e.g. app.max_total_count), used, and — when a cap applies — limit and remaining. An entry without limit is unlimited.