Reference · 10 operations
Actions: catalog and runs
Every capability as one operation actions.<family>.<verb>: one target
model, dry run, lifecycle and audit (the catalog is GET /action-types).
Last updated from API version 2026-10-06 at (live spec, refreshed hourly). openapi.json
Action types
The action catalog: every actions.* operation.
/api/v1/action-types- Scope
- read
- Credits
- Free
- Idempotency-Key
- Not used
Operation id, summary, safety class, input JSON schema, accepted target
kinds, sync support, price, approval floor and the rate-limit bucket
it spends. Generated from this document, so the CLI, MCP and docs
read one source. Filter with class. Not paginated (one entry per
operation).
Parameters
- classquerystring
Safety class: decides scope, approval, caps and enforcement.
readwritespendexternal_writesend
Responses
200Every action operation, sorted by id.Show schema
ActionTypeListResponse
- 0
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/action-types" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"One action operation of the catalog.
/api/v1/action-types/{operationId}- Scope
- read
- Credits
- Free
- Idempotency-Key
- Not used
Parameters
- operationIdpathstringrequired
An action operation id, e.g.
actions.find.provider_id.
Responses
200The operation.Show schema
ActionTypeResponse
- 0
One action operation, from this document's
x-owlbound-action. - 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/action-types/$OPERATION_ID" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"Action runs
List the workspace's actions, newest first.
/api/v1/actions- Scope
- read
- Credits
- Free
- Idempotency-Key
- Not used
Every action run in the workspace, by any key, session or agent.
Filters: kind (an operation id), status, createdAfter
(milliseconds since the epoch). tableId is reserved. Cursor-paginated.
Parameters
- limitqueryinteger
Page size.
default 50min 1max 200 - cursorquerystring
Opaque cursor from
meta.page.nextCursor. Reusing it with other filters is400 CURSOR_MISMATCH. - kindquerystring
- statusquerystringpending_approvalqueuedrunningsucceededfailedrejectedcanceledexpiredpartial
- tableIdquerystring
Reserved: any value is
400 UNSUPPORTED_FILTERuntil table targets ship. - createdAfterqueryinteger
Responses
200One page of actions.Show schema
ActionListResponse
- 0
- 0
Metadata on a paginated success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/actions" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"Get one action, optionally waiting for it to finish.
/api/v1/actions/{id}- Scope
- read
- Credits
- Free
- Idempotency-Key
- Not used
waitSeconds (0 to 30) holds the request until the action reaches a
terminal status or the time is up, whichever comes first; poll again
for longer waits. Without it the current state returns at once.
Parameters
- idpathstringrequired
The action id.
- waitSecondsqueryintegermin 0max 30
Responses
200The action.Show schema
ActionResponse
- dataobjectrequired0
+ Show child fields− Hide child fields
- 0
One action run. Read it again with
GET /api/v1/actions/{id}.
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/actions/$ID" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"Cancel an action's targets that have not started.
/api/v1/actions/{id}/cancel- Scope
- read
- Credits
- Free
- Idempotency-Key
- optional
Queued, scheduled and pending-approval targets become canceled; a
running target finishes. Needs the scope of the action's class (read
for a read action, enrich for a spend action). Idempotent: cancelling
a finished action returns it unchanged. On an async run the open
batches close (their credit holds are released, or settled for what
already committed) and the action ends canceled shortly after.
Parameters
- idpathstringrequired
The action id.
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255
Responses
200The action after the cancel.Show schema
ActionResponse
- dataobjectrequired0
+ Show child fields− Hide child fields
- 0
One action run. Read it again with
GET /api/v1/actions/{id}.
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/actions/$ID/cancel" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)"Targets
The action's targets and their outcomes.
/api/v1/actions/{id}/targets- Scope
- read
- Credits
- Free
- Idempotency-Key
- Not used
One row per target: status, skip or failure reason, result.
Filters status and reason. Cursor-paginated.
Parameters
- idpathstringrequired
The action id.
- limitqueryinteger
Page size.
default 50min 1max 200 - cursorquerystring
Opaque cursor from
meta.page.nextCursor. Reusing it with other filters is400 CURSOR_MISMATCH. - statusquerystringqueuedpending_approvalscheduledrunningsucceededskippedfailedcanceled
- reasonquerystring
Responses
200One page of targets.Show schema
ActionTargetListResponse
- 0
- 0
Metadata on a paginated success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/actions/$ID/targets" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"Audit
The action's per-target audit trail, newest first.
/api/v1/actions/{id}/audit- Scope
- read
- Credits
- Free
- Idempotency-Key
- Not used
One row per target outcome: who acted (actor), the payload hash,
the outcome and reason, the provider reference. Message bodies are
never in the audit. Cursor-paginated.
Parameters
- idpathstringrequired
The action id.
- limitqueryinteger
Page size.
default 50min 1max 200 - cursorquerystring
Opaque cursor from
meta.page.nextCursor. Reusing it with other filters is400 CURSOR_MISMATCH.
Responses
200One page of audit rows.Show schema
ActionAuditListResponse
- 0
- 0
Metadata on a paginated success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl "https://app.owlbound.ai/api/v1/actions/$ID/audit" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06"Icps
Create an ICP (criteria, scoring prompt).
/api/v1/actions/icps/create- Scope
- write
- Credits
- See the catalog entry
- Idempotency-Key
- required
- Class
- write
- Approval floor
- none
- Runs
- Inline for one target, else async
- Targets
- none
- Max targets
- 1
- Dry run
- Supported
Write class: workspace data only, free, no approval. Give a name,
targeting criteria lists and a scoring prompt. Target none: the action has one target, the new
ICP; it runs inline and its result holds the ICP id and its app link.
Any member who can write may create one, as in the app; the ICP
belongs to the member behind the call. dryRun: true returns what
would be created and writes nothing. A workspace at its ICP limit is
failed ICP_LIMIT_REACHED.
Parameters
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255 - Owlbound-Dry-Runheaderboolean
true: same as body fielddryRun: true(action operations). - Owlbound-Planheaderstring
A
planIdfrom a dry run: same as the body fieldplanId(action operations). A different bodyplanIdis400.pattern ^plan_[0-9a-f]{48}$
Request body (required) · application/json
IcpsCreateRequest
- 0
The action creates or changes one workspace record (named in
input). - inputobjectrequired0
+ Show child fields− Hide child fields
- namestringrequired0
- criteriaIcpCriteriaInput0
- scoringIcpScoringInput0
- dryRunboolean0
Same as the
Owlbound-Dry-Runheader. - planIdstring
Apply this dry run's plan (same as
Owlbound-Plan). Not withdryRun: true.pattern ^plan_[0-9a-f]{48}$ - modestring
auto(default) runs inline when the operation is sync, one target would run and the class is not send;syncforces inline (422 ACTION_NOT_SYNCwhen it cannot);asyncforces a run.autosyncasync - notifyActionNotify0
Events for this action.
targetEvents: truealso writes oneaction.target.completed/action.target.failedevent per target (feed and webhooks); without it only action-level events are written, to keep the volume down.webhookis accepted and has no effect (webhook endpoints subscribe by event type).
Responses
200The finished action and its result, or the dry-run plan.Show schema
ActionRunResponse
- dataone ofrequired0
+ Show child fields− Hide child fields
One of
with action
- 0
One action run. Read it again with
GET /api/v1/actions/{id}. - resultanyrequired0
The target's result, or null when it was skipped or failed.
with plan
- 0
What a real call would do, from every check up to the first side effect. Nothing is reserved, sent, written or charged. The plan is stored for 15 minutes: send its
planIdwith the real call to run exactly what was reviewed (409 PLAN_STALEwith a new plan if anything bound changed or it expired).
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/actions/icps/create" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"target": {
"kind": "none"
},
"input": {
"name": "My first table"
},
"dryRun": true
}'The example is a dry run: it returns a plan and runs, writes and charges nothing. See dry runs and plans.
Change an ICP's name, criteria or scoring.
/api/v1/actions/icps/update- Scope
- write
- Credits
- See the catalog entry
- Idempotency-Key
- required
- Class
- write
- Approval floor
- none
- Runs
- Inline for one target, else async
- Targets
- none
- Max targets
- 1
- Dry run
- Supported
Write class: workspace data only, free, no approval. Each criteria
list given replaces that list; others are kept. An ICP whose criteria
are locked (a scrape ran on them) refuses criteria changes: failed CRITERIA_LOCKED (duplicate it in the app to change
them). An ICP the caller does not see is 404 NOT_FOUND. Target
none, runs inline; dryRun: true writes nothing.
Parameters
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255 - Owlbound-Dry-Runheaderboolean
true: same as body fielddryRun: true(action operations). - Owlbound-Planheaderstring
A
planIdfrom a dry run: same as the body fieldplanId(action operations). A different bodyplanIdis400.pattern ^plan_[0-9a-f]{48}$
Request body (required) · application/json
IcpsUpdateRequest
- 0
The action creates or changes one workspace record (named in
input). - inputobjectrequired0
+ Show child fields− Hide child fields
- icpIdstringrequired0
- namestring0
- criteriaIcpCriteriaInput0
- scoringIcpScoringInput0
- dryRunboolean0
Same as the
Owlbound-Dry-Runheader. - planIdstring
Apply this dry run's plan (same as
Owlbound-Plan). Not withdryRun: true.pattern ^plan_[0-9a-f]{48}$ - modestring
auto(default) runs inline when the operation is sync, one target would run and the class is not send;syncforces inline (422 ACTION_NOT_SYNCwhen it cannot);asyncforces a run.autosyncasync - notifyActionNotify0
Events for this action.
targetEvents: truealso writes oneaction.target.completed/action.target.failedevent per target (feed and webhooks); without it only action-level events are written, to keep the volume down.webhookis accepted and has no effect (webhook endpoints subscribe by event type).
Responses
200The finished action and its result, or the dry-run plan.Show schema
ActionRunResponse
- dataone ofrequired0
+ Show child fields− Hide child fields
One of
with action
- 0
One action run. Read it again with
GET /api/v1/actions/{id}. - resultanyrequired0
The target's result, or null when it was skipped or failed.
with plan
- 0
What a real call would do, from every check up to the first side effect. Nothing is reserved, sent, written or charged. The plan is stored for 15 minutes: send its
planIdwith the real call to run exactly what was reviewed (409 PLAN_STALEwith a new plan if anything bound changed or it expired).
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/actions/icps/update" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"target": {
"kind": "none"
},
"input": {
"icpId": "<icpId>"
},
"dryRun": true
}'The example is a dry run: it returns a plan and runs, writes and charges nothing. See dry runs and plans.
Meetings
actions.meetings.update_suggestion
Accept or dismiss a meeting suggestion.
/api/v1/actions/meetings/update_suggestion- Scope
- write
- Credits
- See the catalog entry
- Idempotency-Key
- required
- Class
- write
- Approval floor
- none
- Runs
- Inline for one target, else async
- Targets
- none
- Max targets
- 1
- Dry run
- Supported
Accept adds it to the audience's AI context; dismiss marks it
reviewed.
Accepting needs a person who may edit that AI context, else
403 AI_CONTEXT_WRITE_REQUIRED. Write class: workspace data only,
free, no approval, target none, inline. dryRun: true writes nothing.
Parameters
- Idempotency-Keyheaderstring
1 to 255 printable ASCII characters, scoped to the API key (a rotated key shares its predecessor's keys) and kept 24 h. Accepted on every POST, PATCH and DELETE (ignored on GET); required from v1 keys where the operation says
x-owlbound-idempotent: required(missing:400 VALIDATION_ERROR,param: Idempotency-Key). Same key and body after completion: the stored response is replayed withIdempotent-Replayed: true. Results over 64 KB are not stored; their replay is409 IDEMPOTENCY_RESULT_UNAVAILABLEwithdetails.originalRequestId(check state with a GET). Same key while the first request runs:409 IDEMPOTENCY_IN_PROGRESSwithRetry-After. Same key, other body or operation:422 IDEMPOTENCY_KEY_REUSED. A request that ended 5xx may be retried with the same key. 4xx results are stored and replayed too: a402 INSUFFICIENT_CREDITSreplays even after a top-up, so use a new Idempotency-Key after adding credits.min length 1max length 255 - Owlbound-Dry-Runheaderboolean
true: same as body fielddryRun: true(action operations). - Owlbound-Planheaderstring
A
planIdfrom a dry run: same as the body fieldplanId(action operations). A different bodyplanIdis400.pattern ^plan_[0-9a-f]{48}$
Request body (required) · application/json
MeetingsUpdateSuggestionRequest
- 0
Lists make their own targets (one per provider page).
- inputobjectrequired0
+ Show child fields− Hide child fields
- meetingIdstringrequired0
- keystringrequired0
The suggestion's
keyfromGET /meetings/{id}/suggestions. - decisionstringrequiredacceptdismiss
- icpProfileIdstring0
The audience to add it to (required to accept).
- dryRunboolean0
Same as the
Owlbound-Dry-Runheader. - planIdstring
Apply this dry run's plan (same as
Owlbound-Plan). Not withdryRun: true.pattern ^plan_[0-9a-f]{48}$ - modestring
auto(default) runs inline when the operation is sync, one target would run and the class is not send;syncforces inline (422 ACTION_NOT_SYNCwhen it cannot);asyncforces a run.autosyncasync - notifyActionNotify0
Events for this action.
targetEvents: truealso writes oneaction.target.completed/action.target.failedevent per target (feed and webhooks); without it only action-level events are written, to keep the volume down.webhookis accepted and has no effect (webhook endpoints subscribe by event type).
Responses
200The finished action and its result (one target), or the dry-run plan.Show schema
ActionRunResponse
- dataone ofrequired0
+ Show child fields− Hide child fields
One of
with action
- 0
One action run. Read it again with
GET /api/v1/actions/{id}. - resultanyrequired0
The target's result, or null when it was skipped or failed.
with plan
- 0
What a real call would do, from every check up to the first side effect. Nothing is reserved, sent, written or charged. The plan is stored for 15 minutes: send its
planIdwith the real call to run exactly what was reviewed (409 PLAN_STALEwith a new plan if anything bound changed or it expired).
- 0
Metadata on every success response.
202An async run was created (queued); poll it or read the event feed.Show schema
ActionResponse
- dataobjectrequired0
+ Show child fields− Hide child fields
- 0
One action run. Read it again with
GET /api/v1/actions/{id}.
- 0
Metadata on every success response.
Errors
400 The request is invalid (VALIDATION_ERROR, CURSOR_MISMATCH, UNSUPPORTED_FILTER) · 401 Missing, invalid, expired or revoked key · 403 Missing scope, suspended workspace or unavailable identity · 404 Unknown resource or route. A resource in another workspace is also 404 · 409 IDEMPOTENCY_IN_PROGRESS (the first request with this key is still
running; `Retry-After` is the lease left, at most 60 s) or
IDEMPOTENCY_RESULT_UNAVAILABLE (the original result was too large to
store; `details.originalRequestId`).
· 422 IDEMPOTENCY_KEY_REUSED (the key was used with another body or operation), or an action that cannot run · 429 Rate limit reached · 500 Unexpected error · 503 The backend is unreachable; retry after `Retry-After`. Every error is {error: {type, code, message, requestId, docUrl}}; see error codes.
curl -X POST "https://app.owlbound.ai/api/v1/actions/meetings/update_suggestion" \
-H "Authorization: Bearer $OWLBOUND_API_KEY" \
-H "Owlbound-Version: 2026-10-06" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"target": {
"kind": "none"
},
"input": {
"meetingId": "<meetingId>",
"key": "<key>",
"decision": "accept"
},
"dryRun": true
}'The example is a dry run: it returns a plan and runs, writes and charges nothing. See dry runs and plans.
Models on this page
Shared objects the operations above link to. Clients must ignore fields they do not know.
ActionTypeobject
One action operation, from this document's x-owlbound-action.
- operationIdstringrequired0
- methodstringrequired0
- pathstringrequired0
- summarystringrequired0
- descriptionstring | nullrequired0
- classstringrequired
Safety class: decides scope, approval, caps and enforcement.
readwritespendexternal_writesend - scopestringrequired0
- targetsarray of stringrequiredcontactcontactsrowsviewrecordsnone
- syncbooleanrequired0
- maxTargetsintegerrequired0
- supportsDryRunbooleanrequired0
- approvalstringrequired
The floor; the key's approval mode can raise it.
noneoptionalrequired - idempotentstringrequiredrequiredoptionalnone
- priceobjectrequired0
+ Show child fields− Hide child fields
- capabilityIdstring | nullrequired0
- perTargetobjectrequired0
+ Show child fields− Hide child fields
- minnumberrequired0
- maxnumberrequired0
- rateLimitobjectrequired0
+ Show child fields− Hide child fields
- weightintegerrequired0
- sendBucketstring | nullrequired0
- writesBackarray of stringrequired0
- inputSchemaanyrequired0
JSON schema of the request's
input. - availablebooleanrequired0
False while the server does not run this class yet (the dry run still works).
ResponseMetaobject
Metadata on every success response.
- requestIdstringrequired0
- 0
- pagePageMeta0
Cursor pagination.
hasMoreis the only end signal; pages may be short. - dryRunboolean0
True only on a dry-run response (action operations).
CreditsMetaobject
- usednumberrequired0
Credits charged by this request. Reads are free.
- balancenumber0
- estimatednumber0
Dry run only (action operations).
- availablenumber0
Dry run only (action operations).
- reservationIdstring | null0
Async operations only; the job settles this reservation.
PageMetaobject
Cursor pagination. hasMore is the only end signal; pages may be short.
- nextCursorstring | nullrequired0
- hasMorebooleanrequired0
- limitintegerrequiredmin 1max 200
Actionobject
One action run. Read it again with GET /api/v1/actions/{id}.
- idstringrequired0
- kindstringrequired0
The operation id.
- classstringrequired
Safety class: decides scope, approval, caps and enforcement.
readwritespendexternal_writesend - statusstringrequiredpending_approvalqueuedrunningsucceededfailedrejectedcanceledexpiredpartial
- identityIdstring | nullrequired0
- 0
- costobjectrequired0
+ Show child fields− Hide child fields
- estimatednumberrequired0
- chargednumberrequired0
- reservationIdstring | nullrequired0
- 0
- targetobjectrequired0
+ Show child fields− Hide child fields
- kindstringrequired0
- tableIdstring0
- viewIdstring0
- columnIdstring0
The send column this action runs (tables.rows.push target column).
- outputobject | nullrequired0
Where the action writes:
{table: {id}}for a list writing into a table (the tableoutput.table.createmade, or the one named); else null.+ Show child fields− Hide child fields
- tableobject0
+ Show child fields− Hide child fields
- idstringrequired0
- resultanyrequired0
The single target's result (sync), or null; bulk results are per target.
- 0
- 0
Who started the action.
agentis an LLM-driven caller (the in-app agent, MCP) acting for the key or member inonBehalfOf. - createdAtnumberrequired0
- updatedAtnumberrequired0
ActionApprovalobject
- modestringrequirednonealwaysover_threshold
- urlstring | nullrequired0
- decidedBystring | nullrequired0
- decidedAtnumber | nullrequired0
- expiresAtnumber | nullrequired0
ActionCountsobject
- totalintegerrequired0
- queuedintegerrequired0
- scheduledintegerrequired0
- runningintegerrequired0
- succeededintegerrequired0
- skippedintegerrequired0
- failedintegerrequired0
- canceledintegerrequired0
ActionErrorobject
- codestringrequired0
- messagestringrequired0
ActionActorobject
Who started the action. agent is an LLM-driven caller (the in-app
agent, MCP) acting for the key or member in onBehalfOf.
- kindstringrequiredapiKeysessionagentjob
- idstringrequired0
API key id, user id, agent run id or job id.
- onBehalfOfobject0
Agent only.
+ Show child fields− Hide child fields
- kindstringrequiredapiKeysession
- idstringrequired0
PagedResponseMetaobject
Metadata on a paginated success response.
- requestIdstringrequired0
- 0
- 0
Cursor pagination.
hasMoreis the only end signal; pages may be short.
ActionTargetobject
- idstringrequired0
- actionIdstringrequired0
- refobjectrequired0
+ Show child fields− Hide child fields
- contactIdstring0
- rowIdstring0
- recordIndexinteger0
- pageinteger0
List actions only, the provider page.
- statusstringrequiredqueuedpending_approvalscheduledrunningsucceededskippedfailedcanceled
- notBeforenumber | nullrequired0
- reasonstring | nullrequired0
Skip or failure code, e.g. NO_LINKEDIN_URL, PROFILE_NOT_FOUND.
- resultanyrequired0
Operation-specific, e.g. {providerId, publicIdentifier, profileUrl, fullName}.
- creditsnumberrequired0
- attemptsintegerrequired0
- updatedAtnumberrequired0
ActionAuditEntryobject
- idstringrequired0
- actionIdstringrequired0
- targetIdstringrequired0
- operationIdstringrequired0
- classstringrequired
Safety class: decides scope, approval, caps and enforcement.
readwritespendexternal_writesend - 0
Who started the action.
agentis an LLM-driven caller (the in-app agent, MCP) acting for the key or member inonBehalfOf. - identityIdstring | nullrequired0
- payloadHashstringrequired0
SHA-256 of the canonical request input; message bodies are never stored here.
- outcomestringrequiredsucceededskippedfailedcanceledunknown
- reasonstring | nullrequired0
- providerstring | nullrequired0
- providerRefstring | nullrequired0
- creditsnumberrequired0
- dryRunbooleanrequired0
- requestIdstringrequired0
- atnumberrequired0
ActionTargetSelfobject
The action creates or changes one workspace record (named in input).
- kind"none"required0
IcpCriteriaInputobject
- {key}array of string0
IcpScoringInputobject
- promptstring0
- hotThresholdinteger0
- warmThresholdinteger0
- autoScoreOnEnrichboolean0
ActionNotifyobject
Events for this action. targetEvents: true also writes one
action.target.completed / action.target.failed event per target
(feed and webhooks); without it only action-level events are written,
to keep the volume down. webhook is accepted and has no effect
(webhook endpoints subscribe by event type).
- targetEventsbooleandefault false
- webhookboolean0
Planobject
What a real call would do, from every check up to the first side
effect. Nothing is reserved, sent, written or charged. The plan is
stored for 15 minutes: send its planId with the real call to run
exactly what was reviewed (409 PLAN_STALE with a new plan if
anything bound changed or it expired).
- operationIdstringrequired0
- classstringrequired
Safety class: decides scope, approval, caps and enforcement.
readwritespendexternal_writesend - identityIdstring | nullrequired0
- targetsobjectrequired0
+ Show child fields− Hide child fields
- totalintegerrequired0
- wouldRunintegerrequired0
- wouldSkiparray of objectrequired0
+ Show child fields− Hide child fields
- reasonstringrequired0
- countintegerrequired0
- samplearray of stringrequired0
- creditsobjectrequired0
+ Show child fields− Hide child fields
- estimatedMinnumberrequired0
- estimatedMaxnumberrequired0
- availablenumberrequired0
- capRemainingnumber | nullrequired0
- quotaobject | nullrequired0
LinkedIn sends: the daily budget the action spends (an estimate: warm-up, health and the identity's other sends move it; the send gate decides at send time).
bucketis the daily limit's key,identityRemainingTodaywhat the identity's account has left today,keyRemainingTodaythe key's, user's or agent's daily sends left (null: uncapped),wouldDeferthe targets that would wait for a later day,firstSlotAt/lastSlotAtwhen the first and last of them would go (ms; null past 7 days). Null for other operations.+ Show child fields− Hide child fields
- bucketstringrequired0
- identityRemainingTodaynumberrequired0
- keyRemainingTodaynumber | nullrequired0
- wouldDefernumberrequired0
- firstSlotAtnumber | nullrequired0
- lastSlotAtnumber | nullrequired0
- approvalobjectrequired0
+ Show child fields− Hide child fields
- requiredbooleanrequired0
- reasonstring | nullrequiredkey_modeoperation_floorover_thresholdagentrequestedidentity_owner
- writesobjectrequired0
- previewarray of anyrequired0
The first targets that would run (at most 5).
- planIdstringrequired
Valid until
expiresAt, for the principal that made the dry run only.pattern ^plan_[0-9a-f]{48}$ - expiresAtnumberrequired0
When the plan expires (epoch milliseconds).
ActionTargetNoneobject
Lists make their own targets (one per provider page).
- kind"none"required0