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.
Remove a payment card from the scope
Removes the selected payment card from the scope ("Remove card" in the Payment methods page). Deletion
revokes the processor token and removes the card from the scoped list; the card disappears from the
auto-pay configuration. Removal is blocked while the card is load-bearing — e.g. it is the default
card backing auto-pay for open UNPAID/OVERDUE invoices references it —
and the blocker is reported to the caller instead of leaving billing in an unpayable state.
Validation: paymentMethodId must reference an existing payment method visible in the scope
(otherwise 404 NOT_FOUND); deletion must not be blocked by an unresolved dependency — default card
with auto-pay enabled and open invoices, or a pending charge in flight (otherwise 409
DEPENDENCY_BLOCKED with the concrete blocker); the caller must hold destructive billing permissions
(otherwise 403 FORBIDDEN).
Async & state: Asynchronous soft delete; returns 202 with an Operation that moves pending →
running → succeeded (token revoked, card removed from the list; a resource.updated SSE frame with
kind: payment_method, patch: {status: deleting} then a terminal removal frame are emitted) or failed
(the card stays queryable and recoverable in its prior state).
Errors: 401 unauthenticated; 403 caller lacks destructive billing permission; 404 unknown
paymentMethodId in the scope; 409 DEPENDENCY_BLOCKED when the card backs auto-pay for open invoices
or has a charge in flight; 500 on revocation failure.
Idempotency/Concurrency: This operation does not use Idempotency-Key; it may be omitted
and a sent one is ignored. The card is hard-deleted inline and a new already-SUCCEEDED Operation
is returned; repeating the delete after it succeeded answers 404 NOT_FOUND because the card is
gone. This operation does not check If-Match; a sent one is ignored.
bearerTokenAuthorizationBearer <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.
scopeId*stringOpaque ownership+authorization scope resolving to tenant + subscription + project.
paymentMethodId*stringIdentifier of the payment method to remove.
Deletion accepted; track token revocation and removal via the returned Operation.
application/json- response
A long-running operation record. GET /operations/{operationId} returns its current state.
id*stringOperation identifier, unique platform-wide.
action*stringCanonical action id that started this operation, e.g. compute.instance.create.
state*OperationStateState machine for long-running operations. PENDING and RUNNING are transitional; the rest are terminal.
"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.
0 <= value <= 100error?|nullPopulated only when state is FAILED (or CANCELLED with partial rollback notes).
warning?|nullNon-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*stringupdatedAt*stringcurl -X DELETE "https://example.com/scopes/string/billing/payment-methods/string"{ "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"}