Skip to navigation

Create a rate card

Adds a new version of a custom cost model’s rates. A cost model from the provider price catalog gets its rate cards from the catalog, and a request for one is refused with 409: use overrides instead. Send effective_from to schedule it, or leave it out to save a draft and activate it later. A rate card never changes once it is active: a new version replaces it from its own effective_from, and the response lists what differs from the version before (changes) and which price rules the change touches (affected_price_rules). A new version must start after every earlier version of the cost model, including any that is still scheduled, and effective_from can’t be in the past: either one returns 400 with parameter_invalid on effective_from. A new version applies only from its start date onward. Recorded usage is never repriced: it keeps the version that priced it. In live mode an agent’s write is refused with 403 and proposal_required: put the same object in a config proposal. People change live configuration in the dashboard.

Authentication

AuthorizationBearer

A secret key (rl_sk_test_..., rl_sk_live_...) or a restricted key with limited scopes (rl_rk_test_..., rl_rk_live_...). A restricted key can carry agent: true and an expires_at, and is what a coding agent should hold. Keys end in a checksum so secret scanners can recognize them. People create, roll and revoke keys in the dashboard; GET /v1/api_keys lists them, masked.

Headers

Runledger-Dry-RunbooleanOptional

Send true to see what the write would do without doing it. The response is the normal body with dry_run: true, changes (path, before, after), warnings and errors added, and nothing is stored. Validation runs as it would for a real write. The request is kept in request logs, tagged Dry run. When the same change is then made for real, its audit event has dry_run_preceded: true.

Request

This endpoint expects an object.
currencystringRequired
Lowercase ISO 4217 code the rates are in.
rateslist of objectsRequired
cost_modelstringRequired

The cost model (ID or key) these rates belong to.

effective_fromdatetimeOptional

When this version starts to price usage. It must be now or later, and after the start of every earlier version of the cost model, including a scheduled one. A new version applies only from this date onward. Recorded usage is never repriced: events and costs dated before it keep the earlier version. Leave it out to save a draft.

as_ofdateOptional
The date you read these rates from the provider, so a person can see how fresh they are.
source_referencestringOptional<=500 characters
Where the rates came from, such as the provider's pricing page address or a contract reference.
reasonstringOptional<=500 characters
Why the rates changed. Recorded in the audit log.

Response

The new rate card.
idstring
object"rate_card"
cost_modelstring
The cost model ID.
versioninteger
1 for the first rate card of a cost model, then one more for each new card.
statusenum

draft: saved, not active. scheduled: becomes active at effective_from. active: in force. superseded: replaced by a later version.

Allowed values:
sourceenum

Where a cost model’s rates come from. catalog: the provider price catalog that Runledger maintains, with your overrides on top. custom: rate cards you enter yourself.

Allowed values:
currencystring
rateslist of objects
livemodeboolean
created_atdatetime
catalog_pricestringOptional

For source: catalog. The catalog price version these rates are (catp_...). Runledger creates one rate card for each catalog price version, with the same rates, effective_from, as_of and source. Your overrides are applied when a line is priced and are not part of the card.

effective_fromdatetimeOptional
effective_todatetimeOptional
When a later version replaced this one. Left out while it is in force.
as_ofdateOptional
source_referencestringOptional
source_urlstringOptionalformat: "uri"

For source: catalog. The catalog price version’s source.

changeslist of objectsOptional
What differs from the version before, rate by rate.
affected_price_ruleslist of stringsOptional
The keys of price rules that price from this cost model.
warningslist of objectsOptional

For example price_rule_held, which says a rule set to hold keeps its current prices and so its margin falls or rises with the new costs.

actorobjectOptional

Who made a change. Runledger fills it in from the credential, so a client can’t claim to be someone else: an API key always acts as itself, the dashboard calls the API as the signed-in person, and the MCP server passes the client’s name and the person it acts for. A request that sends a Runledger-Actor header is refused with 400 parameter_unknown.

Errors

400
Bad Request Error
401
Unauthorized Error
403
Forbidden Error
404
Not Found Error
409
Conflict Error
422
Unprocessable Entity Error
429
Too Many Requests Error
500
Internal Server Error