Messages

Change who answers a conversation (handover)

Changed on

Changes who answers a conversation: Meta Business Agent handover on WhatsApp, Meta's conversation routing on Facebook and Instagram. On Instagram, Conversation Routing replaced the Handover Protocol in October 2025 and kept the thread-control calls below.

WhatsApp, on numbers with Meta Business Agent enabled:

  • release: hand the conversation back to the agent so it resumes answering. You must currently hold control (sending any message takes it implicitly).
  • take: take control before sending anything, so the agent stops replying while an operator reads the thread. Meta accepts this only from the business configured as the number's escalation partner; other apps take control by sending a message.
  • pass: transfer control to the number's configured escalation partner, or to the agent with target: ai_agent. Meta's Cloud API currently rejects it ("Pass action is not supported", verified 2026-09-08); use release to hand a thread back to the agent.

Facebook and Instagram (conversation routing between the apps on the account, such as Page Inbox or the Instagram Inbox):

  • pass with targetAppId: give the thread to another app (pass_thread_control). Page Inbox is 263902037430900, the Instagram Inbox is 1217981644879628.
  • take: take the thread back (take_thread_control), only on accounts connected through a Facebook Page. Instagram Login answers 400 platform_not_supported.
  • take preconditions: a default app set in the account's conversation routing settings, and Zernio allowed to take control of conversations (Page settings > Page setup > Advanced messaging). Otherwise Meta answers code 27 (400 platform_api_error).
  • request: ask the current owner to pass the thread (request_thread_control); nothing changes until it does. Not available on Instagram Login connections (400 platform_not_supported).
  • release: make the thread idle (release_thread_control); the account's default app answers next.

A send refused with not_thread_owner on a Facebook Login connection already tries take once and resends.

While another app owns the thread

While another app owns a Facebook or Instagram thread, inbound messages arrive with metadata.standby: true and a send answers 409 not_thread_owner.

The conversation's threadControl follows the result. This call does not fire conversation.control_changed; that event fires only when Meta tells Zernio another app passed a thread to it or took one from it.

post/v1/inbox/conversations/{conversationId}/thread-control

Request

Path parameters

conversationIdstring required

The conversation ID

Request body

accountIdstring required

Social account ID

action'release' | 'take' | 'pass' | 'request' required

request is Facebook and Instagram only. take and request are refused with platform_not_supported on Instagram accounts connected with Instagram Login.

target'ai_agent'

WhatsApp only. With action pass: send control to Meta Business Agent instead of the escalation partner.

targetAppIdstring

Facebook and Instagram only, required with action pass: the Meta app id receiving the thread.

metadatastring

Free-form note forwarded verbatim to the app receiving control (its messaging_handovers webhook).

Response

Control transferred (or, for request, asked for)

successboolean

Changes

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the optional property to the response with the status

    • info

      added the new optional request property

    • info

      added the new request enum value to the request property

    • info

      added the optional property / to the response with the status