Skip to content
Hardcount
Run it locally
Pre-1.0 · one maintainer · Stripe and cards only · no SDKs (client libraries) yet · no production users yet. Docs describe v0.9.1 (29 Oct 2026) · What’s new →

Create or update a provider cost rate

PUT
/v1/provider-costs
curl --request PUT \
--url http://localhost:8080/v1/provider-costs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "provider": "example", "model": "example", "token_type": "example", "unit_cost_cents": "example", "currency": "USD" }'
Idempotency-Key
string

Makes the call safe to retry. Send a unique value (a UUID works) and the same value on every retry. For 24 hours, a repeat with the same key, method, path and body gets the first response again, with an Idempotent-Replayed: true header, instead of running again. The error cases are in docs/api-surface.md. The usage routes do not take it: each usage event carries its own idempotency_key.

Media typeapplication/json
object
provider
required
string
model
required

Model family token or raw snapshot id — raw ids match first at ingest.

string
token_type
required

ADR-044 role — input / output / cache_read.

string
unit_cost_cents
required

US cents per token, as a decimal string (e.g. “0.0003” = $3.00 per 1,000,000 tokens). 0 or more, under 10^10, at most 12 decimal places (trailing zeros do not count), and at most 100 characters. A JSON number is also read.

string
currency

Rates are in USD only, the currency LiteLLM reports cost in. Any other value is 422.

string
default: USD
Allowed values: USD

Upserted rate

Media typeapplication/json
object
id
required
string
tenant_id
string
provider
required
string
model
required
string
token_type
required
string
unit_cost_cents
required

US cents per token, as a decimal string (e.g. “0.0003” = $3.00 per 1,000,000 tokens).

string
currency
required

Always USD. Cost and margin count every rate in US cents.

string
Allowed values: USD
created_at
required
string format: date-time
updated_at
required
string format: date-time

Example

{
"currency": "USD"
}

validation_error: a required field is missing, unit_cost_cents is not a number or is outside its limits, currency is not USD, or the body has an unknown field such as cost_per_token (param names the field; the body must use only the fields listed here).

Media typeapplication/json
object
error
object
type

One of invalid_request_error, authentication_error, rate_limit_error or api_error. Every error the API answers has this shape, including an unknown path (404, code route_not_found) and a method the path does not take (405, code method_not_allowed, with an Allow header). The few exceptions are listed in docs/api-surface.md.

string
code
string
message
string
request_id
string
param

The request field the error is about. Sent only when the error names one. A request body may hold only the fields its operation lists, spelled and cased as listed: any other field, or one the server sets (such as id), is refused with 422 and param naming it. An operation with no request body lists no fields: send no body, {} or null. The Stripe and Postmark webhooks and the LiteLLM callback take their sender’s body as it comes.

string

Example

{
"error": {
"type": "invalid_request_error"
}
}