| actor | No | Who is asking: { type: agent|human|system|integration, id, display_name }. | |
| intent | Yes | Update intent: phone.emergency_address.set, transcripts.sink.configure, agent.patch, numbers.purchase, or agent.config.rollback | |
| reason | No | Required when changing the raw voice-agent configuration; recorded in the durable audit. | |
| target | No | Target identifiers, e.g. { phone_number } for E911 or { agent_id } for agent.patch. | |
| dry_run | No | Validate tenant, scope, schema, authority, and policy without executing. | |
| payload | No | Intent payload. E911: address + disclosure_acknowledged=true. transcripts: webhook_url + events. agent.patch: name, inbound_prompt, outbound_prompt, sms_prompt, first_message, voice, model, max_duration, metadata, vapi_config, transfer_enabled, transfer_phone_number. | |
| authority | No | How the change was authorized: { mode: none|agent_asserted|human_confirmed|dashboard_session|system_policy, confirmed_by, confirmed_at, confirmation_ref }. human_confirmed requires all three confirmation fields. | |
| requester | No | Optional legacy requester metadata for audit trails (prefer actor). | |
| source_ref | No | External source reference, such as a Discord message or automation run ID. | |
| business_id | No | Business ID. Required when the API key can access multiple businesses. | |
| idempotency_key | No | Required for any mutating request. Repeating a key returns the original outcome instead of re-running provider side effects. | |
| queue_for_approval | No | When authority is missing, create a pending dashboard approval instead of returning needs_approval. | |