curl --request POST \
--url https://api.gigstack.io/v2/teams/{id}/billing/operations/{operationId}/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"operation_id": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({operation_id: '<string>'})
};
fetch('https://api.gigstack.io/v2/teams/{id}/billing/operations/{operationId}/cancel', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/teams/{id}/billing/operations/{operationId}/cancel"
payload = { "operation_id": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"data": {
"id": "c03839fa-20e3-4b56-86ba-d41d92e67f19",
"team_id": "team_example",
"billing_account_id": "account_example",
"effect_scope": "billing_account_shared",
"provider_environment": "sandbox",
"action": "checkout",
"status": "outcome_unknown",
"created_at": 1791500000000,
"updated_at": 1791500000000,
"recovery_available_at": 1791500600000,
"result": null,
"error": {
"code": "billing_result_unconfirmed",
"message": "Read the original operation before retrying",
"retryable": false
},
"resolution": null
},
"timestamp": 1791500000000
}Cancel an open account checkout
Requires a verified Firebase or signed personal MCP user with current unblocked team membership. Team API keys and OAuth tokens cannot act as their creator. Writes and operation readback/recovery require a current billing-account administrator. Effects are shared by the billing account. Staging always uses sandbox billing; credential livemode does not choose billing environment. Requires a NEW operation_id to expire the exact original checkout. The cancellation has its own durable readback. Confirmed expiry cancels the original and releases the lock. Already completed checkout cannot be cancelled and requires subscription management. Unknown expiry retains the cancellation lock; read/reconcile its new ID rather than replaying.
curl --request POST \
--url https://api.gigstack.io/v2/teams/{id}/billing/operations/{operationId}/cancel \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"operation_id": "<string>"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({operation_id: '<string>'})
};
fetch('https://api.gigstack.io/v2/teams/{id}/billing/operations/{operationId}/cancel', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.gigstack.io/v2/teams/{id}/billing/operations/{operationId}/cancel"
payload = { "operation_id": "<string>" }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"success": true,
"data": {
"id": "c03839fa-20e3-4b56-86ba-d41d92e67f19",
"team_id": "team_example",
"billing_account_id": "account_example",
"effect_scope": "billing_account_shared",
"provider_environment": "sandbox",
"action": "checkout",
"status": "outcome_unknown",
"created_at": 1791500000000,
"updated_at": 1791500000000,
"recovery_available_at": 1791500600000,
"result": null,
"error": {
"code": "billing_result_unconfirmed",
"message": "Read the original operation before retrying",
"retryable": false
},
"resolution": null
},
"timestamp": 1791500000000
}Authorizations
Authentication Method: HTTP Bearer token.
The runtime requires the literal Bearer prefix — a bare token in the
Authorization header is rejected with 401 unauthorized.
Header Format: Authorization: Bearer YOUR_API_KEY
Your API key is a JWT. Live keys operate on live data (livemode: true);
test keys operate on isolated test data (livemode: false).
Get your key at: app.gigstack.pro/settings?tab=api
Errors: credential failures are answered by the authentication layer with a raw
{ "message": … } body, not the standardized envelope — 401 for a missing, malformed or
expired token, 403 for a revoked key or a plan without API access. See the Unauthorized
and AuthForbidden responses.
Body
^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-4[a-fA-F0-9]{3}-[89abAB][a-fA-F0-9]{3}-[a-fA-F0-9]{12}$