Workspaces
A workspace is the tenant: your team, its billing, its members, and all of its operational data — contacts, conversations, messages, templates, media, webhooks. You never pass a workspace id. Your API key belongs to exactly one workspace, and every query is scoped to it before it runs. There is no request you can construct that reads another workspace’s data.Modes
Each workspace has two independent modes:test
Nothing reaches a real phone. Sends are simulated end to end, including webhooks and
delivery statuses, so you can exercise the full lifecycle safely.
live
Real messages, real recipients. Meta bills each message to the business at its own rates.
sk_test_ / sk_live_). The two modes hold entirely separate data: a contact created in test does not exist in live.
This means promoting an integration is a credential swap, not a code change.
Modes and plans
Test mode is free and never plan-limited: it runs on the shared test number, so you can build without a plan. Live mode is where the plan applies. Connecting your own number needs a plan, and live API keys need the Pro plan; a live key on a smaller plan gets402 plan_limit_reached. Meta bills each live message to the business directly, and LazyApp adds 0% to Meta’s rates. See How billing works and Plans and limits.
In the console, mode is a toggle in the header rather than part of the URL, so a link
you paste to a colleague stays valid whichever mode they are in.
Connections
Inside a workspace, a connection is one WhatsApp Business Account and its phone numbers. Credentials live on the connection, which is the real isolation boundary for sending. Most sends do not name a connection — LazyApp uses the workspace default. Name one explicitly when you have several:GET /v1/capabilities.