---
title: "Custom rates updated"
method: POST
path: "campaign.custom_rates_updated"
tags: ["Webhook Events"]
---

# Custom rates updated

`POST campaign.custom_rates_updated` (webhook)

A creator's custom rates on a campaign were set, changed or reset. `changeSource` is `campaign_edit` when a campaign edit reset some (a removed payout, or its new value applied to them too). Like any terms change, the new values apply to every unpaid window of that creator at once; changes to the campaign itself arrive as `campaign.updated`. Read the creator's full terms with GET /campaigns/{id}/custom-rates/{creatorId}.

## Headers

- `webhook-id` string, required
- `webhook-timestamp` string, required
- `webhook-signature` string, required

## Payload

- CampaignCustomRatesUpdatedWebhookEvent: A creator's custom rates on a campaign were set, changed or reset. `changeSource` is `campaign_edit` when a campaign edit reset some (a removed payout, or its new value applied to them too). Like any terms change, the new values apply to every unpaid window of that creator at once; changes to the campaign itself arrive as `campaign.updated`. Read the creator's full terms with GET /campaigns/{id}/custom-rates/{creatorId}.
  - `id` string, required: Event id; the `webhook-id` header. The same on every retry: dedupe on it.
  - `type` 'campaign.custom_rates_updated', required
  - `timestamp` string, date-time, required: When the change happened
  - `organizationId` string, required
  - `actor` WebhookActor, required: Who caused the event: a member (`user`), an API key (`apiKeyId`), a creator, or viral.app itself (`system`); `surface` says where the change entered. Skip events your own API key caused to avoid loops.
    - `type` 'user' | 'api_key' | 'creator' | 'system', required
    - `surface` 'ui' | 'api' | 'copilot' | 'system', required
    - `userId` string, nullable, required
    - `apiKeyId` string, nullable, required
    - `impersonated` boolean, required
  - `data` object, required
    - `campaign` object, required
      - `id` string, required
      - `name` string, required
    - `creator` object, required
      - `orgCreatorId` string, required
      - `creatorUserId` string, required
    - `customRates` object, nullable, required
      - `videoTarget` integer, nullable, required
      - `videoTargetPlatforms` object, nullable, required
      - `values` object[], required
        - `id` string, required
        - `field` 'perVideo' | 'videoCap' | 'amountCap' | 'rate' | 'amount', required
        - `value` number, required
    - `changeSource` 'set' | 'update' | 'reset' | 'campaign_edit', required
    - `revision` integer, required

## Acknowledgement `200`

Any 2xx within 15 seconds acknowledges the event. Anything else, a timeout or a redirect is retried (10 attempts over about 3 days); 410 disables the endpoint.

---

[API](https://skmtc.dev/viral/apis/viral-app-api.md) · [All operations](https://skmtc.dev/viral/apis/viral-app-api/llms.txt) · [OpenAPI document](https://skmtc.dev/viral/apis/viral-app-api/revisions/31e97fa79ef1?raw)
