Skip to main content

How spend is metered

Spend is tracked per run and per month. The Usage tab shows month-to-date totals, per-run breakdowns, and budget remaining.

Viewing usage

GET /smr/projects/{project_id}/usage
Returns:
{
  "month_to_date": {
    "total_cost_cents": 1842,
    "breakdown": {
      "by_provider": { "openai": 1842 },
      "by_funding_source": { "synth": 1842 },
      "by_usage_category": { "orchestrator": 210, "worker": 1632 }
    }
  },
  "last_7_days": { ... },
  "per_run": [
    { "run_id": "...", "total_cost_cents": 923 },
    ...
  ],
  "budgets": {
    "monthly_usd_cents": 10000,
    "run_usd_cents": 2000,
    "summary": {
      "month_to_date_total_cost_cents": 1842,
      "monthly_budget_cents": 10000,
      "budget_remaining_cents": 8158,
      "latest_run_id": "...",
      "latest_run_total_cost_cents": 923
    }
  }
}
The Usage tab in the UI shows the same data.

Budget caps

Set on the project via PATCH /smr/projects/{project_id}:
{
  "budgets": {
    "monthly_usd_cents": 10000,
    "run_usd_cents": 2000
  }
}
FieldScopeWhat happens when hit
run_usd_centsSingle runRun stops immediately with stop_reason: budget_exhausted
monthly_usd_centsCalendar month across all runsNew runs are blocked until the next month
Both are hard stops enforced in the data plane. There are no soft warnings — the run stops. Set timebox_seconds when triggering to cap run duration; when hit, the run stops with stopped.

Entitlements

Managed Research requires a Pro or Team plan. Check GET /smr/projects/{project_id}/entitlements/managed_research for access status.

Pricing

Managed Research passes through LLM costs at cost. Orchestrator and worker agents run on gpt-5.2 by default; the optimization loop (GEPA/MIPRO) uses whatever model is configured in synth_ai.policy_optimization.policy.model. Typical run costs depend on the number of trials, the size of your dataset, and the model. A small GEPA run on Banking77 (n_trials=4, small dataset) costs a few cents. A full overnight optimization run with many trials will cost more — set run_usd_cents to cap it.