Skip to content

Meta platform categories: what we implement ​

The areas of Meta's WhatsApp Business Platform, grouped as Meta groups its docs (the directory tree of its documentation), and what meta-whatsapp-rs implements in each: in the library, and in the service (meta-whatsapp-server). Verified against main at b6fc893 (PR #20) on 2026-09-26, category 40 again when the bot framework (roadmap B1) landed, category 39 again when the service's core was extracted (roadmap S1), categories 18 and 30 again with the ConversationStore port change (roadmap L5), categories 20, 21, 24 and 34 again with the phone number calls (roadmap L9), categories 33 and 40 when paced broadcast (B2) landed, category 19 again with S2's security review, category 24 again with the parent BSUID accounts API (roadmap L10a), category 32 again with the Messaging Account a send bills (roadmap L16a), category 20 again with the number settings L9 left (roadmap L26), category 39 again when the service was composed from the bundle alone (roadmap S4), category 14 again with the catalog and product reads (roadmap L17), category 11 again with the typed Flow JSON builder (roadmap L18), category 12 again with call recording and transcription (roadmap L14), categories 23, 28, 31, 36 and 37 again with WABA administration (roadmap L10b), category 18 again with the thread control API (roadmap L15), categories 16 and 17 with max price and welcome message sequences (roadmap L13), categories 37 and 40 again with durable scheduling (roadmap B3), category 5's notes with media conversion (roadmap L19), and again with stickers and image resizing (roadmap L19b), categories 30 and 39 again with the message and contact stores (roadmap L8), category 40 again with retention and auto-delete (roadmap B4), categories 19 and 39 again with the routing after a move and the bind generation (roadmap S2b), category 18 again with the Routing Roles API (roadmap L15a). The per-feature detail is in coverage.md (the linked rows); the capability-level comparison with Zaileys is in parity.md (the rows named); the plan is roadmap.md.

Where we stand ​

40 categoriesdonepartialgap
Library3370
Service12415

35 categories follow Meta's grouping, 2 are APIs Meta documents by reference only (36, 37), and 3 are our own (38–40).

How to read the table ​

  • Status is library / service: done; partial, when a documented part of the category is missing (the notes say which) or the service carries only part of it; gap, when nothing is built yet. A side is done only when every parity row the category cites is done there, and a gap only when every one is a gap (n/a rows aside). The roadmap items that bring the service's part are in parentheses: those of the cited rows. There is no n/a here: a part parity marks n/a is named in the notes.
  • Meta docs area: paths relative to https://developers.facebook.com/documentation/business-messaging/whatsapp/; (nm) marks a page the mirror cannot fetch, as in parity.md.
  • Coverage rows link to the rows of coverage.md; every one of its rows 1–34 appears at least once.

The table ​

#CategoryMeta docs areaLibraryServiceCoverage rowsParity rowsStatusNotes
1Platform basics: apps, tokens, permissions, app reviewabout-the-platform, get-started, overview (nm), access-tokens, permissions.md, solution-providers/app-review.mdClient and ClientBuilder (token, API version, retry policy), the app token, debug_token, the host allow list of GraphRequestconfiguration that fails closed; tenant, platform and admin keys1, 22, 334–6done / partial (M3e)a token's expiry is recorded and reported a lead time ahead in the library (TokenVault::token_expiry, L11e), not yet by the service (M3e); nothing refreshes a token, as Meta documents no refresh (OPEN_QUESTIONS #8, decided); app review is a process, not an API
2Sending messages: the mechanicsmessages/send-messages, messages/contextual-replies, messages/mark-message-as-read, link-previews, typing-indicators.md; reference/whatsapp-business-phone-number/message-api.mdMessages::send, replies, callback data, read receipts, typing indicators, link previews, group and BSUID recipientsPOST /v1/numbers/{pn}/messages, the read route with a typing indicator, Idempotency-Key; pin and request contact info in M5a7, 9, 3311–13, 19–36done / partial (M5a)the Cloud API has no business-side edit or delete of a sent message
3Message types: text, media, location, contacts, reactions, stickersmessages/text-messages, messages/image-messages, messages/audio-messages, messages/video-messages, messages/document-messages, messages/sticker-messages, messages/location-messages, messages/contacts-messages, messages/reaction-messagesevery typetext, image, video, audio (voice included), document, sticker, location, contacts, reaction7, 3311, 24, 25, 39–42done / done—
4Message types: interactive (buttons, lists, CTA URL, media carousel, location request, address, request contact info, voice call, call permission request, Flow, products)messages/interactive-reply-buttons-messages, messages/interactive-list-messages, messages/interactive-cta-url-messages, messages/interactive-media-carousel-messages, messages/location-request-messages, messages/address-messages; catalogs/single-product-messages, catalogs/multi-product-messages, catalogs/interactive-product-carousel-messagesall fourteen client::messages::Interactive variantsbutton, list and cta_url only; the others in M5a5, 7, 3349–60, 104done / partial (M5a)the payment interactives (order_details, order_status) belong to category 15
5Mediabusiness-phone-numbers/media; reference/media/media-api.md, reference/media/media-download-api.md, reference/whatsapp-business-phone-number/media-upload-api.mdupload (checked), URL, verified streaming download, delete, resumable uploadupload, download (verified before the first byte), delete; no resumable upload (M5c1); received media through the route's number check is unverified (OPEN_QUESTIONS #43, M2e)8, 3339–47done / partial (M2e, M5c1)converting media before an upload is ours, not Meta's (parity row 48, no Meta page beyond the accepted formats): voice into Ogg Opus (L19), and a PNG or JPEG into a static WebP sticker or a JPEG or PNG under the 5 MB image limit (L19b), through core's MediaConverter port and an installed ffmpeg; animated stickers are not made yet (L19c)
6Templates: management and lifecycle (create, list, edit, delete, library, migration, comparison, review, quality, pausing, pacing, categorization, TTL, languages, archiving, groups)templates/overview.md, templates/template-management.md, templates/template-library.md, templates/template-migration.md, templates/template-comparison.md, templates/template-review.md, templates/template-quality.md, templates/template-pausing.md, templates/template-pacing.md, templates/portfolio-pacing.md, templates/template-categorization.md, templates/time-to-live.md, templates/supported-languages.md, templates/components.md, templates/template-media.md, templates/tap-target-url-title-override.md, templates/template-archival.md, templates/template-groups.md; reference/whatsapp-business-account/message-template-api.mdall of it, and the template webhooks (status, quality, category, components, misuse)list (cached 60 s), get, create, delete; the five template event types; edit, library, migrate, compare and unpause in M5b3, 3393–97, 100, 101, 153partial / partial (M5b)archiving and unarchiving in bulk and template groups' create, get, update and delete are wrapped (roadmap L23); not wrapped, because no page documents them: the list of a WABA's template groups (in Meta's changelog only) and the pages after the first of a group's templates
7Marketing templates (custom, coupon, limited-time offer, media-card carousel, location, call permission request, per-user limits)templates/marketing-templates.md and its pagesevery component and send-time parameterthrough Meta's JSON, minus the shapes coverage row 33 lists399done / partial (M5b)per-user limits are Meta's behaviour: error handling only
8Utility templates (utility, location, call permission request)templates/utility-templates/utility-templates.md and its pagesdonethrough Meta's JSON (unverified per kind: M5b)399done / partial (M5b)—
9Authentication templates and OTP (copy code, one-tap, zero-tap, previews, bulk management)templates/authentication-templates/authentication-templates.md and its pagesthe authentication module; OtpService (hashed, namespaced, counted attempts, cooldown, issue limit)M3c498done / gap (M3c)—
10Direct Send (beta)direct-send and its pagescategory, TTL, the Direct Send configurationrefused today (design §4.3); M5a2037done / gap (M5a)the templates Direct Send generates are listed through the template list's source filter (TemplateListQuery::source); their insights are WhatsApp Manager's
11WhatsApp Flowsflows and its pages; reference/whatsapp-business-phone-number/business-encryption-api.mdthe management API, a typed Flow JSON model and builder, the business public key, endpoint crypto and signature, media decryption, nfm_reply and flows webhooksanswers and flow_updated events; sending in M5a, management and the endpoint in M5d1460–63done / partial (M5a, M5d)the metrics API is skipped (Meta deprecated it on 2026-04-30); Flow JSON is typed in client::flows::flow_json (parity row 63, L18)
12Callingcalling and its pages; reference/whatsapp-business-phone-number/calling-api.mdsettings (hours, SIP, voicemail, icons, restrictions), permissions, connect, pre-accept, accept, reject, terminate; the per-call recording and transcription options on connect and accept (L14); the calls webhooks, with recording and transcription availabilitythe call events; the rest in M5e1974, 75, 134, 135done / partial (M5e)WebRTC media is the integrator's stack; the recordings and transcripts download through the Media API (the transcript document is not typed)
13Groupsgroups and its pages; reference/groups/groups-query-api.md and its neighbours, reference/whatsapp-business-phone-number/groups-management-api.mdcreate, info, list, update, picture, delete, invite links, participants, join requests, pin; group webhooks and analyticssends to a group and group_updated events; management in M5f1835, 76–81done / partial (M5f)adding participants is kept with a warning (OPEN_QUESTIONS #23)
14Catalogs and commercecatalogs/catalogs-overview and its pages; reference/whatsapp-business-phone-number/commerce-settings-api.md; for the reads, Meta's Catalog API, outside these docs (parity § Sources)commerce settings; the WABA's connected catalog, a catalog's products and product sets, a set's products and one product, paged by cursor (L17); single-product, multi-product, catalog and product-carousel messages; catalog, MPM, SPM and product-card-carousel templates; order webhooksorder events; product messages in M5a, the rest in M5g5102–105done / partial (M5a, M5g)catalog writes (uploading inventory, connecting a catalog to a WABA) stay in Commerce Manager or the Catalog API, not wrapped
15Payments (India UPI, Brazil Pix and Boleto)payments/payments-in/overview.md, payments/payments-br/overview.md and their pagesIndia (P1a): the order_details and order_status messages (client::payments::OrderDetails, client::payments::OrderStatus), the payment lookup and refunds (client::payments::Payments), onboarding (client::payments::PaymentConfigurations); the payment_configuration_update webhook; Brazil (P1b): the same messages for BRL (Pix, payment links, Boleto, one-click; client::payments::OrderDetailsParameters::brl, client::payments::OrderStatus::brl), checked by Brazil's rules; the templates' payment buttons and the payment status webhooks (P1c) only through MessageContent::Raw or not at allpayment_configuration_updated events3238, 141partial / partial (P2)in scope since 2026-09-26, last in the roadmap
16Marketing Messages APImarketing-messages/overview.md and its pages; reference/whatsapp-business-phone-number/marketing-messages-api-for-whatsapp.md, reference/business/whatsapp-business-partner-onboarding-to-mm-lite-api.mdsend, onboarding status, client WABAs by status, the Cloud API marketing switch, partner onboarding; max price (its agreement, template duplication, a template's max price) and reach estimates (L13); click events (user_actions)clicks are operator-only until M2d (D25); the rest in M5h13136, 137, 154partial / gap (M2d, M5h)a GIF header's send-time parameter is not typed (no page of 2026-11-01 shows it); signing the max price agreement is a legal act: its own explicit call, which no other call makes, and the deployer's to make (OPEN_QUESTIONS #45); Meta withdrew the partner allow list with the open beta (2026-10-01); metrics and conversion measurement come from Meta's ads APIs
17Click-to-WhatsApp adsctwa/welcome-message-sequences; embedded-signup/automatic-events-apithe referral on inbound messages, the automatic events webhook, welcome message sequences (L13)the referral in message_received, automatic_event_detected events2, 31138done / partial (M5h)naming a sequence in an ad creative is Meta's Marketing API; the service has no route for the sequences yet (M5h)
18Conversation routing (handover)conversation-routing/overview and its pages; webhooks/reference/messaging-handovers (nm), webhooks/reference/standby (nm)messaging_handovers and standby webhooks typed, conversation_context parsed; the thread control API (client::thread_control::ThreadControl: pass, take, release) and the Routing Roles API (client::thread_control::ThreadControl::routing_roles)the two types are operator-only until M2d (D25); the thread control API in M5l29139done / gap (M2d, M5l)the thread control API (L15) and the Routing Roles API (L15a) are wrapped, and the inbox records the caller's own calls when told; the inbox tracks ownership and refuses a reply locally while another app owns the thread (OPEN_QUESTIONS #44: L7)
19Webhookswebhooks/overview.md, webhooks/create-webhook-endpoint.md, webhooks/override.md, webhooks/set-up-whatsapp-echo-bot.md, webhooks/reference/messages.md and the other reference pages; reference/webhooks/whatsapp-incoming-webhook-payload.mdverification, signatures with several secrets, every field, normalized events, Unknown and Unparsed, the leased dedup, dead letters for permanently failing events (L21a), an axum router, SSE; a conformance sweep over the 88 pages that print a payloadPOST /webhooks/meta (signature before the body, dedup across replicas, routing to the owning tenant), the event outbox, GET /v1/events; SSE in M2b, webhooks-out in M2c, the reviewed types in M2d; since S2b a previous holder's undated events no longer reach a WABA's new holder after a move (operator-only for 7 days and an hour, D36)2, 337–10, 33, 55, 84done / partial (M2b, M2c, M2d)message_echoes and consumer_profile arrive as Unknown (undocumented payloads)
20Business phone numbers (registration, two-step PIN, settings, display names, local storage, identity change, throughput, messaging limits)business-phone-numbers/phone-numbers, business-phone-numbers/registration, business-phone-numbers/two-step-verification, display-names, identity-change, local-storage, no-storage.md, throughput.md, messaging-limits, upcoming-messaging-limits-changes.md; reference/whatsapp-business-phone-number/whatsapp-business-account-phone-number-api.md and its neighbourslist, get, create, request and verify a code, register, deregister, PIN, settings, display name, webhook override, data localization, identity check, coexistence sync, the business username, search visibility, security notifications, number-change notices, the Official Business Account request and status, compliance information (India), health statuslist and get numbers (without the messaging limit tier, parity row 109); registration and the PIN in M3d; the rest in M5c2 and M5c310, 25, 3365, 66, 108, 109, 128–132, 156done / partial (M3d, M5c2, M5c3)every cited row is done in the library, row 156 since roadmap L26: payload-encryption settings (settings-api) and the number's POST fields connection_status and webhook_url, by their schemas (Meta documents none of them with an example)
21Conversational components (welcome message, ice breakers, commands)business-phone-numbers/conversational-components; reference/whatsapp-business-account/conversational-automation-api.md, reference/whatsapp-business-bot/bot-details-api.mdread and configure; bot details by id (GET /{WABA-Bot-ID})the settings in M5c3, commands over the bot API in M5k1085, 133partial / gap (M5c3, M5k)dispatching commands is the bot framework's (category 40, parity row 85)
22Business profilesbusiness-profiles; reference/whatsapp-business-phone-number/whatsapp-business-profile-api.md, reference/whatsapp-business-profile/whatsapp-business-profile-node-api.mdthe phone-number and profile-node APIs, the picture by upload handleget and patch without the picture (M5c2)11, 3364done / partial (M5c2)—
23WhatsApp Business Accountswhatsapp-business-accounts.md; reference/whatsapp-business-account/whatsapp-business-account-api.md and its neighbours, reference/business/whatsapp-business-accounts-api.md and its neighboursdetails, update, phone numbers, subscribed apps with the override, assigned users, client and owned WABAs, customer bases; creating a WABA, its activities, its Multi-Partner Solutions, a portfolio's system users, a client business's system user token (L10b)list WABAs, admin attach and unbind, disconnect; the rest in M5c412, 33126, 127partial / partial (M5c4)not wrapped: GET /{BUSINESS_ID}/whatsapp_business_accounts (the owned list is read through owned_whatsapp_business_accounts; its business_type filter is an array whose encoding the page does not show); partner-initiated creation is a Business Suite flow, not an API
24Business-scoped user IDs and usernamesbusiness-scoped-user-idssend by BSUID or parent BSUID, identities on every event, user_id_update, request contact info, a BSUID-keyed inbox, deleting a contact book entry, the parent BSUID account (Business::parent_bsuid_account)BSUID recipients, user_id_changed events; request contact info in M5a, the contact book in M5c3, parent BSUID accounts in M5c4929, 36, 73, 151, 152done / partial (M5a, M5c3, M5c4)the parent BSUID accounts API is served from api.facebook.com: its one URL there is the only one on that host the client's credential rules let carry a token (L10a); the business username calls are category 20
25Block usersblock-users; reference/whatsapp-business-phone-number/block-api.mdblock, unblock, list (phone number or BSUID, partial failures)M5g1771done / gap (M5g)—
26QR codes and short linksqr-codes.md; reference/whatsapp-business-phone-number/whatsapp-business-qr-code-api.md, reference/whatsapp-business-phone-number/whatsapp-business-qr-code-management-api.mdcreate, update, get, list, delete, image formatM5g16106done / gap (M5g)—
27Analyticsanalyticsmessaging, conversation, pricing, template, template-group, call and group analytics; template insights; click-tracking opt-outgroups' analytics in M5f, the rest in M5g1581, 107done / gap (M5f, M5g)—
28Pricing and billingpricing.md, pricing/conversation-based-pricing.md and its neighbours, pricing/prepaid-billing (nm); reference/whatsapp-business-account/extended-credits-api.mdpricing on status webhooks, pricing analytics, credit lines, the billing currency or payment method migration (L10b)pricing inside status_updated events; credit lines with the Solution Partner mode in M3a; the billing currency migration in M5j24, 15, 28, 1233, 142, 147partial / partial (M3a, M5j)not wrapped: prepaid billing (page not mirrored); AI-provider pricing is policy only
29Embedded Signup and onboardingembedded-signup/overview and its pages, in-app-signupv4 launch options, session events, code exchange, token checks, the vault, an approval gate, resume, both partner modes, hosted Embedded Signup (L11a), every granted WABA of a signup as an option (L11b); pre-verified number pools, codes and sharing (L11c); In-App SignupM3a and M3f (In-App Signup in M5i)1, 6120–123, 125done / gap (M3a, M3f, M5i)v2 and v3 retire on 2026-10-15
30Coexistence (WhatsApp Business app users)embedded-signup/onboarding-business-app-users; webhooks/reference/history.md, webhooks/reference/smb_app_state_sync.md, webhooks/reference/smb_message_echoes.mdonboarding, contacts and history sync (requested by onboarding itself by default since L11d, an option turning it off), echoes, history and the synced contacts recorded by the inbox (the contacts since L8, through the port L5 changed)echoes and history recorded and delivered as events; onboarding and the automatic sync (D7) in M3b2169, 124done / partial (M3b)—
31Solution providers and partnerssolution-providers/overview.md and its pages; reference/whatsapp-business-solution/solution-details-api.md and its neighbours, reference/application/application-solutions-api.md and its neighbours, reference/whatsapp-business-account-migration-intent/migration-intent-details-api.md, reference/user/assigned-whatsapp-business-accounts-api.mdcredit lines, partner-led business verification, Multi-Partner Solutions (create, accept, reject, deactivation, reads, an app's solutions and connected client businesses, a client's business token), migration intents, the number migration flag, the partner_solutions webhook, a user's assigned WABAs (L10b)credit lines in M3a; the rest in M5j28, 1, 12142–146done / gap (M3a, M5j)pixel tracking and measurement partners are not APIs
32Account model evolution (Messaging Accounts, WhatsApp accounts)account-model-evolution and its pages; reference/whatsapp-account-number/whatsapp-account-number-api.mdthe Messaging Account a send bills (messaging_account_id)none30140partial / gap (M5c4, M5c5)the WAAC and Messaging Account endpoints and the whatsapp_account webhook wait for Meta's phase 2 (L16b)
33Policy, quality, opt-in and limitspolicy-enforcement.md, policy-enforcement-violations.md, messaging-limits, getting-opt-in, upcoming-messaging-limits-changes.md, throughput.mdaccount and quality webhooks, the limit tier and throughput fields, error kinds (pair limit, spam limit, opt-out); sends paced per number under the throughput, each person once, the pair limit deferring one recipient, a throughput upgrade's maintenance outlasted and, when asked, the upgrade followed (Broadcast, Pacer, TokenBucket, KvRateLimiter, Backoff, ThroughputUpgrades)the error model on those kinds; the account and quality events2, 10, 22, 3489, 109, 149, 150done / partial (M5c3, M5k)the daily messaging limit (unique users per 24 hours) is Meta's to enforce and counted by nothing here; the pacer's budget is per process unless the replicas share one through a KvStore (KvRateLimiter, B2b: opt-in, clocks assumed synchronized), and a throughput upgrade is followed only when asked (ThroughputUpgrades, B2a), in memory with a TokenBucket or for every replica with a KvRateLimiter; an opt-in registry stays a non-goal
34Support, errors and healthsupport.md, support/error-codes.md, support/health-status.md, support/api-status-page.md, support/experiments.md, support/load-testing.mdevery documented error code classified into ErrorKind, with retry safety; health_status typed once and read on numbers, WABAs and templatesthe error model, health and metrics22, 33113, 132done / partial (M5c3)Meta documents health_status on numbers, WABAs and templates, not on the business node: a business's status is the BUSINESS entity of each; the username errors (147001–147005, business-scoped-user-ids, not in support/error-codes) are ErrorKind::Unknown
35Security, privacy and encryptiondata-privacy-and-security, no-storage.md, identity-change; reference/whatsapp-business-phone-number/business-encryption-api.mdsignature checks, secrets out of logs and URLs, the encrypted token vault, Flows crypto, the identity-key check, data localizationkey digests, constant-time compares, ownership before the vault; not exposed yet: the Flows data endpoint (M5d), the two-step PIN (M3d), the identity-key and local-storage settings (M5c3)1, 2, 10, 14, 25, 337, 62, 110, 128done / partial (M3d, M5c3, M5d)—
36Message history eventsreference/message-history/whatsapp-business-message-history-events-api.mda history entry's delivery events, filtered by status, paged (L10b)none12148done / gap (M5c4)where its id comes from is documented nowhere in Meta's WhatsApp docs
37Scheduled campaigns (Meta's side)reference/whatsapp-business-account/schedules-api.mdlist and create Meta's campaign schedules (L10b); scheduling of our own besides, durable jobs (KvJobs, JobRunner, B3; category 40)none1290done / gap (M5k)reference only; the audience id is explained nowhere in Meta's docs
38Documents (ours, not Meta's)nonemeta-whatsapp-typst: invoices, receipts, vouchers to PDF or PNGthe documents route in M423118done / gap (M4)—
39CMS inbox, adapters, the HTTP service (ours)nonethe inbox with a 24-hour window check; memory, Postgres, SQLite and Redis key/value and conversation stores (SQLite and the Redis conversation store since L8); sinks; the reqwest transportM1 (M1a–M1c) shipped; inbox routes in M2a, SSE and webhooks-out in M2b and M2c; the backend bundle and its ports in the service's core since S1, their contracts right for any backend since S2, and executable suites in core since S3, which both backends pass; the service composed from a bundle alone since S4, so an integrator's backend is served with no change to the server; since S2b every backend records a WABA's moves and a bind generation (D26)26, 27, 3310, 110–112, 119done / partial (M2a, M2b, M2c)MongoDB adapters come with the service's MongoDB backend (S17)
40Bot framework (ours; Zaileys parity)nonemeta-whatsapp-bot (B1): commands with prefixes, aliases, quoted arguments, captions, payloads, usage hints and metadata; subcommands and flags (Command::subcommand, Command::flag, B1b); guards (private or group only, owners, banned senders, cooldowns on KvStore); a generated help and Meta's command menu (Bot::sync_command_menu); middleware (Middleware, Next); compile-time plugins (Plugin); listeners by message type or event kind (Listen); reactions (Ctx::react); Markdown replies (Ctx::reply_markdown); rich replies (Ctx::reply_rich, B1c: images, suggestions as reply buttons or a list, product carousels); paced broadcasts (Broadcast, Pacer, B2), the bot's read receipts, typing indicators and replies in the same budget (BotBuilder::pacer), and the client's group operations too (PacedGroups, PacedGroup); durable scheduled jobs that survive a restart (KvJobs, JobRunner, B3); retention and auto-delete of the stored history by age and a cap per chat (RetentionPolicy, RetentionSweeper, over ConversationStore::trim_conversations and purge_before, B4)the bot and broadcast APIs in M5k; retention per store in M2a; erasure of a customer in M2f3417, 85–92done / gap (M2a, M2f, M5k)hot reload is not offered (design D28); Meta's group info gives participants no role, so owners stand in for Zaileys' group admins

How to keep this true ​

A pull request that moves a category's status updates its row here in the same PR, with its parity rows and coverage rows (see parity.md § How to keep this true). A new area Meta adds to its docs gets the next free number.

Released under the MIT License.