Billing & FinOps

Preview — pending review

This reference is generated from the platform API contract and is still under review. Operations, fields, and descriptions can change before publication.

Export the credit consumption history as CSV (legacy compat)

Deprecated

POST
/scopes/{scopeId}/billing/credits/{creditId}/actions/exports

Legacy compat shim for exporting the credit grant's consumption history as CSV (originally the "Export CSV" action on the Consumption history panel of the Credits page). Deprecated — new integrations should call GET .../credits/{creditId}/exports/download instead, which streams the CSV synchronously in a single request; this POST is retained only so existing callers keep working. The credit grant itself is never mutated by this command. Validation: creditId must reference an existing credit grant visible in the scope (otherwise 404 NOT_FOUND); format, when supplied, must be csv (otherwise 422 VALIDATION_FAILED); the caller must hold a billing-capable role in the scope (otherwise 403 FORBIDDEN). Async & state: Despite the historical 202 status code, this call completes synchronously — there is no background worker, no pending/running transition, and no download URL in the result. The returned Operation is created already succeeded; the CSV bytes are NOT attached to this response — fetch them via GET .../exports/download. The credit resource emits no resource.updated frames because it is not modified. Errors: 401 unauthenticated; 403 caller lacks billing read permission in the scope; 404 unknown creditId in the scope; 422 unsupported export format; 500 on export pipeline failure. Idempotency/Concurrency: This operation does not use Idempotency-Key; it may be omitted and a sent one is ignored. Every call returns a freshly minted, already-succeeded Operation (a new id each time) and changes nothing.

Authorization

bearerToken
headerAuthorizationBearer <token>

An API token (pc_live_…) or a service-account key (sak_live_…), created in Identity & Access Management and sent as Authorization: Bearer <token>. Requests are rate limited per credential and per tenant: every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and a refused request gets 429 RATE_LIMITED with Retry-After.

Path Parameters

scopeId*string

Opaque ownership+authorization scope resolving to tenant + subscription + project.

creditId*string

Identifier of the credit grant whose consumption history is exported.

Request Body

application/json
  1. body

Options for a billing data export job.

format?"csv"

Export file format; only CSV is exposed by the UI.

Default"csv"
Value in"csv"

Response Body

Legacy compat response — an already-succeeded Operation with no artifact attached (download via the GET endpoint).

application/json
  1. response

A long-running operation record. GET /operations/{operationId} returns its current state.

id*string

Operation identifier, unique platform-wide.

action*string

Canonical action id that started this operation, e.g. compute.instance.create.

state*OperationState

State machine for long-running operations. PENDING and RUNNING are transitional; the rest are terminal.

Value in"PENDING""RUNNING""SUCCEEDED""FAILED""CANCELLED"
resourceKind?|

Kind of the target resource (matches RealtimeEvent.kind), null for resource-less actions.

resourceId?|

Identifier of the target resource; null until the resource is allocated.

resourceName?|

Human-readable name of the target resource captured when the operation was opened; null when unknown or the resource has been deleted (clients fall back to resourceId).

principalId?|

Subject id (user id/email or service-account id) of the actor that initiated this operation, captured at the create chokepoint; null on internal/worker paths with no request-scoped principal or for historical rows. This is the real actor the Activity feed renders.

sourceIp?|

Source IP address of the request that initiated this operation; null when unavailable (internal/worker paths, historical rows).

progressPercent?|

Best-effort progress; null when the action does not report progress.

Range0 <= value <= 100
error?|null

Populated only when state is FAILED (or CANCELLED with partial rollback notes).

warning?|null

Non-fatal degradation recorded on an operation that still SUCCEEDED - the primary action completed but something explicitly requested could not be delivered (e.g. publicIp was requested at instance create but no floating IP could be assigned). On a CANCELLED create it reports that the provider resource had already been created and was kept (live and billed until deleted; details.disposition = left_in_place). Same code+message shape as error so clients render both uniformly; null when the operation ran without degradation.

startedAt?|

When the worker began executing; null while PENDING.

finishedAt?|

When a terminal state was reached; null while transitional.

createdAt*string
updatedAt*string
curl -X POST "https://example.com/scopes/string/billing/credits/string/actions/exports" \  -H "Content-Type: application/json" \  -d '{}'
{  "id": "string",  "action": "string",  "state": "PENDING",  "resourceKind": "string",  "resourceId": "string",  "resourceName": "string",  "principalId": "string",  "sourceIp": "string",  "progressPercent": 0,  "error": {    "code": "string",    "message": "string",    "field": "string",    "details": {},    "retryable": false  },  "warning": {    "code": "string",    "message": "string",    "field": "string",    "details": {},    "retryable": false  },  "startedAt": "string",  "finishedAt": "string",  "createdAt": "string",  "updatedAt": "string"}