Skip to main content
LazyApp’s inbox is WhatsApp direct messages only — not Instagram comments, Facebook reviews, or a multi-network unified feed. Conversations are 1:1 threads between a connection and a contact. Groups are separate — see Group chats. Unlike Zernio’s conversation-centric inbox (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 with status (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.
Required scope: 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.
Each row includes 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:
LazyApp’s upload ceiling is 16 MB per file by default (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 use type: 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

Empty 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)