Skip to main content
HTTP 422. The conversation’s channel does not take this kind of message, this field or block, or this value. Nothing was sent.

What it means

A send is exact or it fails: Flow never converts a message into another kind, never drops a field, and never answers 2xx for something it did not send. Each endpoint’s page opens with the channels it works on and their limits. The error says what was refused:
  • param: what the channel does not take (see the table below).
  • channel: the conversation’s channel.
  • channel_code: Flow’s code for a few cases that depend on the conversation or the message.
  • hint: what to send instead over plain HTTP, for this case.

Why it happens

For the time limits, Flow checks its own record of when the message was sent, and message states the limit and the message’s age, for example “iMessage allows unsends within 2 minutes of sending; this message was sent 6 minutes ago.” POST /v0/files answers it too, for a file whose real type Flow does not take (programs, web pages, unknown types) or that is larger than the channel given takes. A document or archive a contact sent before Flow malware-scanned documents, sent again by file_id, answers it as well: Flow sends only documents it scanned. A window that is closed is not this error: WhatsApp after 24 hours, iMessage typing more than 5 minutes after the contact’s last message, and SMS quiet hours answer 409 outside_window.

How to fix it

Send what the channel takes instead. The hint names it for your case; the usual ones:
Sends to one conversation go out in the order Flow accepted them, so the cards arrive in the order you sent them. A tap arrives as button_reply with the button’s id on every channel that has buttons. A 422 is kept under its Idempotency-Key like any other answer, so the message you send instead is a new request with a new key: add what it is to the refused one’s key, such as evt_123:card:2:basic. Repeating the refused key returns the same 422. When Flow accepted an edit or unsend but the channel refused it later (for example when it waited behind the conversation’s earlier messages until the limit passed), the edit or unsend message ends message.failed and the original message is unchanged. Every error also carries hint, one sentence specific to your request, and doc_url, this page. Coding agents connected to Flow’s MCP server (https://api.flow.engineer/mcp) can call explain_error with the type to read this page.