Skip to content

`[Bug] /send/list and /send/button fail with "server returned error 405" — legacy ListMessage/ButtonsMessage rejected by WhatsApp, while /send/carousel (InteractiveMessage) works #170

Description

@kssyanu

Welcome!

  • Yes, I have searched for similar issues on GitHub and found none.

What did you do?

Description

POST /send/list and POST /send/button consistently fail with HTTP 500 and
{"error":"server returned error 405"}. No message is delivered.

The error comes from the WhatsApp server after the library builds and dispatches the stanza —
it is not a request-validation problem. On the same instance, same token, same minute,
/send/text, /send/poll and /send/carousel all succeed.

The decisive detail: /send/carousel works and it sends InteractiveMessage, while the two
failing endpoints send the legacy ListMessage / ButtonsMessage types. This suggests WhatsApp
has deprecated the bare legacy formats, and that /send/list needs the same
InteractiveMessage (or ViewOnceMessage wrapper) treatment the carousel path already uses.

Environment

Version 0.7.2 (latest stable; digest sha256:6fa60146…)
Deployment Docker, evoapicloud/evolution-go:0.7.2
Account type Personal / consumer WhatsApp (not Business API)
Instance state connected: true, paired and healthy

Steps to reproduce

# 1. /send/list — body uses exactly the six required fields from the Swagger docs
curl -X POST http://<host>:8080/send/list \
  -H "apikey: <INSTANCE_TOKEN>" -H "instanceId: <INSTANCE_ID>" \
  -H "Content-Type: application/json" -d '{
    "number": "5599999999999",
    "title": "Company",
    "description": "Choose a department",
    "footerText": "Support",
    "buttonText": "View Menu",
    "sections": [{
      "title": "Departments",
      "rows": [{"title": "SALES"}, {"title": "FINANCE"}]
    }]
  }'

Actual result

{"error":"server returned error 405"}

HTTP 500

Expected result — a tappable single-select list, as described in the Swagger documentation.

Control tests (same instance, same token, minutes apart)

Endpoint Message type built HTTP Delivered?
/send/text ExtendedTextMessage 200
/send/poll PollCreationMessage 200 ✅ tappable, vote received back via webhook
/send/carousel InteractiveMessage 200
/send/list ListMessage 500 error 405
/send/button ButtonsMessage 500 error 405

This rules out authentication, routing, instance health, and version — and rules out
request-body problems: malformed bodies produce a clean 400 from evolution-go itself
("question is required", "footer is required"), never a 405.

Suggested fix

Send interactive lists/buttons as InteractiveMessage (or wrap in ViewOnceMessage), reusing the
approach that already works in the carousel path.

If the legacy format must be kept for backward compatibility, please consider:

  1. returning a clear, documented error instead of a raw server returned error 405; and
  2. flagging the limitation in the Swagger description, so integrators do not build features on an
    endpoint that cannot deliver.

Related

Possibly the same root cause as #59, but the observed symptom differs: there the API returns
200 and the message fails to render client-side; here it returns 500 and nothing is sent.

What did you expect?

Expected result — a tappable single-select list, as described in the Swagger documentation.

What did you observe instead of what you expected?

Control tests (same instance, same token, minutes apart)

Endpoint Message type built HTTP Delivered?
/send/text ExtendedTextMessage 200
/send/poll PollCreationMessage 200 ✅ tappable, vote received back via webhook
/send/carousel InteractiveMessage 200
/send/list ListMessage 500 error 405
/send/button ButtonsMessage 500 error 405

This rules out authentication, routing, instance health, and version — and rules out
request-body problems: malformed bodies produce a clean 400 from evolution-go itself
("question is required", "footer is required"), never a 405.

Screenshots/Videos

No response

Which version are you using?

0.7.2

What is your environment?

Linux

If applicable, paste the log output

Server logs

SendMessage called for number: +55…@s.whatsapp.net, type: ListMessage
Error sending message: server returned error 405
Error sending list: server returned error 405

SendMessage called for number: +55…@s.whatsapp.net, type: ButtonsMessage
Error sending message: server returned error 405
Error sending button message: server returned error 405

Contrast with the working carousel path:

Building carousel for +55…@s.whatsapp.net with 2 cards
SendMessage called for number: +55…@s.whatsapp.net, type: InteractiveMessage
Carousel sent to +55…@s.whatsapp.net with 2 cards

Additional Notes

Additional evidence: it is not a block on non-official clients

Another whatsmeow-based client (WAHA, engine GOWS — the same underlying Go library)
successfully sent an equivalent list message from the same phone number, within the same
minute
, receiving HTTP 201 with the message delivered and rendering as a tappable menu.

evolution-go even received that WAHA-sent list as an inbound event, confirming the message
traversed WhatsApp's network normally.

So the 405 is not WhatsApp rejecting the sender or the client library — it is WhatsApp rejecting
the legacy stanza format. WAHA encodes interactive lists using the current wrapper; the
evolution-go /send/list path does not.

Relation to the Swagger note

The current Swagger description for /send/list states:

"Uses legacy ListMessage format (no ViewOnceMessage wrapper) so it renders on iOS, Android and
WhatsApp Web."

That choice appears to be the root cause: WhatsApp seems to no longer accept the bare
ListMessage. The carousel endpoint in this same codebase already builds InteractiveMessage
successfully, so the building blocks are present.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions