---
title: "Request action approval"
method: POST
path: "/v1/confirmations/requestAction"
tags: ["confirmations"]
---

# Request action approval

`POST /v1/confirmations/requestAction`

## Request

- Base URL: `https://api.zevari.ai`
- URL: `https://api.zevari.ai/v1/confirmations/requestAction`
- Auth: HTTP bearer

Transport: call this endpoint with HTTP POST and a JSON request body. Stage an approval-gated action for the public REST API. Call this before outbound LinkedIn/email writes and campaign activation. Personalized campaign enrollment is intentionally excluded: call campaigns.addTargets with personalized_steps so the idempotency receipt is reserved before its internal campaign_enroll_personalized_targets approval is staged. Campaign activation can be staged only while the campaign is draft or paused. Terminal, processing, active, and archived campaign activation is rejected before a confirmation is created or Autopilot is evaluated with CAMPAIGN_INVALID_STATUS_TRANSITION. Automated flow: if the response data includes autopilot.approved=true, immediately retry the gated write with the returned confirmation_id. If Autopilot is not approved, show or store approval_url, wait for browser approval in Zevari, then retry the gated write with the same confirmation_id. For linkedin_send_connection_request payloads, note length is tier-limited before approval: free LinkedIn senders support up to 200 characters; paid/Premium/Sales Navigator senders support up to 300. Over-limit notes return HTTP 400 with ok=false and data.error='connection_note_too_long'. REST clients do not have access to MCP-only chat approval tools.

## Request body

- object
  - `action_type` 'linkedin_send_message' | 'linkedin_send_inmail' | 'linkedin_send_connection_request' | 'linkedin_cancel_invitation' | 'linkedin_respond_invitation' | 'linkedin_create_post' | 'linkedin_comment_on_post' | 'linkedin_react_to_post' | 'linkedin_react_post_comment' | 'email_send_message' | 'campaign_activate' | 'campaign_update_target_set' | 'campaign_update_step_config' | 'bulk_delete' | 'bulk_export' | 'agents_enrich_email_batch' | 'account_reparent', required: The exact allowlisted action family this confirmation gates. Valid values are LinkedIn/email sends/InMails/posts/comments/reactions, campaign_activate, campaign_update_target_set, campaign_update_step_config, bulk_delete, bulk_export, and agents_enrich_email_batch. For campaign activation, use 'campaign_activate' with payload={campaign_id: <id>}. Personalized enrollment must use campaigns.addTargets, which stages its receipt-bound confirmation internally. Entity saves such as targets_save are not valid action_types and do not need confirmation.
  - `payload` object, required: The COMPLETE action payload. LinkedIn writes are validated at stage time; connection requests accept saved lead/provider/public/profile URL aliases and are stored as canonical provider-ID payloads, while linkedin_comment_on_post/linkedin_react_to_post postId values are resolved to the post's social_id before approval. After approval, execution uses this stored approved payload as the source of truth.
  - `cost_estimate_cents` integer: Estimated external cost in cents (e.g. email enrichment reveals). Shown to the user on the approval page.
  - `content_policy_override` object[]: Send despite these content-policy entries. Pass the refusal's override_entries exactly, and only after the user explicitly agreed to send anyway. Entries not listed still block. A message sent this way waits for the user's approval unless the workspace runs Autopilot Unattended.
    - `kind` 'literal' | 'token' | 'rule', required
    - `value` string, required

## Response `200`

Successful Zevari API response.

- ZevariResponseEnvelope
  - `ok` boolean, required: False when the underlying tool reports an error or a partial failure.
  - `method` string, required: Public API method name.
  - `data` unknown, required
  - `request_id` string, required: Request correlation ID. Also returned in X-Zevari-Request-Id.

## Other responses

- `400`: CAMPAIGN_INVALID_STATUS_TRANSITION is returned when campaign activation is staged outside draft/paused; other invalid staged payloads or arguments return their documented errors.
- `401`: Missing, invalid, expired, revoked, or unauthorized API key.
- `404`: Unknown or non-public Zevari API method.
- `429`: API key rate limit exceeded.
- `500`: Unhandled server error.

---

[API](https://skmtc.dev/zevari/apis/zevari-public-api.md) · [All operations](https://skmtc.dev/zevari/apis/zevari-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zevari/apis/zevari-public-api/revisions/a0bc3afac227?raw)
