Operation details
GET /v1/billing-bridge/keys
List the reseller billing bridge keys
- operationId
listResellerBillingBridgeKeys- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:reseller.customers.manage
Description (from the contract)
Bearer session of the active reseller (tenant session, reseller.customers.manage; 403 reseller_inactive when the tenant is not an active reseller). Lease feature module.billing.bridge (403 entitlement_feature_denied when the plugin is not enabled). Keys are paged by (created_at DESC, id DESC); the secret is never returned here.
Parameters
listResellerBillingBridgeKeys Parameters| Name | In | Type | Required | Description |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | — |
|---|
Responses
listResellerBillingBridgeKeys Responses| Status | Description |
|---|
200 | One page of keys. Fields:items: array<BillingBridgeKey> next_cursor: string has_more: boolean |
|---|
400 | The request body or parameters are invalid. |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
503 | A required dependency is unavailable. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/keys
Create a reseller billing bridge key
- operationId
createResellerBillingBridgeKey- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:reseller.customers.manage
Description (from the contract)
Bearer session of the active reseller (tenant session, reseller.customers.manage; 403 reseller_inactive when the tenant is not an active reseller), MFA step-up proof (audience billing-bridge, action billing_bridge.key.create) in step_up_token; 403 mfa_step_up_required without it. ip_allowlist is required (1–32 addresses or CIDR networks, no /0). The secret is returned once in this response and only its pepper-derived seed is stored. Audit billing_bridge.key.created.
Request body
application/json · Required:Yes
createResellerBillingBridgeKey Request body| Name | Type | Required | Description |
|---|
name | string | Yes | — |
|---|
ip_allowlist | array<string> | Yes | — |
|---|
expires_at | string(date-time) | No | — |
|---|
step_up_token | string | Yes | — |
|---|
Responses
createResellerBillingBridgeKey Responses| Status | Description |
|---|
201 | The key and its one-time secret. Fields:key: BillingBridgeKey secret: string |
|---|
400 | The request body or parameters are invalid. |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
415 | Content-Type must be exactly application/json without parameters. |
|---|
503 | A required dependency is unavailable. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/keys/{id}/revoke
Revoke a reseller billing bridge key
- operationId
revokeResellerBillingBridgeKey- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:reseller.customers.manage
Description (from the contract)
Step-up action billing_bridge.key.revoke bound to the key id. Revocation is final. Audit billing_bridge.key.revoked.
Parameters
revokeResellerBillingBridgeKey Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Request body
application/json · Required:Yes
revokeResellerBillingBridgeKey Request body| Name | Type | Required | Description |
|---|
expected_revision | integer(int64) | Yes | — |
|---|
step_up_token | string | Yes | — |
|---|
Responses
revokeResellerBillingBridgeKey Responses| Status | Description |
|---|
200 | The revoked key. Fields:id: string(uuid) key_id: string owner_scope_id: string(uuid) owner_kind: string: platform / reseller name: string ip_allowlist: array<string> status: string: active / revoked expires_at: string(date-time) last_used_at: string(date-time) created_by: string(uuid) revision: integer(int64) created_at: string(date-time) updated_at: string(date-time) revoked_at: string(date-time) |
|---|
400 | The request body or parameters are invalid. |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
404 | The requested resource was not found. |
|---|
409 | The requested state conflicts with an existing resource or idempotency fact. |
|---|
503 | A required dependency is unavailable. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/keys/{id}/rotate
Rotate the secret of a reseller billing bridge key
- operationId
rotateResellerBillingBridgeKey- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:reseller.customers.manage
Description (from the contract)
Step-up action billing_bridge.key.rotate bound to the key id. The old secret stops working at once; the new one is returned once. 409 revision_conflict on a stale expected_revision, 409 key_revoked for a revoked key. Audit billing_bridge.key.rotated.
Parameters
rotateResellerBillingBridgeKey Parameters| Name | In | Type | Required | Description |
|---|
id | path | string(uuid) | Yes | — |
|---|
Request body
application/json · Required:Yes
rotateResellerBillingBridgeKey Request body| Name | Type | Required | Description |
|---|
expected_revision | integer(int64) | Yes | — |
|---|
step_up_token | string | Yes | — |
|---|
Responses
rotateResellerBillingBridgeKey Responses| Status | Description |
|---|
200 | The key and its new one-time secret. Fields:key: BillingBridgeKey secret: string |
|---|
400 | The request body or parameters are invalid. |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
404 | The requested resource was not found. |
|---|
409 | The requested state conflicts with an existing resource or idempotency fact. |
|---|
503 | A required dependency is unavailable. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/billing-bridge/logs
List the reseller billing bridge call log
- operationId
listResellerBillingBridgeLogs- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:reseller.customers.manage
Description (from the contract)
Calls made with the caller's own keys only (owner scope), newest first, cursor paged. Denied calls carry the internal reason_code the caller of the bridge never sees. Rows are kept 90 days.
Parameters
listResellerBillingBridgeLogs Parameters| Name | In | Type | Required | Description |
|---|
limit | query | integer | No | — |
|---|
cursor | query | string | No | — |
|---|
Responses
listResellerBillingBridgeLogs Responses| Status | Description |
|---|
200 | One page of log rows. Fields:items: array<BillingBridgeLogEntry> next_cursor: string has_more: boolean |
|---|
400 | The request body or parameters are invalid. |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
503 | A required dependency is unavailable. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/billing-bridge/ping
Billing system TestConnection with a signed bridge key
- operationId
pingBillingBridge- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Signed with the bridge headers (billingBridgeSignature). Any authentication failure (unknown key, clock skew over 300 s, replayed nonce, wrong signature, source IP outside the allowlist, revoked or expired key, owner no longer an active reseller) is 401 unauthorized with no further detail; the reason is written to the bridge log. A valid key whose plugin is not enabled gets 403 entitlement_feature_denied. Bridge keys authenticate only /v1/billing-bridge/* facade routes; every other route rejects them.
Responses
pingBillingBridge Responses| Status | Description |
|---|
200 | The key owner and server time. Fields:owner_kind: string: platform / reseller owner_scope_id: string(uuid) module_enabled: boolean server_time: string(date-time) |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.
↑ Back to list
GET /v1/billing-bridge/products
Billing system ConfigOptions — the key owner's published packages
- operationId
listBillingBridgeProducts- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
A (reseller key): the reseller's own published packages with its wholesale cost per period; B (platform key): the platform's published packages (no wholesale_minor).
Responses
listBillingBridgeProducts Responses| Status | Description |
|---|
200 | Published packages. Fields:data: array<BillingBridgeProduct> |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/services
Billing system CreateAccount — open a CDN service for a billing service
- operationId
createBillingBridgeService- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
(owner, external_system, external_service_id) is the idempotency key of the service: repeating it with the same input returns the same service (200, created false); other input is 409 bridge_service_conflict. The customer of (external_system, external_client_id) is found or opened (A: a reseller customer, B: a platform direct customer; username {system}_{client_id}, a short suffix on a clash, random password not returned). A places the order for its customer and pays the prepaid wholesale cost (422 reseller_prepaid_insufficient, reseller_wholesale_unpriced); B opens the subscription without a charge.
Parameters
createBillingBridgeService Parameters| Name | In | Type | Required | Description |
|---|
Idempotency-Key | header | string | Yes | {system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict. |
|---|
Request body
application/json · Required:Yes
createBillingBridgeService Request body| Name | Type | Required | Description |
|---|
external_system | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
external_service_id | string | Yes | — |
|---|
external_client_id | string | Yes | — |
|---|
client | object | Yes | — |
|---|
product_id | string(uuid) | Yes | — |
|---|
product_revision | integer(int64) | No | — |
|---|
period | string: month / quarter / year | Yes | — |
|---|
Responses
createBillingBridgeService Responses| Status | Description |
|---|
201 | Opened (created true). Fields:data: BillingBridgeService |
|---|
200 | Already opened by an earlier call (created false). Fields:data: BillingBridgeService |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/billing-bridge/services/{system}/{service_id}
Billing system ClientArea — one service of the key owner
- operationId
getBillingBridgeService- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
A service of another owner, or not opened, is 404 bridge_service_not_found.
Parameters
getBillingBridgeService Parameters| Name | In | Type | Required | Description |
|---|
system | path | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
service_id | path | string | Yes | — |
|---|
Responses
getBillingBridgeService Responses| Status | Description |
|---|
200 | The service. Fields:data: BillingBridgeService |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/services/{system}/{service_id}/change
Billing system ChangePackage
- operationId
changeBillingBridgeService- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Upgrade or downgrade by the new and the current period price (same price is an upgrade), effective at once. A: between the reseller's packages, prorated wholesale difference charged or returned; B: between platform packages, no customer charge.
Parameters
changeBillingBridgeService Parameters| Name | In | Type | Required | Description |
|---|
system | path | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
service_id | path | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | {system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict. |
|---|
Request body
application/json · Required:No
changeBillingBridgeService Request body| Name | Type | Required | Description |
|---|
product_id | string(uuid) | Yes | — |
|---|
product_revision | integer(int64) | No | — |
|---|
period | string: month / quarter / year | No | — |
|---|
Responses
changeBillingBridgeService Responses| Status | Description |
|---|
200 | The service after the action. Fields:data: BillingBridgeService |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/services/{system}/{service_id}/renew
Billing system Renew
- operationId
renewBillingBridgeService- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Extends the term by period (default the current period). A renews for its customer at the wholesale cost; B renews without a charge. A retry with the same Idempotency-Key does not renew twice.
Parameters
renewBillingBridgeService Parameters| Name | In | Type | Required | Description |
|---|
system | path | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
service_id | path | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | {system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict. |
|---|
Request body
application/json · Required:No
renewBillingBridgeService Request body| Name | Type | Required | Description |
|---|
period | string: month / quarter / year | No | — |
|---|
Responses
renewBillingBridgeService Responses| Status | Description |
|---|
200 | The service after the action. Fields:data: BillingBridgeService |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/services/{system}/{service_id}/sso
Billing system ServiceSingleSignOn — one-time console sign-in link
- operationId
issueBillingBridgeSso- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Returns {url, expires_at}: url is {console}/sso/bridge?ticket=…, valid 60 seconds and once. Only the ticket's digest is stored. Audited as billing_bridge.sso.issued.
Parameters
issueBillingBridgeSso Parameters| Name | In | Type | Required | Description |
|---|
system | path | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
service_id | path | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | {system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict. |
|---|
Request body
application/json · Required:No
issueBillingBridgeSso Request body| Name | Type | Required | Description |
|---|
redirect | string | No | Same-site path after sign-in (default /). |
|---|
Responses
issueBillingBridgeSso Responses| Status | Description |
|---|
200 | The sign-in link. Fields:data: object |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/services/{system}/{service_id}/suspend
Billing system Suspend — stop this service only
- operationId
suspendBillingBridgeService- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Suspends the subscription: its sites stop being published, configuration is kept, the term keeps running. Other services of the customer are untouched. Already suspended succeeds without a change.
Parameters
suspendBillingBridgeService Parameters| Name | In | Type | Required | Description |
|---|
system | path | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
service_id | path | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | {system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict. |
|---|
Request body
application/json · Required:No
suspendBillingBridgeService Request body| Name | Type | Required | Description |
|---|
reason | string | No | — |
|---|
Responses
suspendBillingBridgeService Responses| Status | Description |
|---|
200 | The service after the action. Fields:data: BillingBridgeService |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/services/{system}/{service_id}/terminate
Billing system Terminate
- operationId
terminateBillingBridgeService- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Cancels the subscription (sites stop) and marks the service terminated; when the customer has no other live service of this owner, the CDN account is disabled. Later actions are 409 bridge_service_terminated.
Parameters
terminateBillingBridgeService Parameters| Name | In | Type | Required | Description |
|---|
system | path | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
service_id | path | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | {system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict. |
|---|
Responses
terminateBillingBridgeService Responses| Status | Description |
|---|
200 | The service after the action. Fields:data: BillingBridgeService |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
POST /v1/billing-bridge/services/{system}/{service_id}/unsuspend
Billing system Unsuspend
- operationId
unsuspendBillingBridgeService- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Republishes the subscription. Already active succeeds without a change.
Parameters
unsuspendBillingBridgeService Parameters| Name | In | Type | Required | Description |
|---|
system | path | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
service_id | path | string | Yes | — |
|---|
Idempotency-Key | header | string | Yes | {system}:{service_id}:{action}:{billing task, invoice ID or date}. A retry with the same key and body replays the result; another body with the same key is 409 bridge_service_conflict. |
|---|
Responses
unsuspendBillingBridgeService Responses| Status | Description |
|---|
200 | The service after the action. Fields:data: BillingBridgeService |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/billing-bridge/settings
Read the reseller billing bridge plugin settings
- operationId
getResellerBillingBridgeSettings- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:reseller.customers.manage
Description (from the contract)
Reseller plugin settings. sso_require_mfa defaults to false (bridge SSO skips the second factor); revision 0 means never saved. Lease feature module.billing.bridge (403 entitlement_feature_denied).
Responses
getResellerBillingBridgeSettings Responses| Status | Description |
|---|
200 | Current settings. Fields:sso_require_mfa: boolean revision: integer(int64) updated_at?: string(date-time) |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
503 | A required dependency is unavailable. |
|---|
What to do on failure
401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
PUT /v1/billing-bridge/settings
Change the reseller billing bridge plugin settings
- operationId
putResellerBillingBridgeSettings- Auth
- Session: the Bearer session of a signed-in control plane user, used by the customer in their own control plane; a plugin must never ask for it.
- Required permissions
All of:reseller.customers.manage
Description (from the contract)
Requires a step-up proof (audience billing-bridge, action billing_bridge.settings.update, bound to the owner scope): turning MFA off weakens every bridge SSO sign-in. expected_revision is the revision read (0 for the first save); a stale revision is 409. Audited as billing_bridge.settings.updated.
Request body
application/json · Required:Yes
putResellerBillingBridgeSettings Request body| Name | Type | Required | Description |
|---|
sso_require_mfa | boolean | Yes | — |
|---|
expected_revision | integer(int64) | Yes | — |
|---|
step_up_token | string | Yes | — |
|---|
Responses
putResellerBillingBridgeSettings Responses| Status | Description |
|---|
200 | Saved settings. Fields:sso_require_mfa: boolean revision: integer(int64) updated_at?: string(date-time) |
|---|
400 | The request body or parameters are invalid. |
|---|
401 | Authentication failed or the session is invalid. |
|---|
403 | The authenticated principal is not allowed to perform the action. |
|---|
409 | The requested state conflicts with an existing resource or idempotency fact. |
|---|
503 | A required dependency is unavailable. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list
GET /v1/billing-bridge/usage
Billing system UsageUpdate — current billing cycle usage
- operationId
getBillingBridgeUsage- Auth
- API key: header Authorization: CdncaKey <key_id>.<secret>. Effective permissions are the key scopes intersected with the owner’s current permissions.
- Required permissions
The contract has no separate permission annotation; see the description below and the 403 response.
Description (from the contract)
Up to 100 ids; ids that are not the owner's opened services are left out.
Parameters
getBillingBridgeUsage Parameters| Name | In | Type | Required | Description |
|---|
external_system | query | string: whmcs / zjmf / zjmf_cbap | Yes | — |
|---|
ids | query | string | Yes | Comma-separated external_service_id (1–100). |
|---|
Responses
getBillingBridgeUsage Responses| Status | Description |
|---|
200 | Usage of the current billing cycle. Fields:data: array<BillingBridgeUsage> |
|---|
400 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
401 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
403 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
404 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
409 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
412 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
422 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
503 | {"error":{"code","message","request_id"}}. Codes: bridge_unauthenticated 401, entitlement_feature_denied 403, bridge_service_not_found 404, bridge_product_not_found 404, bridge_service_conflict 409, bridge_service_terminated 409, reseller_prepaid_insufficient 422, reseller_wholesale_unpriced 422, bridge_validation_error 400; other package commerce codes as they are. |
|---|
What to do on failure
400 Fix the parameters or body per the field list; do not retry unchanged.401 Check the credential format and whether it expired or was rotated.403 Check the key scopes, the owner’s current permissions and the tenant scope; never switch to a more privileged account.404 The resource does not exist or belongs to another tenant.409 Read the current state first; a retry of the same operation keeps the original Idempotency-Key and body.412 The revision changed: read the latest ETag, decide again, then send the new If-Match.503 A dependency is unavailable: retry later with the original Idempotency-Key.
↑ Back to list