tk- and belongs to the whole team, so every workflow that team owns is reachable with it.
Things to know before you call:
- A workflow is built, then run.
workflows.createbuilds one from a natural-language prompt, an existing schema, inline fields, or a published template. Kadoa takes a sample and holds it for review, so a new workflow starts inPREVIEW.workflows.resumeapproves the preview and makes itACTIVE. - Sources must share one website. Several URLs in one workflow have to be the same site, counting subdomains and country domains. Two unrelated sites are rejected with a 422.
- Runs are asynchronous.
workflows.runanswers at once with ajobIdand spends credits. Read it back withworkflows.jobStatus({ workflowId, jobId }):IN_PROGRESSis not final,FINISHEDis, andFAILED,NOT_SUPPORTEDandFAILED_INSUFFICIENT_FUNDSended without data. The plugin declares no job metadata because reading one back needs both IDs. - Reading the rows.
workflows.datareturns the rows of the latest published run:pagination.totalPagessays whether another page exists, andlimitabove 0 pages.limit: 0streams every row in one answer and no next page exists. A workflow whose first run has not published data answers 409DATA_NOT_PUBLISHED. - Paging.
workflows.listandchanges.listpage by offset, so they returnnextSkipwhile a page comes back full; pass it back asskip.workflows.historyandworkflows.datapage by number and returnnextPage. - Deletes cannot be undone.
workflows.delete,schemas.deleteandvariables.deleteare permanent. A workflow delete also removes its run history and stored data. - Secrets. A
SECRETvariable created with a value is written once and read back without it. ACUSTOMER_MANAGEDsecret instead names a Google Secret Manager connection and a resource, and takes no value.variables.deleteanswers 409 while a secret is still bound to a connection. - Rate limits. Kadoa answers 429 with
reasonPIPELINE_CROWDEDwhen too many runs queue on the team, orUSER_RATE_LIMITwhen calls come too fast. Both are retried three times with backoff, and a realRetry-Afteris honoured. Only reads are replayed after a 5xx, because a create that failed mid-way could otherwise run twice. - Webhooks. The plugin does not receive deliveries. Notifications are configured in Kadoa itself.
- 28 typed API operations
Setup
1
Install
2
Add the plugin
corsair.ts
multiTenancy: true, scope calls with corsair.withTenant(id). See Quick start for KEK + Hub keys, and Multi-tenancy for account isolation.3
Choose authentication
- API Key (Recommended)
Store the Kadoa API key before the first call: More: API Key
pnpm corsair setup --plugin=kadoa --tenant=acme api_key=<your-key> (leave out --tenant without multiTenancy), or pass it as key in the plugin options. With Hub, each tenant enters their own key on the connect page. See API key auth.4
Connect a tenant
Mint a connect link and send the tenant to it. Hub hosts the page and delivers the result to your app — see Connect / OAuth.
Example API calls
List the workflows tagged pricingWhat’s next
API reference
Every
kadoa.api.* operation with input and output types.Connect / OAuth
createLink, Hub delivery, and tenant connect flows.
Use with agents
Expose this plugin’s operations as MCP tools.