POST /v1/inbox/conversations/.../messages), LazyApp is recipient-centric: you list threads with /v1/conversations, then send with POST /v1/messages addressed to the contact’s phone (or BSUID). Conversations are created automatically when messages flow.
Building an inbox inside your SaaS for each tenant? Use the same endpoints with a customer-scoped key, then read Tenant inbox for webhook-first architecture and embedded components.
Feature matrix
Direct messages
List conversations
Most recently active first. Pinned threads sort first. Filter withstatus (open, pending, resolved, closed), assignee_id, or archived. Search with q (contact phone / username / BSUID / external id, or latest message body). Cursor-paginated (limit 1–100, default 25).
Typing
Shows Meta’s typing indicator for the latest inbound message in the thread.Archive and pin
Workspace-level flags (API key has no user). Console per-agent pins stay separate.messages:read
Assign, resolve and tag
Hand a conversation to the right person from code: a bot that triages a refund request can assign it, mark it pending and tag it in one call.assignee_id is a member of your team (null unassigns). status is open, pending, resolved or closed. tags replaces the conversation’s tags, creating new names. Assigning starts human_assignment workflows and resolving or closing starts conversation_closed ones, exactly as in the inbox. If an agent changes the conversation at the same moment you get 409 with conversation_changed; fetch it and try again.
Required scope: messages:send
Internal notes
Notes are for agents. They show next to the thread in the inbox and are never sent to the contact, so they are where a bot leaves its triage summary.GET /v1/conversations/{id}/notes lists them, newest first. A note added over the API has author: null.
Fetch messages
Newest first.limit 1–200, default 50.
uuid, direction, status, type, body, to / from, provider_message_id, and created_at.
Prefer webhooks for live traffic. List endpoints are for backfill and reconciliation — see Tenant inbox.
Reply in a conversation
Address the contact, not a conversation id:context.message_id quotes the inbound message in WhatsApp. Outside the 24-hour window, send a template instead — LazyApp refuses free-form sends with customer_service_window_closed.
Check the window before choosing a type:
service_window.open / state (open, expiring, closed) tells you whether free-form is allowed.
Attachments
Upload first (Media), then send:MEDIA_MAX_SIZE_KB). Meta may still refuse a type or size WhatsApp does not accept for that message kind. Do not invent per-type caps beyond what Meta documents for Cloud API.
Audio sends as a normal audio attachment on POST /v1/messages. True voice-note UI (waveform) is available from the console inbox composer; the public JSON body does not accept a voice / voiceNote flag today. The Meta-compat proxy can pass Meta’s audio.voice when you use that path.
Interactive and commerce
Reply buttons, lists, CTA URL, flows, and catalog / product / carousel messages all usetype: interactive on POST /v1/messages. They are session messages — they need an open customer-service window.
When a contact submits a cart, you get message.received with type: order and content.order. Product “Message business” referrals carry product metadata on the inbound message — see Catalog and Event reference.
Reactions
emoji removes the reaction. Inbound reactions arrive as reaction.received (and also as message.received with type: reaction).
Console vs API
Webhooks
Subscribe once; do not poll conversations for new DMs.
Full catalogue: Event reference. Verify signatures: Verifying webhooks.
Meta does not expose incoming-message edits or recipient-side unsends, so LazyApp does not emit
message.edited or inbound deletes as first-class edit events.
Notes
- 24-hour window — free-form only after the contact’s last message; templates reopen the conversation.
- Templates — required to start or restart outside the window.
- Delivery — follow status on webhooks; message rows also carry
status. - WhatsApp only — no unified Instagram / Facebook / Telegram inbox API.
What we skip (Zernio-style)
Related
- Messages — every send type
- Tenant inbox — multi-tenant webhook architecture
- Embedded components — iframe inbox
- Catalog — product and commerce messages
- Webhooks — delivery and events