Fireblocks Canton (Beta) API
The Canton (Beta) API from Fireblocks — 2 operation(s) for canton (beta).
The Canton (Beta) API from Fireblocks — 2 operation(s) for canton (beta).
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/fireblocks:fireblocks-canton-beta-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Fireblocks Canton (Beta) API
description: 'Fireblocks provides a suite of applications to manage digital asset operations and a complete development platform to build your business on the blockchain.
- Visit our website for more information: Fireblocks Website
- Visit our developer docs: Fireblocks DevPortal'
version: 1.6.2
contact:
email: developers@fireblocks.com
servers:
- url: https://api.fireblocks.io/v1
description: Fireblocks Production Environment Base URL
- url: https://sandbox-api.fireblocks.io/v1
description: Fireblocks Sandbox Environment Base URL
tags:
- name: Canton (Beta)
paths:
/operations/canton/calls:
post:
operationId: createCantonCall
summary: Make a Canton call
description: Submits a Canton call from a vault account's Canton wallet. `type` selects the call and the shape of `payload`.
tags:
- Canton (Beta)
x-rate-limit-category: write
parameters:
- $ref: '#/components/parameters/X-Idempotency-Key'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CantonCall'
responses:
'201':
description: The outgoing transaction that carries the call.
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/CallAccepted'
'400':
description: Unknown or missing type, a missing required payload field, or an invalid party id, blockchainId, or expiry
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
'404':
description: No Canton wallet for this vault account and blockchainId, or an unknown end investor for this tenant
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
'409':
description: The target is not in a state this call can act on, or more than one candidate contract matched the wallet
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
'501':
description: 'This call type is not yet available: DTCC_END_INVESTOR_INVITE_CANCEL, DTCC_ALLOW_LIST_ADD, DTCC_ALLOW_LIST_REMOVE'
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
default:
$ref: '#/components/responses/Error'
x-readme:
code-samples:
- language: typescript
code: 'const response: Promise<FireblocksResponse<CallAccepted>> = fireblocks.cantonBeta.createCantonCall(cantonBetaApiCreateCantonCallRequest);'
name: Fireblocks SDK TypeScript example
- language: java
code: CompletableFuture<ApiResponse<CallAccepted>> response = fireblocks.cantonBeta().createCantonCall(cantonCall, idempotencyKey);
name: Fireblocks SDK Java example
- language: python
code: response = fireblocks.canton_beta.create_canton_call(canton_call, idempotency_key);
name: Fireblocks SDK Python example
x-codeSamples:
- lang: TypeScript
source: 'const response: Promise<FireblocksResponse<CallAccepted>> = fireblocks.cantonBeta.createCantonCall(cantonBetaApiCreateCantonCallRequest);'
- lang: Java
source: CompletableFuture<ApiResponse<CallAccepted>> response = fireblocks.cantonBeta().createCantonCall(cantonCall, idempotencyKey);
- lang: Python
source: response = fireblocks.canton_beta.create_canton_call(canton_call, idempotency_key);
/operations/canton/offers/{offerId}/responses:
post:
operationId: respondToCantonOffer
summary: Answer an offer
description: Responds to an incoming Canton offer. Set `responseType` to one of the values in the offer transaction's `cantonDetails.offerResponse.availableResponses`.
tags:
- Canton (Beta)
x-rate-limit-category: write
parameters:
- in: path
name: offerId
required: true
description: The Fireblocks transaction id of the incoming offer being answered.
schema:
type: string
example: 5a1d8b0f-2c31-4c7e-9d0a-118e7b6c4a21
- $ref: '#/components/parameters/X-Idempotency-Key'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OfferResponse'
responses:
'201':
description: The outgoing transaction that carries the response. Its on-chain outcome arrives by webhook as a status update on this transaction.
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/OfferResponseAccepted'
'400':
description: Unknown or missing responseType, or a missing required payload field, or the response is not available to this workspace's side of the offer (a sender sending accept/reject, a receiver sending withdraw)
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
'404':
description: Unknown offer id for this tenant
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
'409':
description: 'The offer cannot take this response now. An accept or reject: the offer is already answered, expired, or a response is in flight. ALLOCATION_WITHDRAW — which is sent AFTER the accept, on the same offer: the allocation is not ALLOCATED, because the accept has not settled yet, or it was already withdrawn or settled by the venue. The message names the state.'
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
'501':
description: This responseType is not yet available
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
default:
$ref: '#/components/responses/Error'
x-readme:
code-samples:
- language: typescript
code: 'const response: Promise<FireblocksResponse<OfferResponseAccepted>> = fireblocks.cantonBeta.respondToCantonOffer(cantonBetaApiRespondToCantonOfferRequest);'
name: Fireblocks SDK TypeScript example
- language: java
code: CompletableFuture<ApiResponse<OfferResponseAccepted>> response = fireblocks.cantonBeta().respondToCantonOffer(offerResponse, offerId, idempotencyKey);
name: Fireblocks SDK Java example
- language: python
code: response = fireblocks.canton_beta.respond_to_canton_offer(offer_response, offer_id, idempotency_key);
name: Fireblocks SDK Python example
x-codeSamples:
- lang: TypeScript
source: 'const response: Promise<FireblocksResponse<OfferResponseAccepted>> = fireblocks.cantonBeta.respondToCantonOffer(cantonBetaApiRespondToCantonOfferRequest);'
- lang: Java
source: CompletableFuture<ApiResponse<OfferResponseAccepted>> response = fireblocks.cantonBeta().respondToCantonOffer(offerResponse, offerId, idempotencyKey);
- lang: Python
source: response = fireblocks.canton_beta.respond_to_canton_offer(offer_response, offer_id, idempotency_key);
components:
parameters:
X-Idempotency-Key:
name: Idempotency-Key
in: header
description: A unique identifier for the request. If the request is sent multiple times with the same idempotency key, the server will return the same response as the first request. The idempotency key is valid for 24 hours.
required: false
schema:
type: string
schemas:
ErrorSchema:
type: object
properties:
message:
type: string
code:
type: number
OfferResponseTransferReject:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- TRANSFER_REJECT
example: TRANSFER_REJECT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Reject an inbound 2-step transfer offer. Carries no arguments.
OfferResponseAccepted:
type: object
description: The outgoing transaction that carries the response. Its on-chain outcome arrives by webhook as a status update on this transaction.
properties:
transactionId:
type: string
example: 5a1d8b0f-2c31-4c7e-9d0a-118e7b6c4a21
description: The outgoing response transaction.
status:
type: string
example: SUBMITTED
description: The transaction's status at the time of this response — `SUBMITTED`.
responseType:
type: string
example: DTCC_END_INVESTOR_ONBOARDING_REJECT
description: The response type you sent, echoed back so you can correlate without re-reading.
required:
- transactionId
- status
- responseType
OfferResponseAllocationAccept:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- ALLOCATION_ACCEPT
example: ALLOCATION_ACCEPT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Accept a CIP-56 allocation request. Carries no arguments.
EndInvestorPayload:
type: object
description: The end investor a call acts on.
properties:
endInvestor:
type: string
example: investor-party::1220abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
description: The end investor's Canton party id.
required:
- endInvestor
CantonCallAllowListRemove:
type: object
additionalProperties: false
properties:
type:
type: string
enum:
- DTCC_ALLOW_LIST_REMOVE
example: DTCC_ALLOW_LIST_REMOVE
description: Which call to make. Selects the shape of `payload`.
vaultAccountId:
type: string
example: '12'
description: The vault account whose Canton wallet makes this call.
blockchainId:
type: string
enum:
- CANTON
- CANTON_TEST
example: CANTON
description: The blockchain the vault account's Canton party is connected to — `CANTON` or `CANTON_TEST`.
payload:
$ref: '#/components/schemas/AllowListPayload'
required:
- type
- vaultAccountId
- blockchainId
- payload
OfferResponseTradewebReject:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- TRADEWEB_COSIGNING_DELEGATION_REJECT
example: TRADEWEB_COSIGNING_DELEGATION_REJECT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Reject a Tradeweb co-signing delegation offer. Carries no arguments — Tradeweb does not record a reject reason on the ledger, so none is accepted.
OfferResponse:
oneOf:
- $ref: '#/components/schemas/OfferResponseDtccOnboardingAccept'
- $ref: '#/components/schemas/OfferResponseDtccOnboardingReject'
- $ref: '#/components/schemas/OfferResponseTradewebAccept'
- $ref: '#/components/schemas/OfferResponseTradewebReject'
- $ref: '#/components/schemas/OfferResponseAllocationAccept'
- $ref: '#/components/schemas/OfferResponseAllocationReject'
- $ref: '#/components/schemas/OfferResponseTransferAccept'
- $ref: '#/components/schemas/OfferResponseTransferReject'
- $ref: '#/components/schemas/OfferResponseTransferWithdraw'
- $ref: '#/components/schemas/OfferResponseAllocationWithdraw'
discriminator:
propertyName: responseType
mapping:
DTCC_END_INVESTOR_ONBOARDING_ACCEPT: '#/components/schemas/OfferResponseDtccOnboardingAccept'
DTCC_END_INVESTOR_ONBOARDING_REJECT: '#/components/schemas/OfferResponseDtccOnboardingReject'
TRADEWEB_COSIGNING_DELEGATION_ACCEPT: '#/components/schemas/OfferResponseTradewebAccept'
TRADEWEB_COSIGNING_DELEGATION_REJECT: '#/components/schemas/OfferResponseTradewebReject'
ALLOCATION_ACCEPT: '#/components/schemas/OfferResponseAllocationAccept'
ALLOCATION_REJECT: '#/components/schemas/OfferResponseAllocationReject'
TRANSFER_ACCEPT: '#/components/schemas/OfferResponseTransferAccept'
TRANSFER_REJECT: '#/components/schemas/OfferResponseTransferReject'
TRANSFER_WITHDRAW: '#/components/schemas/OfferResponseTransferWithdraw'
ALLOCATION_WITHDRAW: '#/components/schemas/OfferResponseAllocationWithdraw'
CantonCallParticipantOnboarding:
type: object
additionalProperties: false
properties:
type:
type: string
enum:
- DTCC_PARTICIPANT_ONBOARDING
example: DTCC_PARTICIPANT_ONBOARDING
description: Which call to make. Selects the shape of `payload`.
vaultAccountId:
type: string
example: '12'
description: The vault account whose Canton wallet makes this call.
blockchainId:
type: string
enum:
- CANTON
- CANTON_TEST
example: CANTON
description: The blockchain the vault account's Canton party is connected to — `CANTON` or `CANTON_TEST`.
payload:
$ref: '#/components/schemas/ParticipantOnboardingPayload'
required:
- type
- vaultAccountId
- blockchainId
OfferResponseTransferAccept:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- TRANSFER_ACCEPT
example: TRANSFER_ACCEPT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Accept an inbound 2-step transfer offer. Carries no arguments.
CantonCallEndInvestorInviteCancel:
type: object
additionalProperties: false
properties:
type:
type: string
enum:
- DTCC_END_INVESTOR_INVITE_CANCEL
example: DTCC_END_INVESTOR_INVITE_CANCEL
description: Which call to make. Selects the shape of `payload`.
vaultAccountId:
type: string
example: '12'
description: The vault account whose Canton wallet makes this call.
blockchainId:
type: string
enum:
- CANTON
- CANTON_TEST
example: CANTON
description: The blockchain the vault account's Canton party is connected to — `CANTON` or `CANTON_TEST`.
payload:
$ref: '#/components/schemas/EndInvestorPayload'
required:
- type
- vaultAccountId
- blockchainId
- payload
CantonCallAllowListAdd:
type: object
additionalProperties: false
properties:
type:
type: string
enum:
- DTCC_ALLOW_LIST_ADD
example: DTCC_ALLOW_LIST_ADD
description: Which call to make. Selects the shape of `payload`.
vaultAccountId:
type: string
example: '12'
description: The vault account whose Canton wallet makes this call.
blockchainId:
type: string
enum:
- CANTON
- CANTON_TEST
example: CANTON
description: The blockchain the vault account's Canton party is connected to — `CANTON` or `CANTON_TEST`.
payload:
$ref: '#/components/schemas/AllowListPayload'
required:
- type
- vaultAccountId
- blockchainId
- payload
CantonCallEndInvestorOffboard:
type: object
additionalProperties: false
properties:
type:
type: string
enum:
- DTCC_END_INVESTOR_OFFBOARD
example: DTCC_END_INVESTOR_OFFBOARD
description: Which call to make. Selects the shape of `payload`.
vaultAccountId:
type: string
example: '12'
description: The vault account whose Canton wallet makes this call.
blockchainId:
type: string
enum:
- CANTON
- CANTON_TEST
example: CANTON
description: The blockchain the vault account's Canton party is connected to — `CANTON` or `CANTON_TEST`.
payload:
$ref: '#/components/schemas/EndInvestorPayload'
required:
- type
- vaultAccountId
- blockchainId
- payload
OfferResponseDtccOnboardingReject:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- DTCC_END_INVESTOR_ONBOARDING_REJECT
example: DTCC_END_INVESTOR_ONBOARDING_REJECT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
payload:
$ref: '#/components/schemas/DtccOnboardingRejectPayload'
required:
- responseType
- payload
description: Reject a DTCC end-investor onboarding offer.
DtccOnboardingRejectPayload:
type: object
properties:
reason:
type: string
minLength: 1
maxLength: 512
example: KYC not completed
description: Why the offer is being rejected. Recorded on-chain, where the counterparty can read it.
required:
- reason
OfferResponseTradewebAccept:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- TRADEWEB_COSIGNING_DELEGATION_ACCEPT
example: TRADEWEB_COSIGNING_DELEGATION_ACCEPT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Accept a Tradeweb co-signing delegation offer. Carries no arguments.
OfferResponseTransferWithdraw:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- TRANSFER_WITHDRAW
example: TRANSFER_WITHDRAW
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Withdraw your own outgoing transfer offer. Carries no arguments — `offerId` in the path identifies the offer, and the vault account and blockchain are resolved from it.
OfferResponseAllocationReject:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- ALLOCATION_REJECT
example: ALLOCATION_REJECT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Reject a CIP-56 allocation request. Carries no arguments.
ParticipantOnboardingPayload:
type: object
description: 'Optional, and so is every field in it: omit `payload` entirely to onboard with DTCC''s published parties for the blockchain and the default expiry.'
properties:
expiresAt:
type: string
format: date-time
example: '2026-12-31T23:59:59Z'
description: When the onboarding request expires if it has not been answered. RFC 3339.
operator:
type: string
example: dtcc-operator::1220abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
description: DTCC infra operator party id. Optional — overrides the service's default for the blockchain.
compliance:
type: string
example: dtcc-compliance::1220abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
description: DTCC compliance party id. Optional — overrides the service's default for the blockchain.
registrar:
type: string
example: dtcc-registrar::1220abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
description: DTCC registrar party id — co-signs the accept. Optional — overrides the service's default for the blockchain.
clientOnboarder:
type: string
example: dtcc-onboarder::1220abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
description: DTCC client onboarder party id — co-signs the accept. Optional — overrides the service's default for the blockchain.
upgrader:
type: string
example: dtcc-upgrader::1220abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
description: DTCC upgrader party id — the Model Upgrade Tool authority. Optional — overrides the service's default for the blockchain.
AllowListPayload:
type: object
properties:
wallets:
type: array
items:
type: string
minItems: 1
example:
- investor-party::1220abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789
description: Canton party ids to add or remove.
required:
- wallets
CantonCallEndInvestorInvite:
type: object
additionalProperties: false
properties:
type:
type: string
enum:
- DTCC_END_INVESTOR_INVITE
example: DTCC_END_INVESTOR_INVITE
description: Which call to make. Selects the shape of `payload`.
vaultAccountId:
type: string
example: '12'
description: The vault account whose Canton wallet makes this call.
blockchainId:
type: string
enum:
- CANTON
- CANTON_TEST
example: CANTON
description: The blockchain the vault account's Canton party is connected to — `CANTON` or `CANTON_TEST`.
payload:
$ref: '#/components/schemas/EndInvestorPayload'
required:
- type
- vaultAccountId
- blockchainId
- payload
OfferResponseDtccOnboardingAccept:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- DTCC_END_INVESTOR_ONBOARDING_ACCEPT
example: DTCC_END_INVESTOR_ONBOARDING_ACCEPT
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Accept a DTCC end-investor onboarding offer. Carries no arguments.
CallAccepted:
type: object
description: The outgoing transaction that carries the call.
properties:
transactionId:
type: string
example: 5a1d8b0f-2c31-4c7e-9d0a-118e7b6c4a21
description: The outgoing transaction that carries the call.
status:
type: string
example: SUBMITTED
description: The transaction's status at the time of this response — `SUBMITTED`.
required:
- transactionId
- status
CantonCall:
oneOf:
- $ref: '#/components/schemas/CantonCallParticipantOnboarding'
- $ref: '#/components/schemas/CantonCallEndInvestorInvite'
- $ref: '#/components/schemas/CantonCallEndInvestorInviteCancel'
- $ref: '#/components/schemas/CantonCallEndInvestorOffboard'
- $ref: '#/components/schemas/CantonCallAllowListAdd'
- $ref: '#/components/schemas/CantonCallAllowListRemove'
discriminator:
propertyName: type
mapping:
DTCC_PARTICIPANT_ONBOARDING: '#/components/schemas/CantonCallParticipantOnboarding'
DTCC_END_INVESTOR_INVITE: '#/components/schemas/CantonCallEndInvestorInvite'
DTCC_END_INVESTOR_INVITE_CANCEL: '#/components/schemas/CantonCallEndInvestorInviteCancel'
DTCC_END_INVESTOR_OFFBOARD: '#/components/schemas/CantonCallEndInvestorOffboard'
DTCC_ALLOW_LIST_ADD: '#/components/schemas/CantonCallAllowListAdd'
DTCC_ALLOW_LIST_REMOVE: '#/components/schemas/CantonCallAllowListRemove'
OfferResponseAllocationWithdraw:
type: object
additionalProperties: false
properties:
responseType:
type: string
enum:
- ALLOCATION_WITHDRAW
example: ALLOCATION_WITHDRAW
description: How you are answering the offer — one of the offer transaction's `cantonDetails.offerResponse.availableResponses`. That list does not change after the offer arrives; check `expiresAt` and the transaction status to see whether it is still answerable.
required:
- responseType
description: Withdraw the allocation you made by accepting this offer, unlocking the holding. Carries no arguments — the allocation is resolved from the offer. Answers `409` until the accept has settled.
headers:
X-Request-ID:
schema:
type: string
description: Unique ID correlated to the API request. Please provide it in any support ticket you create or on Github issues related to Fireblocks SDKs
responses:
Error:
description: Error Response
headers:
X-Request-ID:
$ref: '#/components/headers/X-Request-ID'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorSchema'
securitySchemes:
bearerTokenAuth:
type: http
scheme: bearer
bearerFormat: JWT
ApiKeyAuth:
type: apiKey
in: header
name: X-API-Key
x-readme:
explorer-enabled: false
samples-languages:
- curl
- javascript
- python
x-provenance:
method: harvested
publisher: Fireblocks
source: https://swagger.fireblocks.com/openapi.yaml
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)