---
title: "Share the Page with a partner business"
method: POST
path: "/v1/accounts/{accountId}/business-partners"
tags: ["Accounts"]
---

# Share the Page with a partner business

`POST /v1/accounts/{accountId}/business-partners`

## Request

- Base URL: `https://zernio.com/api`
- URL: `https://zernio.com/api/v1/accounts/{accountId}/business-partners`
- Auth: HTTP bearer

Grants a partner business portfolio tasks on the Facebook Page behind this account.
With `ADVERTISE`, the partner can run ads for the Page from ad accounts in its own
portfolio, which is how an integrator advertises for an end user without touching
the end user's ad accounts.

Meta only lets a user token share a Page that a business portfolio owns. A Page
outside any portfolio must first be claimed into one at business.facebook.com; this
endpoint answers `422` until that is done. Meta refuses a second grant to a portfolio
that already has access instead of replacing its tasks, so that case answers `200`
with `alreadyShared: true` and the tasks the partner currently holds. To change a
partner's tasks, revoke and grant again.

After the grant, the partner assigns its own people to the Page with
`POST /v1/ads/page-users`; Meta does not assign partner admins automatically.
The Instagram professional account linked to the Page is returned in `page` so the
partner can reference it; Meta exposes no API to share Instagram accounts, that is
done in Business Settings.

## Path parameters

- `accountId` string, required

## Request body

- object
  - `businessId` string, required: Meta business portfolio id of the partner (numeric string).
  - `permittedTasks` string[]: Tasks granted on the Page, Meta's permitted_tasks vocabulary. Defaults to ADVERTISE and ANALYZE. The bare names are what Business Settings shows; the PROFILE_PLUS_ names are the New Pages Experience tasks and the only way to grant FACEBOOK_ACCESS or REVENUE. Granting MANAGE also yields MANAGE_LEADS.

## Response `200`

The portfolio already had access; nothing changed

- object
  - `page` MetaPageOwnership
    - `id` string: Facebook Page id.
    - `name` string
    - `business` object, nullable: Business portfolio that owns the Page; null when the Page is outside any portfolio.
      - `id` string
      - `name` string
    - `instagramBusinessAccount` object, nullable: Instagram professional account linked to the Page; null when none is linked.
      - `id` string
      - `username` string
  - `partner` object
    - `businessId` string
    - `permittedTasks` string[]: Tasks the partner currently holds.
  - `alreadyShared` boolean: Always true on this response.

## Other responses

- `201`: Page shared
- `400`: Invalid request
- `401`: Missing or invalid API key. `code` is `missing_credentials` when no Authorization header was sent and `invalid_credentials` when the key is unknown, revoked or expired.
- `403`: Meta refused: the connecting user lacks business_management or is not an admin of the owning portfolio. Reconnect the account.
- `404`: Account not found, or Meta could not load the partner business.
- `422`: The Page is not owned by a business portfolio, or no Page is linked to the account.
- `429`: The connected account's upstream platform quota is exhausted. Reddit rate-limits per connected Reddit user (1000 requests per 10-minute window), and that budget is shared by every operation using that account. Retry after the window resets rather than retrying immediately; repeated calls while exhausted do not succeed and keep the budget spent. Google Ads: writes and reports run on one developer token shared by every Google Ads account on Zernio. The token holds Standard access (no daily operations cap), so this only happens when Google throttles the token or your ad account. The envelope has `code: rate_limited`, `platform: google`, `details.quotaScope: DEVELOPER` (`ACCOUNT` when it is your own ad account's quota), `details.resetsAt` (ISO instant when Google accepts requests again) and `Retry-After` counting down to it. Retrying earlier cannot succeed. Meta ads: every Meta throttle (codes 4, 17, 32, 613 and the business-use-case codes 80000-80014) returns 429 `rate_limited`, even when Meta itself answers HTTP 400. `Retry-After` comes from Meta's `x-business-use-case-usage` estimate when Meta sends one, otherwise it is Meta's documented 60-second minimum (30 seconds for the one-write-per-30-seconds limit on a single object). Pinterest ads: Pinterest rate-limits per user and app, per category (ads_read, ads_write, ads_analytics). `Retry-After` comes from Pinterest's `x-ratelimit-reset` when it sends one, otherwise 60 seconds.

## Changes

- **2026-10-06** `f8c8f34fb41a`: 3 warning
  - added the new `account` enum value to the `details/budgetScope` response property for the response status `400`
  - added the new `account` enum value to the `details/budgetScope` response property for the response status `401`
  - added the new `account` enum value to the `details/budgetScope` response property for the response status `429`
- **2026-10-02** `d556591af3f6`: 9 info
  - added the optional property `code` to the response with the `401` status
  - added the optional property `details` to the response with the `401` status
  - added the optional property `docUrl` to the response with the `400` status
  - added the optional property `docUrl` to the response with the `401` status
  - …5 more
- **2026-09-30** `16a7b9d5373e`: 2 info
  - removed the `platform` enum value from the `details/budgetScope` response property for the response status `400`
  - removed the `platform` enum value from the `details/budgetScope` response property for the response status `429`
- **2026-09-29** `698a0d89ab62`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/zernio/apis/zernio-api/changes/v1/accounts/:accountId/business-partners/post.md)

---

[API](https://skmtc.dev/zernio/apis/zernio-api.md) · [All operations](https://skmtc.dev/zernio/apis/zernio-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zernio/apis/zernio-api/revisions/4e74db179e73?raw)
