> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apostra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Operator fees

> Add your own percentage fee to the campaigns you run for client accounts, and decide who sees it.

An **operator** is an organization that runs campaigns for its clients' accounts,
such as an agency buying media for each client from that client's own account.
An **operator fee** is a percentage the operator keeps from the client's gross
budget on every media buy, beside Apostra's own fee. The seller never sees it:
it receives a smaller media budget, and nothing else changes for it.

> [!NOTE]
>
> Operator fees are in beta and are switched on per organization. Ask your
> Apostra contact to turn them on for your organization.

## Before you start

You can set an operator fee on a campaign when all of these hold:

* Operator fees are switched on for your organization.
* The campaign's account is one of your organization's accounts, and its media
  is invoiced to your organization. A client account under your organization is
  invoiced to your organization by default. If the account's media is invoiced
  to anyone else, the fee is refused.
* The campaign has a budget. The fee is a percentage of it.
* You act for your organization: you are signed in to it, or working in the
  client's account through it. Buyer agents cannot set an operator fee.

## Set the fee

Send `operatorFees` with `save_campaign`, on create or update:

```json theme={null}
{
  "campaignId": "cmp_123",
  "operatorFees": [{ "name": "operator_fee", "rate": 0.02 }]
}
```

The entry uses AdCP's price-adjustment field names:

| Field | Meaning |
| - | - |
| `name` | Always `operator_fee` |
| `rate` | The fee as a decimal share of the campaign's gross budget: `0.02` is 2%. Above 0 and at most `0.49`, with at most six decimal places. The 49% ceiling only catches typing mistakes, such as 20% entered for 2% |
| `beneficiary` | Optional. Your organization's account id. It is the default, and any other value is refused |

A campaign has at most one operator fee. To remove it, send an empty array:

```json theme={null}
{ "campaignId": "cmp_123", "operatorFees": [] }
```

You can remove a fee even after operator fees are switched off for your
organization.

The v2 REST campaign requests take the same `operatorFees` field: see
[Create campaign](https://docs.apostra.com/v2/buyer/campaigns/tasks/create-campaign.md) and
[Update campaign](https://docs.apostra.com/v2/buyer/campaigns/tasks/update-campaign.md).

## When the fee applies

The fee locks onto each media buy when the buy is created, beside Apostra's
own fee terms. Media buys that already exist keep the terms they locked, so a
change to the campaign's fee applies only to media buys created afterwards.

Both fees are percentages of the gross budget, and the rest buys media:

```
operator fee = gross budget × operator rate
Apostra fee  = gross budget × Apostra rate
media        = gross budget − operator fee − Apostra fee
```

For example, a $1,000 media buy with a 3% Apostra fee and a 2% operator fee
gives Apostra $30, the operator $20, and the seller a $950 media budget. Budget
changes on a live media buy split again at its locked rates. See
[Budgets and fees](https://docs.apostra.com/v2/concepts/budgets-and-fees) for how gross budgets work.

A media buy is refused, with `operatorFees` named as the field, if the
account's media is no longer invoiced to your organization when the buy is
created. Remove the fee from the campaign, or ask your Apostra contact about
the account's invoicing.

## Who pays whom

Apostra invoices your organization for the media and Apostra's fee, as it does
today. You invoice your client and keep your fee: it is never charged through
Apostra. Apostra records the fee against your organization in its own books so
that its statements reconcile with the media buy. Apostra invoicing your client
directly is not available yet.

## Who sees the fee

The fee is visible according to whose side the caller is on, not their role:

| Caller | What they see on a media buy with an operator fee |
| - | - |
| Your organization's people and their API keys, including when they work in a client's account through your organization | The full split: gross budget, media budget, Apostra's fee and your fee |
| The client account's own people, keys and agents | The total cost only, unless your organization lets its accounts see its contract terms, which shows them your fees too |
| A buyer agent with an advertiser grant | The total cost only, unless the grant is marked `showsFeeBreakdown` and your organization is the agent's own organization |
| A seller | The media budget only, as for every media buy |

On a campaign read, `operatorFees` is present only for a caller who may see the
split; for everyone else it is absent, not zero. `operatorFeeEditable: true`
says that the caller may set or remove the fee on that campaign.

On a media buy, the v2 `budget_breakdown` carries the fee as its own
`operator_fees` line with its `amount` and `beneficiary`. A caller who sees the
total cost only receives no `budget_breakdown` for that buy.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.