Costs

Get cost, bucketed by period and optionally grouped by one dimension (customer/feature/model/provider).

import weflayr

client = weflayr.client(api_key="wf-...")
const weflayr = require('weflayr');

const client = weflayr.client({ apiKey: 'wf-...' });
# Passed as a Bearer token on every request
export WEFLAYR_API_KEY="wf-..."

Get costs

from weflayr.openapi.models import CostsInput

client.get_costs(body=CostsInput.from_dict({
    "date_from": "2026-06-01",
    "aggregate": "week",
    "group_by": "customer",
    "customer_tags": {"region": ["EU", "NA"], "plan": "premium"},
    "run_tags": {"agent": ["orchestrator", "qa"]},
}))
await weflayr.api.getCosts({
  client,
  throwOnError: true,
  body: {
    dateFrom: '2026-06-01',
    aggregate: 'week',
    groupBy: 'customer',
    customerTags: { region: ['EU', 'NA'], plan: 'premium' },
    runTags: { agent: ['orchestrator', 'qa'] },
  },
});
curl -X POST https://app.weflayr.com/api/costs/ \
  -H "Authorization: Bearer $WEFLAYR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "date_from": "2026-06-01",
    "aggregate": "week",
    "group_by": "customer",
    "customer_tags": {"region": ["EU", "NA"], "plan": "premium"},
    "run_tags": {"agent": ["orchestrator", "qa"]}
  }'

Output:

{
  "rows": [
    {"date_from": "2026-06-01", "date_to": "2026-06-07", "customer": "c_123", "cost": 342.87, "avg_feature_run_cost": 1.42, "max_feature_run_cost": 6.10},
    {"date_from": "2026-06-01", "date_to": "2026-06-07", "customer": "c_456", "cost": 128.05, "avg_feature_run_cost": 0.85, "max_feature_run_cost": 2.30},
    {"date_from": "2026-06-08", "date_to": "2026-06-14", "customer": "c_123", "cost": 401.20, "avg_feature_run_cost": 1.55, "max_feature_run_cost": 7.40}
  ],
  "next_cursor": null,
  "has_more": false
}

Only the field named by group_by is present on each row (customer above); it’s omitted entirely when group_by is unset.

Input params: passed in the request body.

Field Accepts Behaviour
date_from
Required
"YYYY-MM-DD" Start of the period, inclusive.
date_to
Optional
"YYYY-MM-DD" End of the period, inclusive. Defaults to today.
aggregate
Optional
"day" | "week" | "month" | "quarter" | "year" | "all" One row per period; "all" collapses the whole date range into a single row (per group_by, if set). Defaults to "day".
group_by
Optional
"customer" | "feature" | "model" | "provider" Split each period into one row per dimension value. Omit for one row per period.
customers
Optional
list[string] Restrict to these customers. Omit for every customer. See Get customers.
features
Optional
list[string] Restrict to these feature tags. Omit for every feature. See Get features.
models
Optional
list[string] Restrict to these models. Omit for every model. See Get models.
providers
Optional
list[string] Restrict to these providers. Omit for every provider. See Get providers.
customer_tags
Optional
{tag_key: list[string] | string} Restrict to customers carrying these tags (AND across tag_key, OR within a tag_key’s values).
run_tags
Optional
{tag_key: list[string] | string} Restrict to runs carrying these tags (AND across tag_key, OR within a tag_key’s values).
apply_credits
Optional
boolean Apply free AI credits discounts to cost. Never applied to avg_feature_run_cost/max_feature_run_cost, which always report gross cost. Defaults to false.
limit
Optional
integer Max number of rows to fetch. Defaults to 100, max 1000.
cursor
Optional
string The route is paginated: pass the previous page’s next_cursor to fetch the next page. PS: has_more from the output says whether another page exists.