Drawing 1 · Interactive
Trace how a portfolio hands out WhatsApp access
- Business portfolio to System user: create
- System user to App installed: install
- App installed to Access token: generate
- Business portfolio to Owned WABA: owns
- Owned WABA to Assigned user: add user
- Access token to WhatsApp calls: Bearer
- Assigned user to WhatsApp calls: tasks
- Business portfolio to Credit line: owns
- Credit line to Client WABA: attach
Hop 7 of 7
Assigned userWhatsApp callstasks
Arrives at WhatsApp calls — templates, numbers.
Hop 7 of 7: Assigned user to WhatsApp calls — tasks.
What is the Business Management API?
The Business Management API is the part of Meta's Graph API that manages a business portfolio (still called Meta Business Manager in many guides) and the identities and assets inside it. Where most WhatsApp calls act on a WhatsApp Business Account (WABA) or a phone number, these calls act on the layer above: the portfolio node /{BUSINESS_ID}, the WABAs it owns (/{BUSINESS_ID}/owned_whatsapp_business_accounts), the WABAs clients have shared with it (/{BUSINESS_ID}/client_whatsapp_business_accounts), its system users (/{BUSINESS_ID}/system_users), the apps installed for them and the tokens they issue. It is the same API Meta uses for ad accounts, Pages and catalogues; WhatsApp is one family of assets among several.
For WhatsApp teams the most useful calls are about identity. POST /{SYSTEM_USER_ID}/applications installs your app for a system user; POST /{SYSTEM_USER_ID}/access_tokens, with business_app, scope and an appsecret_proof, generates a system user access token, and set_token_expires_in_60_days=true makes it a 60-day token instead of a never-expiring one. Expiring tokens are refreshed through /oauth/access_token with grant_type=fb_exchange_token and revoked with /oauth/revoke, which gives you rotation without downtime. Asset assignment, POST /{WABA_ID}/assigned_users?user=…&tasks=['MANAGE'], decides which system user may act on which WABA and how much it may do.
The name invites confusion with the WhatsApp Business Management API, and the difference is the level. The WhatsApp Business Management API manages WhatsApp objects (message templates, phone numbers, analytics, subscribed apps) and needs whatsapp_business_management. The Business Management API manages the portfolio, its people and its partners, and portfolio-level calls need business_management, a permission Meta describes as rarely needed because the same work can be done in Meta Business Suite. Solution Partners also meet it in credit-line sharing (/{BUSINESS_ID}/extendedcredits and whatsapp_credit_sharing_and_attach), where a partner's credit line is attached to a client's WABA. Customers onboarded through Embedded Signup show up here as client WABAs, but the per-customer business integration system user access token comes from the signup code exchange, not from this API.
Key takeaways
- The Business Management API is the Graph API layer for the business portfolio itself: system users, their tokens, assets and partners.
- It sits above WhatsApp: the WhatsApp Business Management API handles templates and numbers, this one handles who can reach them.
- Portfolio-level calls need the
business_managementpermission, which Meta says most WhatsApp integrations rarely need. - System user tokens come from
POST /{SYSTEM_USER_ID}/access_tokens, as never-expiring or 60-day tokens you refresh and revoke. - Assign a WABA to a system user with
POST /{WABA_ID}/assigned_users, using an admin system user's token and tasks such asMANAGEorDEVELOP.
Design intent
Why does the Business Management API matter?
Clicking through Business Settings works for one WABA and one integration. It breaks down for an enterprise running 30 WABAs across brands, an agency handing accounts back to clients, or a partner provisioning tokens for every new environment. The Business Management API turns those chores into code: an inventory of every WABA and who can act on it, system users created with only the tasks they need, tokens that rotate on a schedule, and offboarding that removes access in one reviewed script instead of a dozen manual clicks someone forgets.
Implementation
The Business Management API in code
# WABAs your portfolio ownscurl "https://graph.facebook.com/v26.0/{BUSINESS_ID}/owned_whatsapp_business_accounts?fields=id,name" \-H "Authorization: Bearer {ADMIN_SYSTEM_USER_TOKEN}"# WABAs clients have shared with you (for example through Embedded Signup)curl "https://graph.facebook.com/v26.0/{BUSINESS_ID}/client_whatsapp_business_accounts?fields=id,name" \-H "Authorization: Bearer {ADMIN_SYSTEM_USER_TOKEN}"# The portfolio's system userscurl "https://graph.facebook.com/v26.0/{BUSINESS_ID}/system_users" \-H "Authorization: Bearer {ADMIN_SYSTEM_USER_TOKEN}"
Paginate with the cursors in each response's paging object when the lists are long.
Operating sequence
How does the Business Management API work?
Get portfolio-level access
Use a token from an admin system user that holds
business_managementfor portfolio calls. Keep this identity for provisioning scripts only, never for sending messages.Inventory your assets
List the WABAs you own with
GET /{BUSINESS_ID}/owned_whatsapp_business_accountsand those shared with you withGET /{BUSINESS_ID}/client_whatsapp_business_accounts, thenGET /{BUSINESS_ID}/system_usersfor the identities.Install the app and issue tokens
Call
POST /{SYSTEM_USER_ID}/applicationswithbusiness_app, thenPOST /{SYSTEM_USER_ID}/access_tokenswith the permissions the service needs and anappsecret_proof. Prefer 60-day tokens so rotation is routine.Assign WABAs with the right tasks
Grant each system user only the WABAs it needs through
POST /{WABA_ID}/assigned_users:MANAGEfor full control,DEVELOPfor developer access, or granular tasks such asMANAGE_TEMPLATES.Rotate, audit and offboard
Refresh tokens with
fb_exchange_token, deploy, then revoke the old one. Reviewassigned_usersper WABA regularly and remove access with DELETE when a service, agency or partner leaves.
Specifications
The Business Management API: key facts and limits
- Acts on
- Business portfolio, system users, apps, assets, partners
- Portfolio permission
- business_management (rarely needed for messaging)
- Owned WABAs
- GET /{BUSINESS_ID}/owned_whatsapp_business_accounts
- Shared WABAs
- GET /{BUSINESS_ID}/client_whatsapp_business_accounts
- Issue a token
- POST /{SYSTEM_USER_ID}/access_tokens
- Token lifetimes
- Never-expiring, or 60 days (set_token_expires_in_60_days)
- Assign a WABA
- POST /{WABA_ID}/assigned_users with tasks (MANAGE, DEVELOP…)
- Credit Line API limit
- 5,000 requests per hour
Failure modes
Common mistakes with the Business Management API
Calling it for WhatsApp objects
Templates, phone numbers and analytics belong to the WhatsApp Business Management API and need
whatsapp_business_management. A token with onlybusiness_managementcannot create a template.Granting business_management everywhere
Portfolio access in a sending service turns a leaked token into control of the whole portfolio, and unneeded permissions are a common App Review rejection reason. Keep it in one provisioning identity.
Assigning assets with a regular system user
Adding users to a WABA needs an admin system user's token. A regular (
EMPLOYEE) system user can act only on what it was given and cannot hand out access.Non-expiring tokens nobody rotates
Meta suggests 60-day tokens because a leaked never-expiring token stays valid indefinitely. If you keep non-expiring ones, rotate them on a schedule anyway.
Running audits in a tight loop
assigned_userssits under the per-WABA business use case limit of 200 calls an hour, or 5,000 for an active WABA. Spread large audits out and read the usage header.
Example: A quarterly access audit at a Gurugram consumer group
A Gurugram consumer-goods group runs 14 brands on 30 WABAs. Its quarterly audit script lists the owned WABAs, then reads assigned_users for each and compares the result with an approved list in Git. The run flags a system user named after a former campaign agency that still holds MANAGE on four brand WABAs, and a template-sync service holding MANAGE where MANAGE_TEMPLATES would do. After sign-off, the script removes the agency's assignments with DELETE, reassigns the sync service with the narrower task, refreshes the sender's 60-day token, deploys it and revokes the old one. The whole review takes an afternoon and leaves a diff the security team can read.
Recommended practice
Best practices for the Business Management API
- Keep the approved map of system users, WABAs and tasks in Git and let the audit script report any drift.
- Name system users after their job (
wa-sender-prod,wa-templates-sync) so a review can tell what each one is for. - Use granular tasks such as
MANAGE_TEMPLATESinstead ofMANAGEwhen a service needs only one kind of access. - Remove an agency's or partner's assignments on the day the contract ends, then rotate any token they could have seen.