> For the complete documentation index, see [llms.txt](https://docs.onlymonster.ai/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.onlymonster.ai/integrations-and-api/openapi.md).

# Onlymonster API

#### Base URLs

* **Production:** `https://omapi.onlymonster.ai`

#### Rate limits

* **Token limit:** 25 requests per second across all endpoints.
* **Endpoint limit:** 15 requests per second per endpoint (default). Some endpoints override this — see the description on each endpoint.
* **Platform account limit:** 1 request per second per platform account on selected endpoint groups — endpoints that apply it say so in their description.
* Exceeding either limit returns `429 Rate limit exceeded`.<br>

#### API key permissions

Each API key carries the permissions chosen when it was created. A request to an endpoint the key is not permitted to call returns `403` with `code: API_KEY_PERMISSION_DENIED` and the missing permission in `details.required_permission`.

Permissions are independent of the key's account access: a request needs both. Keys created before permissions were introduced hold every permission. Each endpoint's description names its required permission.

* `accounts.view` — `GET /api/v0/accounts`, `GET /api/v0/accounts/{account_id}`
* `dashboard.view` — `GET …/transactions`, `GET …/chargebacks`
* `team_metrics.view` — `GET /api/v0/users/metrics`, `GET /api/v0/members`
* `traffic_metrics.view` — `GET …/tracking-links`, `GET …/tracking-link-users`, `GET …/trial-links`, `GET …/trial-link-users`, `GET …/subscriptions`
* `onlyfans.messages` — `GET /api/v0/accounts/{account_id}/fans`, `GET` / `POST …/chats/{chat_id}/messages`, `PATCH …/fans/{fan_id}`
* `onlyfans.collections` — `POST …/fans/{fan_id}/subscribe`
* `onlyfans.statements` — `GET /proxy/v0/…/statements/balances`, `GET` / `POST /proxy/v0/…/statements/payout-requests`
* `auto_messages.view` — `GET …/auto-message-campaigns`, `GET …/auto-message-campaigns/{campaign_id}`
* `auto_messages.edit` — `POST …/auto-message-campaigns`, `PATCH …/auto-message-campaigns/{campaign_id}/status`, `POST …/auto-message-campaigns/{campaign_id}/unsend`
* `media_uploader.manage` — All `…/vault/…` endpoints: folders, medias, thumbnails and media uploads
* `settings.view` — Account session export (enabled per organisation)

<br>

## Get list of accounts.

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`accounts.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"accounts","description":"Endpoints for accessing account lists and detailed account information."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts":{"get":{"summary":"Get list of accounts.","tags":["accounts"],"description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `accounts.view`","parameters":[{"schema":{"minLength":2,"type":"string"},"in":"query","name":"cursor","required":false},{"schema":{"minimum":1,"maximum":1000,"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"type":"boolean"},"in":"query","name":"withExpiredSubscriptions","required":false}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"accounts":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"integer"},"platform_account_id":{"anyOf":[{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},{"type":"string"}]},"platform":{"type":"string"},"name":{"type":"string"},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"avatar":{"type":"string"},"username":{"type":"string"},"organisation_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},"subscribe_price":{"anyOf":[{"type":"number"},{"type":"null"}]},"subscription_expiration_date":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"custom_label":{"description":"Organization-private name of the account, shown in the panel instead of the platform username. `null` when no label is set.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["id","platform_account_id","platform","name","email","avatar","username","organisation_id","subscribe_price","subscription_expiration_date","custom_label"]}},"nextCursor":{"type":"string"}},"required":["accounts"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Create a Priority Mass Messages broadcast

> \*\*Rate limit:\*\* 1 request per second\
> \
> \*\*A created broadcast is a real broadcast to its whole audience, not a draft.\*\* Without a schedule it is queued and goes out without further action; with one it waits for the hour it names. Use the status endpoint to pause it.\
> \
> \*\*This endpoint is not idempotent, and a repeated create is a second broadcast to every fan it matches.\*\* A request that times out, or that answers \`500\` or \`502\`, may still have created one: whether it exists is unknown, so list the account broadcasts before retrying and pause a duplicate at once. Listing the broadcasts needs \`priority\_mass\_messages.view\` in addition to \`priority\_mass\_messages.edit\`.\
> \
> A schedule and an end are each a wall-clock date and whole hour plus the clock it is read on. An offset carried by the value is ignored. A schedule in the past goes out at once, an end before the schedule is accepted, and a broadcast whose end passes completes as sent whatever state it was in.\
> \
> A broadcast reads its schedule back as the UTC instant plus the zone name, not as the wall clock it was stated on, and reads it back as \`null\` once it has been dispatched.\
> \
> \`audience\_filters\[].options.lists\[].name\` is required on every fan list and never published back: the reads carry identifiers alone.\
> \
> Revoking or narrowing the key that created a broadcast does not stop it. Pause it through the status endpoint instead.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns":{"post":{"summary":"Create a Priority Mass Messages broadcast","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 1 request per second\n\n**A created broadcast is a real broadcast to its whole audience, not a draft.** Without a schedule it is queued and goes out without further action; with one it waits for the hour it names. Use the status endpoint to pause it.\n\n**This endpoint is not idempotent, and a repeated create is a second broadcast to every fan it matches.** A request that times out, or that answers `500` or `502`, may still have created one: whether it exists is unknown, so list the account broadcasts before retrying and pause a duplicate at once. Listing the broadcasts needs `priority_mass_messages.view` in addition to `priority_mass_messages.edit`.\n\nA schedule and an end are each a wall-clock date and whole hour plus the clock it is read on. An offset carried by the value is ignored. A schedule in the past goes out at once, an end before the schedule is accepted, and a broadcast whose end passes completes as sent whatever state it was in.\n\nA broadcast reads its schedule back as the UTC instant plus the zone name, not as the wall clock it was stated on, and reads it back as `null` once it has been dispatched.\n\n`audience_filters[].options.lists[].name` is required on every fan list and never published back: the reads carry identifiers alone.\n\nRevoking or narrowing the key that created a broadcast does not stop it. Pause it through the status endpoint instead.\n\n**Required permission:** `priority_mass_messages.edit`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"not":{}},"type":"object","properties":{"name":{"description":"Broadcast name. Required when the broadcast sends more than one message, and when its only message carries media but no text. A single text message sent without a name reads back with that text as its name.","anyOf":[{"type":"null"},{"minLength":1,"maxLength":100,"pattern":"\\S","type":"string"}]},"scheduled_at":{"format":"date-time","description":"Wall-clock date and whole hour at which the broadcast goes out, read on the clock `scheduled_at_timezone_mode` names. An offset carried by the value is ignored, so the hour written is the hour used — the value is not moved to the instant an offset would name. Required together with `scheduled_at_timezone_mode`. A schedule in the past is accepted and goes out at once. Omit both to send as soon as the broadcast is queued.","type":"string"},"scheduled_at_timezone_mode":{"type":"string","enum":["utc","organisation"]},"rules":{"additionalProperties":false,"description":"When the broadcast stops, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"type":"string","enum":["off","online_now","online_only"],"description":"Whether the broadcast waits for the fan to be online before sending. Omit for `off`."},"unsend_delay_sec":{"type":"integer","enum":[3600,7200,18000,28800,54000,72000],"description":"Delay after which a sent message is recalled: 1, 2, 5, 8, 15 or 20 hours, the choices the panel offers. Omit to never recall."},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. Stated only together with `unsend_delay_sec`. Omit for false, which recalls every message.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat. Omit for false.","type":"boolean"},"end_at":{"format":"date-time","description":"Wall-clock date and whole hour at which the broadcast stops, read on the clock `end_at_timezone_mode` names. An offset carried by the value is ignored, so the hour written is the hour used. Required together with `end_at_timezone_mode`. An end before the schedule is accepted; when the end passes the broadcast completes as sent whatever state it is in, so a paused broadcast past its end can no longer be resumed and an early end can complete a broadcast that sent nothing.","type":"string"},"end_at_timezone_mode":{"type":"string","enum":["utc","organisation"]}}},"audience_filters":{"maxItems":20,"description":"Who the broadcast sends to. At least one include filter is required. A fan-list include is not combined with an include of another kind, and one list does not appear twice under one kind.","type":"array","items":{"anyOf":[{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","purchased_from_account"]},"mode":{"type":"string","enum":["include"]},"options":{"additionalProperties":false,"minProperties":1,"description":"A window stated either as a date range (`from_at`/`to_at`) or as a range of days ago (`from_days`/`to_days`), never as both at once.","type":"object","properties":{"from_at":{"format":"date-time","type":"string"},"to_at":{"format":"date-time","type":"string"},"from_days":{"minimum":0,"maximum":1000000,"type":"integer"},"to_days":{"minimum":1,"maximum":1000000,"type":"integer"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["spent_within_organisation","spent_within_account"]},"mode":{"type":"string","enum":["include"]},"options":{"additionalProperties":false,"minProperties":1,"type":"object","properties":{"from_amount_gross":{"minimum":0,"type":"number"},"to_amount_gross":{"minimum":0,"type":"number"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"lists":{"minItems":1,"maxItems":100,"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the fan list.","type":"string"},"name":{"minLength":1,"maxLength":255,"description":"Name of the fan list. Stored and shown in the panel; never published back here.","type":"string"}},"required":["id","name"]}}},"required":["lists"]}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["active_chatted"]},"mode":{"type":"string","enum":["exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"within_last_min":{"minimum":0,"maximum":525600,"type":"integer"}},"required":["within_last_min"]}},"required":["kind","mode","options"]}]}},"messages":{"minItems":1,"maxItems":5,"description":"Messages to send, in order: the broadcast and up to four follow-ups.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"text":{"description":"Text the fan receives, rendered per fan. Null for a message that carries only media. A message carries text, at least one attachment, or both. A fan's name is a placeholder written exactly as the panel writes it: `{{ name | default: \"babe\" }}`, where `name` is the name on the fan's profile, `displayName` the name the organisation assigned the fan, and the quoted `default:` value what the fan is called when the name is missing.","anyOf":[{"type":"null"},{"maxLength":5000,"type":"string"}]},"price_gross":{"description":"Price the fan pays for this message, before any platform deduction. 0 makes it free; any other amount is between 3 and 200. A price requires something behind the paywall — `text_is_paid` or an attachment with `is_paid` — and either of those requires a price.","anyOf":[{"type":"number","enum":[0]},{"minimum":3,"maximum":200,"type":"number"}]},"delay_sec":{"minimum":0,"maximum":2592000,"description":"Delay after the previous message before this one is sent. Accepted on follow-ups only — a delay on the first message is refused, because the broadcast itself decides when it goes out.","type":"integer"},"attachments":{"maxItems":100,"description":"Media to attach. Empty for a message that carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True to put the attachment behind the paywall, hiding it from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True to put the text itself behind the paywall, so the fan buys the message to read it. Requires text that is not empty or whitespace.","type":"boolean"},"tagged_platform_account_ids":{"maxItems":10,"description":"Platform accounts to tag in this message, by their identifier on the platform.","type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}}},"required":["text","price_gross","attachments","text_is_paid","tagged_platform_account_ids"]}}},"required":["rules","audience_filters","messages"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose broadcasts are read."}],"responses":{"201":{"description":"One Priority Mass Messages broadcast of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Priority Mass Messages broadcast of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}}}},"400":{"description":"The request states something this endpoint cannot accept: a value outside its bounds, an audience no broadcast can be built from, a message whose price and paywall disagree, half a schedule pair, a time that is not a whole hour, or a fan list that does not exist. A refusal this endpoint decides itself carries no code.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request states something this endpoint cannot accept: a value outside its bounds, an audience no broadcast can be built from, a message whose price and paywall disagree, half a schedule pair, a time that is not a whole hour, or a fan list that does not exist. A refusal this endpoint decides itself carries no code.","type":"object","properties":{"message":{"description":"What to change about the request.","type":"string"},"code":{"type":"string","enum":["DYNAMIC_LIST_NOT_FOUND","RESTRICTED_WORDS_DETECTED","CAMPAIGN_NAME_REQUIRED_FOR_MEDIA_ONLY","INVALID_CAMPAIGN_DATA","CAMPAIGN_NOT_CREATED","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."},"details":{"additionalProperties":false,"description":"Present on `RESTRICTED_WORDS_DETECTED`: the words and the topics the content check matched. Either list may be empty when the check names one and not the other.","type":"object","properties":{"words":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"string"}}},"required":["words","topics"]}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. The broadcast may still have been created: list the account broadcasts before retrying.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. The broadcast may still have been created: list the account broadcasts before retrying.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The broadcast could not be created or confirmed. Whether it exists is unknown — list the account broadcasts before retrying, and pause a duplicate at once.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast could not be created or confirmed. Whether it exists is unknown — list the account broadcasts before retrying, and pause a duplicate at once.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Recall what a Priority Mass Messages broadcast sent

> \*\*Rate limit:\*\* 5 requests per second\
> \
> The broadcast stops sending and the messages it delivered are taken back out of the fans' chats, as far as the platform's 24-hour recall window allows. A recall is possible within 24 hours of the broadcast's last status change.\
> \
> \*\*This cannot be undone and it is not limited to broadcasts this API created.\*\* Any broadcast of the account can be recalled, including one a person built in the panel.\
> \
> A \`502\` does not promise the broadcast is untouched, but no repeat recalls twice, so repeating the request is safe; read the broadcast if the answer stays \`502\`. This differs from the Auto Messages recall, whose \`502\` asks the caller to read the campaign before repeating at all. Reading the broadcast needs \`priority\_mass\_messages.view\` in addition to \`priority\_mass\_messages.edit\`.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns/{campaign_id}/unsend":{"post":{"summary":"Recall what a Priority Mass Messages broadcast sent","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nThe broadcast stops sending and the messages it delivered are taken back out of the fans' chats, as far as the platform's 24-hour recall window allows. A recall is possible within 24 hours of the broadcast's last status change.\n\n**This cannot be undone and it is not limited to broadcasts this API created.** Any broadcast of the account can be recalled, including one a person built in the panel.\n\nA `502` does not promise the broadcast is untouched, but no repeat recalls twice, so repeating the request is safe; read the broadcast if the answer stays `502`. This differs from the Auto Messages recall, whose `502` asks the caller to read the campaign before repeating at all. Reading the broadcast needs `priority_mass_messages.view` in addition to `priority_mass_messages.edit`.\n\n**Required permission:** `priority_mass_messages.edit`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the broadcast belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Broadcast identifier."}],"responses":{"204":{"description":"The recall was applied: the broadcast stops sending and takes back what it can."},"400":{"description":"The broadcast is not in a state a recall can start from: the wrong state, a paused broadcast that never started sending, or one whose last status change is more than 24 hours old. One code covers every cause; read the broadcast to tell which.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast is not in a state a recall can start from: the wrong state, a paused broadcast that never started sending, or one whose last status change is more than 24 hours old. One code covers every cause; read the broadcast to tell which.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_NOT_RECALLABLE"]}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The broadcast does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The recall did not complete. No broadcast is recalled twice by a repeat, so repeating the request is safe; read the broadcast if the answer stays 502. This differs from the Auto Messages recall, whose 502 asks the caller to read the campaign before repeating at all.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The recall did not complete. No broadcast is recalled twice by a repeat, so repeating the request is safe; read the broadcast if the answer stays 502. This differs from the Auto Messages recall, whose 502 asks the caller to read the campaign before repeating at all.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_RECALL_NOT_APPLIED"]}},"required":["message","code"]}}}}}}}}}
```

## Retrieve the Priority Mass Messages broadcasts of an account

> \*\*Rate limit:\*\* 5 requests per second\
> \
> A schedule reads back as \`null\` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\
> \
> Sent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its \`reply\_rate\` then reads \`null\` rather than a figure above 1.\
> \
> A broadcast whose content could not be read is listed with \`messages: \[]\` and every figure at zero, rather than failing the page.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns":{"get":{"summary":"Retrieve the Priority Mass Messages broadcasts of an account","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nA schedule reads back as `null` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\n\nSent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its `reply_rate` then reads `null` rather than a figure above 1.\n\nA broadcast whose content could not be read is listed with `messages: []` and every figure at zero, rather than failing the page.\n\n**Required permission:** `priority_mass_messages.view`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":50,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 1, max: 100, default: 50)."},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false,"description":"Items to skip (default: 0)."},{"schema":{"default":false,"type":"boolean"},"in":"query","name":"include_archived","required":false,"description":"Include archived broadcasts in the page (default: false). Only `archived` is affected — every other state is always listed."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose broadcasts are read."}],"responses":{"200":{"description":"A page of the account Priority Mass Messages broadcasts, newest first.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A page of the account Priority Mass Messages broadcasts, newest first.","type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}},"has_more":{"description":"True when more broadcasts exist beyond this page.","type":"boolean"}},"required":["items","has_more"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The content of this page could not be read at all. The broadcasts exist and are unchanged, and repeating the request is safe. A single broadcast whose content is gone does not cause this — it is listed with `messages: []` and its figures at zero instead.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The content of this page could not be read at all. The broadcasts exist and are unchanged, and repeating the request is safe. A single broadcast whose content is gone does not cause this — it is listed with `messages: []` and its figures at zero instead.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message","code"]}}}}}}}}}
```

## Retrieve one Priority Mass Messages broadcast

> \*\*Rate limit:\*\* 5 requests per second\
> \
> A schedule reads back as \`null\` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\
> \
> Sent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its \`reply\_rate\` then reads \`null\` rather than a figure above 1.\
> \
> A broadcast whose content could not be read is refused with \`502\` here, because that content is exactly what was asked for.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns/{campaign_id}":{"get":{"summary":"Retrieve one Priority Mass Messages broadcast","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nA schedule reads back as `null` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\n\nSent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its `reply_rate` then reads `null` rather than a figure above 1.\n\nA broadcast whose content could not be read is refused with `502` here, because that content is exactly what was asked for.\n\n**Required permission:** `priority_mass_messages.view`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the broadcast belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Broadcast identifier."}],"responses":{"200":{"description":"One Priority Mass Messages broadcast of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Priority Mass Messages broadcast of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The broadcast does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"This broadcast exists and is unchanged; only its content could not be read, and here it is exactly what was asked for. Repeating the request is safe. A temporary failure to read the content passes on a later repeat; content missing for good answers the same on every repeat.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"This broadcast exists and is unchanged; only its content could not be read, and here it is exactly what was asked for. Repeating the request is safe. A temporary failure to read the content passes on a later repeat; content missing for good answers the same on every repeat.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message","code"]}}}}}}}}}
```

## Pause or resume a Priority Mass Messages broadcast

> \*\*Rate limit:\*\* 5 requests per second\
> \
> The answer says which state the broadcast holds now, which is not always the one asked for: resuming a broadcast paused before its schedule came due answers \`scheduled\`, because it keeps that schedule.\
> \
> A paused broadcast can be resumed for five days; after a further period it is archived automatically and can no longer be resumed. There is no manual archive.\
> \
> Asking for a state the broadcast already holds is accepted and changes nothing. A change that fails for a reason that is not about the request answers a plain \`502\` with no code.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns/{campaign_id}/status":{"patch":{"summary":"Pause or resume a Priority Mass Messages broadcast","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nThe answer says which state the broadcast holds now, which is not always the one asked for: resuming a broadcast paused before its schedule came due answers `scheduled`, because it keeps that schedule.\n\nA paused broadcast can be resumed for five days; after a further period it is archived automatically and can no longer be resumed. There is no manual archive.\n\nAsking for a state the broadcast already holds is accepted and changes nothing. A change that fails for a reason that is not about the request answers a plain `502` with no code.\n\n**Required permission:** `priority_mass_messages.edit`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"State to move the broadcast to.\n`paused` — the broadcast stops sending. Accepted from scheduled, queued and sending; pausing a paused broadcast changes nothing.\n`queued` — the broadcast resumes. Accepted for a paused broadcast within the resume window, and for one already queued, which changes nothing.","type":"object","properties":{"status":{"type":"string","enum":["paused","queued"]}},"required":["status"]}}},"required":true,"description":"State to move the broadcast to.\n`paused` — the broadcast stops sending. Accepted from scheduled, queued and sending; pausing a paused broadcast changes nothing.\n`queued` — the broadcast resumes. Accepted for a paused broadcast within the resume window, and for one already queued, which changes nothing."},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the broadcast belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Broadcast identifier."}],"responses":{"200":{"description":"The state the broadcast holds now. A resume answers `queued`, or `scheduled` when the broadcast was paused before its schedule came due and keeps it.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The state the broadcast holds now. A resume answers `queued`, or `scheduled` when the broadcast was paused before its schedule came due and keeps it.","type":"object","properties":{"status":{"type":"string","enum":["paused","queued","scheduled"]}},"required":["status"]}}}},"400":{"description":"The requested state is not one of the two, or the broadcast is in a state the change does not start from. One code covers both causes of a refused resume — a state a resume does not start from, and a broadcast paused longer than the resume window — and the message says which applied.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The requested state is not one of the two, or the broadcast is in a state the change does not start from. One code covers both causes of a refused resume — a state a resume does not start from, and a broadcast paused longer than the resume window — and the message says which applied.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"type":"string","enum":["CAMPAIGN_NOT_PAUSABLE","CAMPAIGN_NOT_RESUMABLE"],"description":"Machine-readable error code."}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The broadcast does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The change did not complete, for a reason that is not about the request. Read the broadcast to learn the state it holds before repeating.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The change did not complete, for a reason that is not about the request. Read the broadcast to learn the state it holds before repeating.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Get account by ID.

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`accounts.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"accounts","description":"Endpoints for accessing account lists and detailed account information."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}":{"get":{"summary":"Get account by ID.","tags":["accounts"],"description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `accounts.view`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"account":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"integer"},"platform_account_id":{"anyOf":[{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},{"type":"string"}]},"platform":{"type":"string"},"name":{"type":"string"},"email":{"anyOf":[{"type":"string"},{"type":"null"}]},"avatar":{"type":"string"},"username":{"type":"string"},"organisation_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},"subscribe_price":{"anyOf":[{"type":"number"},{"type":"null"}]},"subscription_expiration_date":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"custom_label":{"description":"Organization-private name of the account, shown in the panel instead of the platform username. `null` when no label is set.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["id","platform_account_id","platform","name","email","avatar","username","organisation_id","subscribe_price","subscription_expiration_date","custom_label"]}},"required":["account"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve subscriptions for a platform account

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`traffic\_metrics.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/platforms/{platform}/accounts/{platform_account_id}/subscriptions":{"get":{"summary":"Retrieve subscriptions for a platform account","tags":["statistics"],"description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `traffic_metrics.view`","parameters":[{"schema":{"format":"date-time","type":"string"},"in":"query","name":"start","required":true,"description":"Start of the subscription timestamp range (ISO 8601 Zulu)."},{"schema":{"format":"date-time","type":"string"},"in":"query","name":"end","required":true,"description":"End of the subscription timestamp range (ISO 8601 Zulu)."},{"schema":{"minimum":10,"maximum":1000,"default":100,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 10, max: 1000, default: 100)."},{"schema":{"type":"string"},"in":"query","name":"cursor","required":false,"description":"Pagination cursor returned from the previous request."},{"schema":{"type":"string","enum":["onlyfans"]},"in":"path","name":"platform","required":true,"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"schema":{"anyOf":[{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},{"type":"string"}]},"in":"path","name":"platform_account_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"items":{"description":"Array of subscription records associated with the account.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"fan":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Unique identifier of the fan.","type":"string"}},"required":["id"]},"price_gross":{"description":"Gross subscription price paid by the fan.","type":"number"},"regular_price_gross":{"description":"Regular gross subscription price without discounts.","type":"number"},"action":{"description":"Subscription action type (subscribe, prolong, return, unknown).","type":"string"},"type":{"description":"Subscription type (regular, promo, trial, bundle, auto, discount, personal_trial, unknown).","type":"string"},"subscribed_at":{"format":"date-time","description":"ISO 8601 timestamp of when the subscription started.","type":"string"},"expires_at":{"format":"date-time","description":"ISO 8601 timestamp of when the subscription expires.","type":"string"}},"required":["fan","price_gross","regular_price_gross","action","type","subscribed_at","expires_at"]}},"cursor":{"description":"Base64-encoded cursor for paginating subsequent results. Present only if additional pages exist.","type":"string"}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Get fan IDs for an account based on recent chat activity.

> \*\*Rate limit:\*\* 1 request per second\
> \
> \*\*Required permission:\*\* \`onlyfans.messages\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"accounts","description":"Endpoints for accessing account lists and detailed account information."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/fans":{"get":{"summary":"Get fan IDs for an account based on recent chat activity.","tags":["accounts"],"description":"**Rate limit:** 1 request per second\n\n**Required permission:** `onlyfans.messages`","parameters":[{"schema":{"minimum":1,"maximum":10000,"default":10000,"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"fan_ids":{"type":"array","items":{"type":"string"}}},"required":["fan_ids"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve payout balances for a platform account

> \*\*Rate limit:\*\* 1 request per second per platform account (shared "proxy" group).\
> \
> \*\*Required permission:\*\* \`onlyfans.statements\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statements","description":"Endpoints for retrieving account payout balances and statements."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/proxy/v0/platforms/{platform}/accounts/{platform_account_id}/statements/balances":{"get":{"summary":"Retrieve payout balances for a platform account","tags":["statements"],"description":"**Rate limit:** 1 request per second per platform account (shared \"proxy\" group).\n\n**Required permission:** `onlyfans.statements`","parameters":[{"schema":{"type":"string","enum":["onlyfans"]},"in":"path","name":"platform","required":true,"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"schema":{"anyOf":[{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},{"type":"string"}]},"in":"path","name":"platform_account_id","required":true,"description":"Unique account identifier returned by the OnlyFans platform."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"payoutAvailable":{"description":"Balance available for withdrawal. Balances accumulate creator earnings after the OnlyFans platform fee.","type":"number"},"payoutPending":{"description":"Earnings not yet matured for withdrawal (see manualPayoutPendingDays).","type":"number"},"currency":{"description":"ISO 4217 currency code; all monetary values in this response are in major units.","type":"string"},"minPayoutSumm":{"description":"Minimum available balance required to request a payout.","type":"number"},"maxPayoutSumm":{"description":"Maximum amount withdrawable at this moment.","type":"number"},"withdrawalPeriodOptions":{"description":"Withdrawal period options available for the account.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"code":{"description":"Machine-readable withdrawal period code.","type":"string"},"name":{"description":"Human-readable withdrawal period name.","type":"string"}},"required":["code","name"]}},"manualPayoutPendingDays":{"description":"Number of days a manual payout stays pending before it becomes available.","type":"integer"},"withdrawalPeriod":{"description":"Currently selected withdrawal period code.","type":"string"}},"required":["payoutAvailable","payoutPending","currency","minPayoutSumm","maxPayoutSumm","withdrawalPeriodOptions","manualPayoutPendingDays","withdrawalPeriod"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"422":{"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message"]}}}}}}}}}
```

## Retrieve payout requests for a platform account

> \*\*Rate limit:\*\* 1 request per second per platform account (shared "proxy" group).\
> \
> \*\*Required permission:\*\* \`onlyfans.statements\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statements","description":"Endpoints for retrieving account payout balances and statements."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/proxy/v0/platforms/{platform}/accounts/{platform_account_id}/statements/payout-requests":{"get":{"summary":"Retrieve payout requests for a platform account","tags":["statements"],"description":"**Rate limit:** 1 request per second per platform account (shared \"proxy\" group).\n\n**Required permission:** `onlyfans.statements`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 1, max: 100, default: 10)."},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false,"description":"Number of items to skip."},{"schema":{"type":"number"},"in":"query","name":"marker","required":false,"description":"Snapshot marker returned by a previous response. Pass it back to keep pagination consistent while new payout requests arrive; omit to paginate the live list with plain offsets."},{"schema":{"type":"string","enum":["onlyfans"]},"in":"path","name":"platform","required":true,"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"schema":{"anyOf":[{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},{"type":"string"}]},"in":"path","name":"platform_account_id","required":true,"description":"Unique account identifier returned by the OnlyFans platform."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"list":{"description":"Payout request records, newest first.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"invoiceId":{"description":"Unique identifier of the payout invoice.","type":"string"},"createdAt":{"format":"date-time","description":"ISO 8601 timestamp when the payout request was created.","type":"string"},"amount":{"description":"Requested payout amount, drawn from the available balance.","type":"number"},"currency":{"description":"ISO 4217 currency code of the payout; amount is in major units.","type":"string"},"state":{"description":"Current state of the payout request.","type":"string"},"rejectReason":{"description":"Reason the payout request was rejected, or null if not rejected.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["invoiceId","createdAt","amount","currency","state","rejectReason"]}},"marker":{"description":"Snapshot marker for consistent pagination. Pass it as the \"marker\" query parameter of the next page request.","anyOf":[{"type":"number"},{"type":"null"}]}},"required":["list","marker"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"422":{"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message"]}}}}}}}}}
```

## Create a payout request for a platform account

> Requests a withdrawal of the given amount from the account's available balance.\
> \
> This action is irreversible: OnlyFans does not support idempotency for this request. Do not blindly retry on timeout — first check the payout requests list to see whether the request was created.\
> \
> \*\*Rate limit:\*\* 1 request per second per platform account (shared "proxy" group).\
> \
> This endpoint is in gradual rollout: it is enabled per organization, and organizations without access receive 403 Forbidden.\
> \
> \*\*Required permission:\*\* \`onlyfans.statements\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statements","description":"Endpoints for retrieving account payout balances and statements."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/proxy/v0/platforms/{platform}/accounts/{platform_account_id}/statements/payout-requests":{"post":{"summary":"Create a payout request for a platform account","tags":["statements"],"description":"Requests a withdrawal of the given amount from the account's available balance.\n\nThis action is irreversible: OnlyFans does not support idempotency for this request. Do not blindly retry on timeout — first check the payout requests list to see whether the request was created.\n\n**Rate limit:** 1 request per second per platform account (shared \"proxy\" group).\n\nThis endpoint is in gradual rollout: it is enabled per organization, and organizations without access receive 403 Forbidden.\n\n**Required permission:** `onlyfans.statements`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"withdrawal_amount":{"minimum":0,"maximum":1000000,"description":"Amount to withdraw in USD major units, up to 2 decimal places. Must not exceed the available balance (see the balances endpoint).","type":"number"}},"required":["withdrawal_amount"]}}},"required":true},"parameters":[{"schema":{"type":"string","enum":["onlyfans"]},"in":"path","name":"platform","required":true,"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"schema":{"anyOf":[{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},{"type":"string"}]},"in":"path","name":"platform_account_id","required":true,"description":"Unique account identifier returned by the OnlyFans platform."}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"list":{"description":"Payout requests affected by this call.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"state":{"description":"State of the created payout request.","type":"string"},"rejectReason":{"description":"Reason the payout request was rejected, or null if not rejected.","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["state","rejectReason"]}}},"required":["list"]}}}},"400":{"description":"Either an OnlyFans rejection returned as-is (the \"error\" object), or an om-api validation error (\"message\" + \"code\") — never both.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"Either an OnlyFans rejection returned as-is (the \"error\" object), or an om-api validation error (\"message\" + \"code\") — never both.","type":"object","properties":{"error":{"additionalProperties":false,"type":"object","properties":{"code":{"description":"Upstream OnlyFans error code.","type":"number"},"message":{"description":"Upstream OnlyFans error message.","type":"string"},"payload":{"description":"Structured context OnlyFans attaches to some errors."}}},"errors":{"description":"Additional error map OnlyFans returns for some failures."},"message":{"description":"Validation error message.","type":"string"},"code":{"description":"Machine-readable validation error code.","anyOf":[{"type":"string","enum":["INVALID_AMOUNT_TYPE"]},{"type":"string","enum":["FACE_VERIFICATION_REQUIRED"]}]}}}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"422":{"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message"]}}}},"503":{"description":"The payout audit trail could not be recorded, so the request was never sent to OnlyFans. Retrying is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The payout audit trail could not be recorded, so the request was never sent to OnlyFans. Retrying is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PAYOUT_AUDIT_UNAVAILABLE"]}},"required":["message","code"]}}}}}}}}}
```

## Get chat messages for a specific chat.

> \*\*Rate limit:\*\* 1 request per second\
> \
> \*\*Required permission:\*\* \`onlyfans.messages\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"messages","description":"Endpoints for sending messages."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/chats/{chat_id}/messages":{"get":{"summary":"Get chat messages for a specific chat.","tags":["messages"],"description":"**Rate limit:** 1 request per second\n\n**Required permission:** `onlyfans.messages`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":100,"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"type":"integer"},"in":"query","name":"message_id","required":false,"description":"ID of the last message from previous page. Used for pagination"},{"schema":{"anyOf":[{"type":"string","enum":["asc"]},{"type":"string","enum":["desc"]}]},"in":"query","name":"order","required":false},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"},{"schema":{"minLength":1,"maxLength":100,"type":"string"},"in":"path","name":"chat_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"integer"},"text":{"type":"string"},"from_user":{"type":"integer"},"is_sent_by_me":{"description":"true = sent by account owner (creator), false = sent by fan","type":"boolean"},"created_at":{"type":"string"},"media":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"string"},"can_view":{"type":"boolean"},"is_ready":{"type":"boolean"},"has_error":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"converted_to_video":{"type":"boolean"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"thumbnail_url":{"type":"string"}},"required":["id","type","can_view","is_ready","has_error","converted_to_video","created_at","thumbnail_url"]}},"media_count":{"type":"integer"},"is_opened":{"description":"read/unread: false = unread","type":"boolean"},"is_new":{"type":"boolean"},"price":{"type":"number"},"is_free":{"type":"boolean"},"can_purchase":{"type":"boolean"},"can_purchase_reason":{"type":"string"},"sender":{"additionalProperties":false,"description":"Who sent the message on the creator side. Best-effort, resolved for recent messages only; both keys are always present and both are `null` when unknown.","type":"object","properties":{"type":{"description":"Sender kind:\n- `chatter` — a team member sending manually\n- `am` — auto-message campaign\n- `pmm` — PMM campaign\n- `scheduled` — follow-up message\n- `mimic` — Mimic\n- `api` — sent through the API\n- `mass_message` — mass message\n- `null` — unknown: incoming from the fan, not sent through OnlyMonster, or not resolved","anyOf":[{"type":"null"},{"type":"string","enum":["chatter"]},{"type":"string","enum":["am"]},{"type":"string","enum":["pmm"]},{"type":"string","enum":["scheduled"]},{"type":"string","enum":["mimic"]},{"type":"string","enum":["api"]},{"type":"string","enum":["mass_message"]}]},"user_id":{"description":"OnlyMonster user id of the team member. `null` when unknown or when the sender is not a person, e.g. `api`.","anyOf":[{"type":"null"},{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}]}},"required":["type","user_id"]}},"required":["id","text","from_user","is_sent_by_me","created_at","media","media_count","is_opened","is_new","price","is_free","can_purchase","can_purchase_reason","sender"]}},"has_more":{"description":"true if more messages are available beyond the returned page","type":"boolean"}},"required":["items","has_more"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Send a message to a chat.

> \*\*Rate limit:\*\* 1 request per second\
> \
> The message text is scanned by the content-moderation service before being enqueued.\
> Requests whose text matches restricted words or topics return \`400\` with\
> \`code: "RESTRICTED\_WORDS\_DETECTED"\` and the matching \`words\` / \`topics\` in \`details\`.\
> \
> \*\*Required permission:\*\* \`onlyfans.messages\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"messages","description":"Endpoints for sending messages."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/chats/{chat_id}/messages":{"post":{"summary":"Send a message to a chat.","tags":["messages"],"description":"**Rate limit:** 1 request per second\n\nThe message text is scanned by the content-moderation service before being enqueued.\nRequests whose text matches restricted words or topics return `400` with\n`code: \"RESTRICTED_WORDS_DETECTED\"` and the matching `words` / `topics` in `details`.\n\n**Required permission:** `onlyfans.messages`","requestBody":{"content":{"application/json":{"schema":{"allOf":[{"additionalProperties":false,"type":"object","properties":{"text":{"anyOf":[{"type":"null"},{"minLength":1,"maxLength":5000,"description":"The message text content. Required unless a media file is present.","type":"string"}]},"price":{"default":null,"description":"Price for the message (0 or null for free, or between 3-200 for paid content). A paid message (price >= 3) must carry at least one paid item.","anyOf":[{"type":"number","enum":[0]},{"minimum":3,"maximum":200,"type":"number"},{"type":"null"}]},"locked_text":{"default":false,"description":"If true, the text is locked behind the paywall (paid text). Requires price >= 3 and counts as a paid item, so media is not required.","type":"boolean"},"media":{"maxItems":100,"default":[],"description":"Media attachments (already uploaded to platform)","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"minLength":1,"maxLength":100,"description":"Existing platform media ID","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"If true, this media is locked behind the paywall and excluded from the preview shown to the recipient before purchase. Only meaningful when price >= 3.","type":"boolean"}},"required":["id","type"]}}},"required":["text","price","locked_text","media"]},{"if":{"properties":{"price":{"type":"number","minimum":3}},"required":["price"]},"then":{"anyOf":[{"properties":{"locked_text":{"enum":[true]}},"required":["locked_text"]},{"properties":{"media":{"contains":{"properties":{"is_paid":{"enum":[true]}},"required":["is_paid"]}}},"required":["media"]}]}},{"if":{"properties":{"media":{"contains":{"properties":{"is_paid":{"enum":[true]}},"required":["is_paid"]}}},"required":["media"]},"then":{"properties":{"price":{"type":"number","minimum":3}},"required":["price"]}},{"if":{"properties":{"locked_text":{"enum":[true]}},"required":["locked_text"]},"then":{"properties":{"price":{"type":"number","minimum":3}},"required":["price"]}},{"if":{"properties":{"text":{"enum":[null]}},"required":["text"]},"then":{"properties":{"media":{"minItems":1}},"required":["media"]}}]}}}},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"},{"schema":{"minLength":1,"maxLength":100,"type":"string"},"in":"path","name":"chat_id","required":true}],"responses":{"202":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"send_id":{"format":"uuid","description":"Unique identifier for tracking this send by webhook","type":"string"}},"required":["send_id"]}}}},"400":{"description":"Default Response","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"code":{"type":"string","enum":["RESTRICTED_WORDS_DETECTED"]},"details":{"type":"object","properties":{"words":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"string"}}},"required":["words","topics"]}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Update the private labels of a fan. (For OnlyFans account only)

> Sets the custom name and the note the account owner keeps for a fan.\
> \
> Both are private to the account owner: they are never shown to the fan and are not the\
> fan's profile name on the platform.\
> \
> \*\*Rate limit:\*\* 1 request per second\
> \
> \*\*Required permission:\*\* \`onlyfans.messages\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"fans","description":"Endpoints for managing fan data of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/fans/{fan_id}":{"patch":{"summary":"Update the private labels of a fan. (For OnlyFans account only)","tags":["fans"],"description":"Sets the custom name and the note the account owner keeps for a fan.\n\nBoth are private to the account owner: they are never shown to the fan and are not the\nfan's profile name on the platform.\n\n**Rate limit:** 1 request per second\n\n**Required permission:** `onlyfans.messages`","requestBody":{"content":{"application/json":{"schema":{"description":"At least one field must be present. Fields left out keep their current value.","anyOf":[{"title":"custom_name provided","additionalProperties":false,"type":"object","properties":{"custom_name":{"minLength":1,"maxLength":100,"description":"Private label shown to the account owner instead of the fan's nickname. Cannot be empty — there is no way to restore the nickname once a custom name is set.","type":"string"},"note":{"maxLength":200,"description":"Private note about the fan. An empty string clears the note.","type":"string"}},"required":["custom_name"]},{"title":"note provided","additionalProperties":false,"type":"object","properties":{"custom_name":{"minLength":1,"maxLength":100,"description":"Private label shown to the account owner instead of the fan's nickname. Cannot be empty — there is no way to restore the nickname once a custom name is set.","type":"string"},"note":{"maxLength":200,"description":"Private note about the fan. An empty string clears the note.","type":"string"}},"required":["note"]}]}}},"description":"At least one field must be present. Fields left out keep their current value."},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"fan_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"success":{"type":"boolean"}},"required":["success"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"No fan with the given fan_id exists for this account on the platform.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"No fan with the given fan_id exists for this account on the platform.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"422":{"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message"]}}}}}}}}}
```

## Subscribe the account to a fan. (For OnlyFans account only)

> Makes the account follow the fan on the platform and returns the resulting subscription.\
> Subscribing to a fan the account already follows is not an error: the existing subscription\
> is returned unchanged.\
> \
> \*\*Rate limit:\*\* 1 request per second\
> \
> \*\*Required permission:\*\* \`onlyfans.collections\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"fans","description":"Endpoints for managing fan data of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/fans/{fan_id}/subscribe":{"post":{"summary":"Subscribe the account to a fan. (For OnlyFans account only)","tags":["fans"],"description":"Makes the account follow the fan on the platform and returns the resulting subscription.\nSubscribing to a fan the account already follows is not an error: the existing subscription\nis returned unchanged.\n\n**Rate limit:** 1 request per second\n\n**Required permission:** `onlyfans.collections`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"fan_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"fan":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Identifier of the fan.","type":"string"}},"required":["id"]},"subscribed":{"description":"Whether the account is subscribed to the fan.","type":"boolean"},"subscribed_at":{"description":"Start of the account's subscription to the fan.","anyOf":[{"type":"null"},{"format":"date-time","type":"string"}]},"expires_at":{"description":"End of the account's subscription to the fan. Null when it has no end date.","anyOf":[{"type":"null"},{"format":"date-time","type":"string"}]},"auto_renew_enabled":{"description":"Whether the subscription renews automatically.","anyOf":[{"type":"null"},{"type":"boolean"}]},"price_gross":{"description":"Price of the subscription, paid by the account, in USD. 0 or null means free.","anyOf":[{"type":"null"},{"type":"number"}]}},"required":["fan","subscribed","subscribed_at","expires_at","auto_renew_enabled","price_gross"]}}}},"400":{"description":"The platform refused the subscription or the request failed validation.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The platform refused the subscription or the request failed validation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure. Not part of the contract.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_PAYMENT_METHOD_REQUIRED"]}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"No fan with the given fan_id exists for this account on the platform.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"No fan with the given fan_id exists for this account on the platform.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"422":{"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's OnlyFans session is disconnected or deauthorized. Reconnect the account in OnlyMonster and retry.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message"]}}}}}}}}}
```

## Retrieve tracking links for a platform account

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`traffic\_metrics.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/platforms/{platform}/accounts/{platform_account_id}/tracking-links":{"get":{"summary":"Retrieve tracking links for a platform account","description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `traffic_metrics.view`","tags":["statistics"],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","enum":["onlyfans"]},"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"name":"platform_account_id","in":"path","required":true,"schema":{"type":"string"},"description":"Unique account identifier returned by the OnlyFans platform."},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"Start of the tracking link creation timestamp range (ISO 8601 Zulu)."},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"End of the tracking link creation timestamp range (ISO 8601 Zulu)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":10,"maximum":1000},"description":"Items per page (min:10 max:1000 default:100)"},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","description":"base64-signed string"},"description":"Pagination cursor returned from the previous request."}],"responses":{"200":{"description":"List of tracking links successfully retrieved for the specified platform account.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","description":"Array of tracking link records associated with the account.","items":{"type":"object","properties":{"id":{"type":"string","description":"Globally unique identifier of the tracking link."},"name":{"type":"string","description":"Name of the tracking link."},"subscribers":{"type":"number","description":"Number of subscribers acquired through this tracking link."},"url":{"type":"string","format":"uri","description":"Full URL of the tracking link."},"is_active":{"type":"boolean","description":"Indicates whether the tracking link is currently active."},"clicks":{"type":"number","description":"Total number of clicks registered for this tracking link."},"created_at":{"type":"string","format":"date-time","description":"ISO 8601 timestamp when the tracking link was created."}},"required":["id","name","subscribers","url","is_active","clicks","created_at"]}},"cursor":{"type":"string","description":"Base64-encoded cursor used for paginating subsequent results. Present only if additional pages exist."}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","const":"API_KEY_PERMISSION_DENIED","type":"string"},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve tracking link users for a platform account

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`traffic\_metrics.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/platforms/{platform}/accounts/{platform_account_id}/tracking-link-users":{"get":{"summary":"Retrieve tracking link users for a platform account","description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `traffic_metrics.view`","tags":["statistics"],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","enum":["onlyfans"]},"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"name":"platform_account_id","in":"path","required":true,"schema":{"type":"string"},"description":"Unique account identifier returned by the OnlyFans platform."},{"name":"collected_from","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Start of the collection timestamp range (ISO 8601 Zulu)."},{"name":"collected_to","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"End of the collection timestamp range (ISO 8601 Zulu)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":750},"description":"Items per page (min:1 max:750 default:100)"},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","description":"base64-signed string"},"description":"Pagination cursor returned from the previous request."},{"name":"link_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter results by a specific tracking link ID."}],"responses":{"200":{"description":"List of tracking link users successfully retrieved for the specified platform account.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","description":"Array of tracking link user records associated with the account.","items":{"type":"object","properties":{"link_id":{"type":"string","description":"Identifier of the tracking link this user is associated with."},"fan":{"type":"object","description":"Information about the fan who used the tracking link.","properties":{"id":{"type":"string","description":"Unique identifier of the fan on the platform."},"name":{"type":"string","description":"Display name of the fan."},"username":{"type":"string","description":"Username of the fan on the platform."}},"required":["id","name","username"]},"subscribed_at":{"type":"string","format":"date-time","description":"ISO 8601 timestamp when the fan subscribed via this tracking link."},"collected_at":{"type":"string","format":"date-time","description":"ISO 8601 timestamp when this record was collected."}},"required":["link_id","fan","subscribed_at","collected_at"]}},"cursor":{"type":"string","description":"Base64-encoded cursor used for paginating subsequent results. Present only if additional pages exist."}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","const":"API_KEY_PERMISSION_DENIED","type":"string"},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve trial links for a platform account

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`traffic\_metrics.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/platforms/{platform}/accounts/{platform_account_id}/trial-links":{"get":{"summary":"Retrieve trial links for a platform account","description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `traffic_metrics.view`","tags":["statistics"],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","enum":["onlyfans"]},"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"name":"platform_account_id","in":"path","required":true,"schema":{"type":"string"},"description":"Unique account identifier returned by the OnlyFans platform."},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"Start of the trial link creation timestamp range (ISO 8601 Zulu)."},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"End of the trial link creation timestamp range (ISO 8601 Zulu)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":10,"maximum":1000},"description":"Items per page (min:10 max:1000 default:100)"},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","description":"base64-signed string"},"description":"Pagination cursor returned from the previous request."}],"responses":{"200":{"description":"List of trial links successfully retrieved for the specified platform account.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","description":"Array of trial link records associated with the account.","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier of the trial link."},"name":{"type":"string","description":"Name of the trial link. May be empty if not set."},"claims":{"type":"number","description":"Number of times the trial link has been claimed."},"claims_limit":{"type":"number","description":"Maximum number of claims allowed for the trial link."},"url":{"type":"string","format":"uri","description":"Full URL of the trial link."},"duration_days":{"type":"number","description":"Duration in days of free access granted by the trial link."},"expires_at":{"type":"string","anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"ISO 8601 timestamp when the trial link expires, or null if still active."},"is_active":{"type":"boolean","description":"Indicates whether the trial link is currently active."},"clicks":{"type":"number","description":"Total number of clicks registered for this trial link."},"created_at":{"type":"string","format":"date-time","description":"ISO 8601 timestamp when the trial link was created."}},"required":["id","name","claims","claims_limit","url","duration_days","expires_at","is_active","clicks","created_at"]}},"cursor":{"type":"string","description":"Base64-encoded cursor used for paginating subsequent results. Present only if additional pages exist."}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","const":"API_KEY_PERMISSION_DENIED","type":"string"},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve trial link users for a platform account

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`traffic\_metrics.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/platforms/{platform}/accounts/{platform_account_id}/trial-link-users":{"get":{"summary":"Retrieve trial link users for a platform account","description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `traffic_metrics.view`","tags":["statistics"],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","enum":["onlyfans"]},"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"name":"platform_account_id","in":"path","required":true,"schema":{"type":"string"},"description":"Unique account identifier returned by the OnlyFans platform."},{"name":"collected_from","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"Start of the collected_at timestamp range filter (ISO 8601 Zulu)."},{"name":"collected_to","in":"query","required":false,"schema":{"type":"string","format":"date-time"},"description":"End of the collected_at timestamp range filter (ISO 8601 Zulu)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":750},"description":"Items per page (min:1 max:750 default:100)"},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","description":"base64-signed string"},"description":"Pagination cursor returned from the previous request."},{"name":"link_id","in":"query","required":false,"schema":{"type":"string"},"description":"Filter results to a specific trial link ID."}],"responses":{"200":{"description":"List of trial link users successfully retrieved for the specified platform account.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","description":"Array of trial link user records associated with the account.","items":{"type":"object","properties":{"link_id":{"type":"string","description":"Identifier of the trial link this user is associated with."},"fan":{"type":"object","description":"Information about the fan who used the trial link.","properties":{"id":{"type":"string","description":"Unique identifier of the fan on the platform."},"name":{"type":"string","description":"Fan display name."},"username":{"type":"string","description":"Fan username."}},"required":["id","name","username"]},"subscribed_at":{"type":"string","format":"date-time","description":"ISO 8601 UTC timestamp when the fan subscribed."},"collected_at":{"type":"string","format":"date-time","description":"ISO 8601 UTC timestamp when the record was collected."}},"required":["link_id","fan","subscribed_at","collected_at"]}},"cursor":{"type":"string","description":"Base64-encoded cursor for paginating subsequent results. Present only if additional pages exist."}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","const":"API_KEY_PERMISSION_DENIED","type":"string"},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve chargebacks for a platform account

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`dashboard.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/platforms/{platform}/accounts/{platform_account_id}/chargebacks":{"get":{"summary":"Retrieve chargebacks for a platform account","description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `dashboard.view`","tags":["statistics"],"parameters":[{"name":"platform","in":"path","required":true,"schema":{"type":"string","enum":["onlyfans"]},"description":"Name of the platform. Currently, only \"onlyfans\" is supported."},{"name":"platform_account_id","in":"path","required":true,"schema":{"type":"string"},"description":"Unique account identifier returned by the OnlyFans platform."},{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"Start of the chargeback creation timestamp range (ISO 8601 Zulu)."},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"End of the chargeback creation timestamp range (ISO 8601 Zulu)."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":10,"maximum":1000,"default":100},"description":"Items per page (min:10 max:1000 default:100)"},{"name":"cursor","in":"query","required":false,"schema":{"type":"string","description":"base64-signed string"},"description":"Pagination cursor returned from the previous request."}],"responses":{"200":{"description":"List of chargebacks successfully retrieved for the specified platform account.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","description":"Array of chargeback records associated with the account.","items":{"type":"object","properties":{"id":{"type":"string","description":"Globally unique identifier of the chargeback transaction."},"amount":{"type":"number","description":"Monetary amount of the chargeback."},"fan":{"type":"object","description":"Information about the fan associated with this chargeback.","properties":{"id":{"type":"string","description":"Unique identifier of the fan."}},"required":["id"]},"type":{"type":"string","description":"Type of the original transaction (e.g., tip, message payment)."},"status":{"type":"string","description":"Current state of the chargeback (e.g., undo)."},"chargeback_timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp indicating when the chargeback was created."},"transaction_timestamp":{"type":"string","format":"date-time","description":"ISO 8601 timestamp of the original transaction."}},"required":["id","amount","fan","type","status","chargeback_timestamp","transaction_timestamp"]}},"cursor":{"type":"string","description":"Base64-encoded cursor used for paginating subsequent results. Present only if additional pages exist."}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","const":"API_KEY_PERMISSION_DENIED","type":"string"},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve transactions for a platform account

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`dashboard.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/platforms/{platform}/accounts/{platform_account_id}/transactions":{"get":{"summary":"Retrieve transactions for a platform account","tags":["statistics"],"description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `dashboard.view`","parameters":[{"schema":{"format":"date-time","type":"string"},"in":"query","name":"start","required":true,"description":"Start of the transaction timestamp range (ISO 8601 Zulu)."},{"schema":{"format":"date-time","type":"string"},"in":"query","name":"end","required":true,"description":"End of the transaction timestamp range (ISO 8601 Zulu)."},{"schema":{"minimum":10,"maximum":1000,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 10, max: 1000, default: 100)."},{"schema":{"maxLength":512,"type":"string"},"in":"query","name":"cursor","required":false,"description":"Pagination cursor returned from the previous request."},{"schema":{"type":"string","enum":["onlyfans","fansly"]},"in":"path","name":"platform","required":true,"description":"Name of the platform. Supported values: \"onlyfans\", \"fansly\"."},{"schema":{"anyOf":[{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"},{"type":"string"}]},"in":"path","name":"platform_account_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"items":{"description":"Array of transactions of the account, newest first.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Unique identifier of the transaction.","type":"string"},"amount":{"description":"Gross amount of the transaction as the platform reports or derives it. Null when the gross amount is unknown.","anyOf":[{"type":"number"},{"type":"null"}]},"fan":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Unique identifier of the fan.","type":"string"}},"required":["id"]},"type":{"description":"Kind of the transaction, as the source platform reports it. A free string documented per platform, not an enum: values added by a platform later are returned unchanged. onlyfans: \"Subscription\", \"Recurring subscription\", \"Tip from\", \"Payment for message\", \"Post purchase\", \"Live stream\", \"Unknown\", \"unknown\". fansly: \"subscriptions\", \"tips\", \"media\", \"media_sets\", \"other_revenue\", \"stream_tickets\", \"text_ppv\", \"unknown\".","type":"string"},"status":{"description":"State of the transaction, as the source platform reports it. A free string documented per platform, not an enum: values added by a platform later are returned unchanged. onlyfans: \"done\", \"loading\", \"pending_return\". fansly: \"completed\", \"pending\", \"refund_pending\".","type":"string"},"timestamp":{"format":"date-time","description":"ISO 8601 timestamp of the transaction.","type":"string"}},"required":["id","amount","fan","type","status","timestamp"]}},"cursor":{"description":"Base64-encoded cursor for paginating subsequent results. Present only if additional pages exist.","type":"string"}},"required":["items"]}}}},"400":{"description":"The request is invalid: the cursor is malformed or does not belong to this platform, a query parameter is out of range, or the platform is not served by this route. OnlyFans requests also return the rejection stats-service raised for them.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request is invalid: the cursor is malformed or does not belong to this platform, a query parameter is out of range, or the platform is not served by this route. OnlyFans requests also return the rejection stats-service raised for them.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The statistics upstream failed, was unreachable, or rejected a request built by the API. Retry later.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The statistics upstream failed, was unreachable, or rejected a request built by the API. Retry later.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"504":{"description":"The statistics upstream did not answer within the timeout. Retry later or narrow the window.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The statistics upstream did not answer within the timeout. Retry later or narrow the window.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Retrieve user metrics for OnlyFans platform

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`team\_metrics.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"statistics","description":"Endpoints for retrieving account statistics."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/users/metrics":{"get":{"summary":"Retrieve user metrics for OnlyFans platform","description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `team_metrics.view`","tags":["statistics"],"parameters":[{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"Start of the metrics timestamp range (ISO 8601 Zulu)."},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date-time"},"description":"End of the metrics timestamp range (ISO 8601 Zulu)."},{"name":"creator_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer","minimum":1},"minItems":1,"maxItems":100},"description":"Array of creator IDs to filter metrics by."},{"name":"user_ids","in":"query","required":false,"schema":{"type":"array","items":{"type":"integer","minimum":1},"minItems":1,"maxItems":100},"description":"Array of user IDs to filter metrics by."},{"name":"account_group_id","in":"query","required":false,"schema":{"type":"integer"},"description":"Account group ID to filter metrics by."},{"name":"role_id","in":"query","required":false,"schema":{"type":"integer"},"description":"Role ID to filter metrics by."},{"name":"offset","in":"query","required":true,"schema":{"type":"integer","minimum":0,"default":0},"description":"Offset for pagination."},{"name":"limit","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":100,"default":100},"description":"Limit for pagination (max 100)."}],"responses":{"200":{"description":"User metrics successfully retrieved.","content":{"application/json":{"schema":{"type":"object","properties":{"items":{"type":"array","items":{"type":"object","properties":{"user_id":{"type":"integer","description":"User ID"},"creator_ids":{"type":"array","items":{"type":"integer"},"description":"Array of creator IDs"},"fans_count":{"type":"integer","description":"Total number of fans"},"messages_count":{"type":"integer","description":"Total number of messages sent"},"template_messages_count":{"type":"integer","description":"Number of template messages sent"},"ai_generated_messages_count":{"type":"integer","description":"Number of AI-generated messages"},"copied_messages_count":{"type":"integer","description":"Number of copied messages"},"media_messages_count":{"type":"integer","description":"Number of messages with media"},"paid_messages_count":{"type":"integer","description":"Number of paid messages sent"},"free_media_messages_count":{"type":"integer","description":"Number of sent messages with media attached and no price (free media); campaign sends excluded, media minus this is the number of paid messages with media"},"paid_messages_price_sum":{"type":"number","description":"Total sum of paid messages prices"},"words_count_sum":{"type":"integer","description":"Word count of manually typed messages. AI replies, copy-pasted messages, OnlyFans templates and internal templates are excluded"},"typed_messages_count":{"type":"integer","description":"Number of manually typed messages, same exclusions as words_count_sum; the denominator for the words average"},"unsent_messages_count":{"type":"integer","description":"Number of unsent messages"},"purchase_interval_avg":{"type":"number","description":"Average purchase interval in seconds"},"reply_time_avg":{"type":"number","description":"Average reply time in seconds"},"posts_count":{"type":"integer","description":"Total number of posts"},"deleted_posts_count":{"type":"integer","description":"Number of deleted posts"},"work_time":{"type":"number","description":"Total work time"},"break_time":{"type":"number","description":"Total break time"},"sold_messages_count":{"type":"integer","description":"Number of messages sold"},"sold_messages_price_sum":{"type":"number","description":"Total price of messages sold"},"total_sold_messages_count":{"type":"integer","description":"Total count of all sold messages"},"total_sold_messages_price_sum":{"type":"number","description":"Total price sum of all sold messages"},"purchase_interval_min":{"type":"integer","description":"Minimum purchase interval"},"purchase_interval_max":{"type":"integer","description":"Maximum purchase interval"},"sold_posts_count":{"type":"integer","description":"Number of posts sold"},"sold_posts_price_sum":{"type":"number","description":"Total price of posts sold"},"total_sold_posts_count":{"type":"integer","description":"Total count of all sold posts"},"tips_amount_sum":{"type":"number","description":"Total sum of tips received"},"total_tips_amount_sum":{"type":"number","description":"Total sum of all tips"},"chargedback_tips_amount_sum":{"type":"number","description":"Total sum of chargedback tips"},"chargedback_posts_price_sum":{"type":"number","description":"Total price sum of chargedback posts"},"chargedback_posts_count":{"type":"integer","description":"Number of chargedback posts"},"chargedback_messages_price_sum":{"type":"number","description":"Total price sum of chargedback messages"},"chargedback_messages_count":{"type":"integer","description":"Number of chargedback messages"},"total_chargedback_tips_amount_sum":{"type":"number","description":"Total sum of all chargedback tips"},"total_chargedback_posts_price_sum":{"type":"number","description":"Total price sum of all chargedback posts"},"total_chargedback_posts_count":{"type":"integer","description":"Total count of all chargedback posts"},"total_chargedback_messages_price_sum":{"type":"number","description":"Total price sum of all chargedback messages"},"total_chargedback_messages_count":{"type":"integer","description":"Total count of all chargedback messages"},"internal_templates_count":{"type":"number","description":"Number of internal templates used"}},"required":["user_id","creator_ids"]}}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","const":"API_KEY_PERMISSION_DENIED","type":"string"},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve organisation members

> \*\*Rate limit:\*\* 15 requests per second\
> \
> \*\*Required permission:\*\* \`team\_metrics.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"members","description":"Endpoints for managing organisation members."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/members":{"get":{"summary":"Retrieve organisation members","description":"**Rate limit:** 15 requests per second\n\n**Required permission:** `team_metrics.view`","tags":["members"],"parameters":[{"name":"limit","in":"query","required":true,"schema":{"type":"integer","minimum":1,"maximum":50},"description":"Number of members to return (min: 1, max: 50)."},{"name":"offset","in":"query","required":true,"schema":{"type":"integer","minimum":0},"description":"Number of members to skip for pagination."}],"responses":{"200":{"description":"List of organisation members successfully retrieved.","content":{"application/json":{"schema":{"type":"object","properties":{"users":{"type":"array","description":"Array of organisation members.","items":{"type":"object","properties":{"id":{"type":"number","minimum":1,"description":"Unique identifier of the user."},"avatar":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"URL of the user avatar image."},"name":{"type":"string","description":"Full name of the user."},"email":{"type":"string","description":"Email address of the user."},"createdAt":{"type":"string","description":"ISO 8601 timestamp of when the user was created."},"customName":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Custom display name assigned to the member within the organisation."}},"required":["id","avatar","name","email","createdAt","customName"]}}},"required":["users"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","const":"API_KEY_PERMISSION_DENIED","type":"string"},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve vault folders for a platform account. (For OnlyFans account only)

> \*\*Rate limit:\*\* 5 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/folders":{"get":{"summary":"Retrieve vault folders for a platform account. (For OnlyFans account only)","tags":["vault"],"description":"**Rate limit:** 5 requests per second\n\n**Required permission:** `media_uploader.manage`","parameters":[{"schema":{"minimum":1,"maximum":10,"default":10,"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"number"},"type":{"type":"string"},"name":{"type":"string"},"has_media":{"type":"boolean"},"can_update":{"type":"boolean"},"can_delete":{"type":"boolean"},"videos_count":{"type":"number"},"photos_count":{"type":"number"},"gifs_count":{"type":"number"},"audios_count":{"type":"number"}},"required":["id","type","name","has_media","can_update","can_delete","videos_count","photos_count","gifs_count","audios_count"]}}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve medias from a vault folder. (For OnlyFans account only)

> \*\*Rate limit:\*\* 5 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/folders/{folder_id}/medias":{"get":{"summary":"Retrieve medias from a vault folder. (For OnlyFans account only)","tags":["vault"],"description":"**Rate limit:** 5 requests per second\n\n**Required permission:** `media_uploader.manage`","parameters":[{"schema":{"minimum":1,"maximum":10,"default":10,"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false},{"schema":{"type":"string","enum":["audio","video","photo","gif","all"],"default":"all"},"in":"query","name":"type","required":false},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"},{"schema":{"minLength":1,"maxLength":100,"pattern":"^[0-9]+$","type":"string"},"in":"path","name":"folder_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"integer"},"type":{"type":"string"},"can_view":{"type":"boolean"},"is_ready":{"type":"boolean"},"has_error":{"anyOf":[{"type":"boolean"},{"type":"null"}]},"converted_to_video":{"type":"boolean"},"created_at":{"anyOf":[{"type":"string"},{"type":"null"}]},"thumbnail_url":{"type":"string"}},"required":["id","type","can_view","is_ready","has_error","converted_to_video","created_at","thumbnail_url"]}}},"required":["items"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Stream a media thumbnail from the vault. (For OnlyFans account only)

> \*\*Rate limit:\*\* 3 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/media/{media_id}/thumbnail":{"get":{"summary":"Stream a media thumbnail from the vault. (For OnlyFans account only)","tags":["vault"],"description":"**Rate limit:** 3 requests per second\n\n**Required permission:** `media_uploader.manage`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"},{"schema":{"minimum":1,"type":"integer"},"in":"path","name":"media_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## List media uploads for a vault account.

> \*\*Rate limit:\*\* 3 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/medias/uploads":{"get":{"summary":"List media uploads for a vault account.","tags":["vault"],"description":"**Rate limit:** 3 requests per second\n\n**Required permission:** `media_uploader.manage`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":10,"type":"integer"},"in":"query","name":"limit","required":false},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false},{"schema":{"type":"boolean"},"in":"query","name":"expired","required":false},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["uploaded","processing","processed","exporting","exported","failed","unprocessable"]},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"additionalProperties":false,"type":"object","properties":{"name":{"type":"string"},"size":{"type":"integer"},"content_type":{"type":"string"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}]},"key":{"type":"string"},"e_tag":{"type":"string"},"get_url":{"type":"string"},"export_type":{"type":"string"},"export_fan_id":{"type":"string"},"rf_guest":{"type":"array","items":{"type":"string"}},"rf_partner":{"type":"array","items":{"type":"string"}},"rf_tag":{"type":"array","items":{"type":"string"}}},"required":["name","size","content_type","duration","key","e_tag","get_url","export_type"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","status","media_id","metadata","created_at","updated_at"]}},"total":{"minimum":0,"type":"integer"}},"required":["items","total"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Create a Priority Mass Messages broadcast

> \*\*Rate limit:\*\* 1 request per second\
> \
> \*\*A created broadcast is a real broadcast to its whole audience, not a draft.\*\* Without a schedule it is queued and goes out without further action; with one it waits for the hour it names. Use the status endpoint to pause it.\
> \
> \*\*This endpoint is not idempotent, and a repeated create is a second broadcast to every fan it matches.\*\* A request that times out, or that answers \`500\` or \`502\`, may still have created one: whether it exists is unknown, so list the account broadcasts before retrying and pause a duplicate at once. Listing the broadcasts needs \`priority\_mass\_messages.view\` in addition to \`priority\_mass\_messages.edit\`.\
> \
> A schedule and an end are each a wall-clock date and whole hour plus the clock it is read on. An offset carried by the value is ignored. A schedule in the past goes out at once, an end before the schedule is accepted, and a broadcast whose end passes completes as sent whatever state it was in.\
> \
> A broadcast reads its schedule back as the UTC instant plus the zone name, not as the wall clock it was stated on, and reads it back as \`null\` once it has been dispatched.\
> \
> \`audience\_filters\[].options.lists\[].name\` is required on every fan list and never published back: the reads carry identifiers alone.\
> \
> Revoking or narrowing the key that created a broadcast does not stop it. Pause it through the status endpoint instead.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns":{"post":{"summary":"Create a Priority Mass Messages broadcast","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 1 request per second\n\n**A created broadcast is a real broadcast to its whole audience, not a draft.** Without a schedule it is queued and goes out without further action; with one it waits for the hour it names. Use the status endpoint to pause it.\n\n**This endpoint is not idempotent, and a repeated create is a second broadcast to every fan it matches.** A request that times out, or that answers `500` or `502`, may still have created one: whether it exists is unknown, so list the account broadcasts before retrying and pause a duplicate at once. Listing the broadcasts needs `priority_mass_messages.view` in addition to `priority_mass_messages.edit`.\n\nA schedule and an end are each a wall-clock date and whole hour plus the clock it is read on. An offset carried by the value is ignored. A schedule in the past goes out at once, an end before the schedule is accepted, and a broadcast whose end passes completes as sent whatever state it was in.\n\nA broadcast reads its schedule back as the UTC instant plus the zone name, not as the wall clock it was stated on, and reads it back as `null` once it has been dispatched.\n\n`audience_filters[].options.lists[].name` is required on every fan list and never published back: the reads carry identifiers alone.\n\nRevoking or narrowing the key that created a broadcast does not stop it. Pause it through the status endpoint instead.\n\n**Required permission:** `priority_mass_messages.edit`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"not":{}},"type":"object","properties":{"name":{"description":"Broadcast name. Required when the broadcast sends more than one message, and when its only message carries media but no text. A single text message sent without a name reads back with that text as its name.","anyOf":[{"type":"null"},{"minLength":1,"maxLength":100,"pattern":"\\S","type":"string"}]},"scheduled_at":{"format":"date-time","description":"Wall-clock date and whole hour at which the broadcast goes out, read on the clock `scheduled_at_timezone_mode` names. An offset carried by the value is ignored, so the hour written is the hour used — the value is not moved to the instant an offset would name. Required together with `scheduled_at_timezone_mode`. A schedule in the past is accepted and goes out at once. Omit both to send as soon as the broadcast is queued.","type":"string"},"scheduled_at_timezone_mode":{"type":"string","enum":["utc","organisation"]},"rules":{"additionalProperties":false,"description":"When the broadcast stops, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"type":"string","enum":["off","online_now","online_only"],"description":"Whether the broadcast waits for the fan to be online before sending. Omit for `off`."},"unsend_delay_sec":{"type":"integer","enum":[3600,7200,18000,28800,54000,72000],"description":"Delay after which a sent message is recalled: 1, 2, 5, 8, 15 or 20 hours, the choices the panel offers. Omit to never recall."},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. Stated only together with `unsend_delay_sec`. Omit for false, which recalls every message.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat. Omit for false.","type":"boolean"},"end_at":{"format":"date-time","description":"Wall-clock date and whole hour at which the broadcast stops, read on the clock `end_at_timezone_mode` names. An offset carried by the value is ignored, so the hour written is the hour used. Required together with `end_at_timezone_mode`. An end before the schedule is accepted; when the end passes the broadcast completes as sent whatever state it is in, so a paused broadcast past its end can no longer be resumed and an early end can complete a broadcast that sent nothing.","type":"string"},"end_at_timezone_mode":{"type":"string","enum":["utc","organisation"]}}},"audience_filters":{"maxItems":20,"description":"Who the broadcast sends to. At least one include filter is required. A fan-list include is not combined with an include of another kind, and one list does not appear twice under one kind.","type":"array","items":{"anyOf":[{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","purchased_from_account"]},"mode":{"type":"string","enum":["include"]},"options":{"additionalProperties":false,"minProperties":1,"description":"A window stated either as a date range (`from_at`/`to_at`) or as a range of days ago (`from_days`/`to_days`), never as both at once.","type":"object","properties":{"from_at":{"format":"date-time","type":"string"},"to_at":{"format":"date-time","type":"string"},"from_days":{"minimum":0,"maximum":1000000,"type":"integer"},"to_days":{"minimum":1,"maximum":1000000,"type":"integer"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["spent_within_organisation","spent_within_account"]},"mode":{"type":"string","enum":["include"]},"options":{"additionalProperties":false,"minProperties":1,"type":"object","properties":{"from_amount_gross":{"minimum":0,"type":"number"},"to_amount_gross":{"minimum":0,"type":"number"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"lists":{"minItems":1,"maxItems":100,"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the fan list.","type":"string"},"name":{"minLength":1,"maxLength":255,"description":"Name of the fan list. Stored and shown in the panel; never published back here.","type":"string"}},"required":["id","name"]}}},"required":["lists"]}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["active_chatted"]},"mode":{"type":"string","enum":["exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"within_last_min":{"minimum":0,"maximum":525600,"type":"integer"}},"required":["within_last_min"]}},"required":["kind","mode","options"]}]}},"messages":{"minItems":1,"maxItems":5,"description":"Messages to send, in order: the broadcast and up to four follow-ups.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"text":{"description":"Text the fan receives, rendered per fan. Null for a message that carries only media. A message carries text, at least one attachment, or both. A fan's name is a placeholder written exactly as the panel writes it: `{{ name | default: \"babe\" }}`, where `name` is the name on the fan's profile, `displayName` the name the organisation assigned the fan, and the quoted `default:` value what the fan is called when the name is missing.","anyOf":[{"type":"null"},{"maxLength":5000,"type":"string"}]},"price_gross":{"description":"Price the fan pays for this message, before any platform deduction. 0 makes it free; any other amount is between 3 and 200. A price requires something behind the paywall — `text_is_paid` or an attachment with `is_paid` — and either of those requires a price.","anyOf":[{"type":"number","enum":[0]},{"minimum":3,"maximum":200,"type":"number"}]},"delay_sec":{"minimum":0,"maximum":2592000,"description":"Delay after the previous message before this one is sent. Accepted on follow-ups only — a delay on the first message is refused, because the broadcast itself decides when it goes out.","type":"integer"},"attachments":{"maxItems":100,"description":"Media to attach. Empty for a message that carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True to put the attachment behind the paywall, hiding it from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True to put the text itself behind the paywall, so the fan buys the message to read it. Requires text that is not empty or whitespace.","type":"boolean"},"tagged_platform_account_ids":{"maxItems":10,"description":"Platform accounts to tag in this message, by their identifier on the platform.","type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}}},"required":["text","price_gross","attachments","text_is_paid","tagged_platform_account_ids"]}}},"required":["rules","audience_filters","messages"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose broadcasts are read."}],"responses":{"201":{"description":"One Priority Mass Messages broadcast of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Priority Mass Messages broadcast of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}}}},"400":{"description":"The request states something this endpoint cannot accept: a value outside its bounds, an audience no broadcast can be built from, a message whose price and paywall disagree, half a schedule pair, a time that is not a whole hour, or a fan list that does not exist. A refusal this endpoint decides itself carries no code.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request states something this endpoint cannot accept: a value outside its bounds, an audience no broadcast can be built from, a message whose price and paywall disagree, half a schedule pair, a time that is not a whole hour, or a fan list that does not exist. A refusal this endpoint decides itself carries no code.","type":"object","properties":{"message":{"description":"What to change about the request.","type":"string"},"code":{"type":"string","enum":["DYNAMIC_LIST_NOT_FOUND","RESTRICTED_WORDS_DETECTED","CAMPAIGN_NAME_REQUIRED_FOR_MEDIA_ONLY","INVALID_CAMPAIGN_DATA","CAMPAIGN_NOT_CREATED","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."},"details":{"additionalProperties":false,"description":"Present on `RESTRICTED_WORDS_DETECTED`: the words and the topics the content check matched. Either list may be empty when the check names one and not the other.","type":"object","properties":{"words":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"string"}}},"required":["words","topics"]}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. The broadcast may still have been created: list the account broadcasts before retrying.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. The broadcast may still have been created: list the account broadcasts before retrying.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The broadcast could not be created or confirmed. Whether it exists is unknown — list the account broadcasts before retrying, and pause a duplicate at once.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast could not be created or confirmed. Whether it exists is unknown — list the account broadcasts before retrying, and pause a duplicate at once.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Retrieve one Priority Mass Messages broadcast

> \*\*Rate limit:\*\* 5 requests per second\
> \
> A schedule reads back as \`null\` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\
> \
> Sent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its \`reply\_rate\` then reads \`null\` rather than a figure above 1.\
> \
> A broadcast whose content could not be read is refused with \`502\` here, because that content is exactly what was asked for.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns/{campaign_id}":{"get":{"summary":"Retrieve one Priority Mass Messages broadcast","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nA schedule reads back as `null` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\n\nSent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its `reply_rate` then reads `null` rather than a figure above 1.\n\nA broadcast whose content could not be read is refused with `502` here, because that content is exactly what was asked for.\n\n**Required permission:** `priority_mass_messages.view`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the broadcast belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Broadcast identifier."}],"responses":{"200":{"description":"One Priority Mass Messages broadcast of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Priority Mass Messages broadcast of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The broadcast does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"This broadcast exists and is unchanged; only its content could not be read, and here it is exactly what was asked for. Repeating the request is safe. A temporary failure to read the content passes on a later repeat; content missing for good answers the same on every repeat.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"This broadcast exists and is unchanged; only its content could not be read, and here it is exactly what was asked for. Repeating the request is safe. A temporary failure to read the content passes on a later repeat; content missing for good answers the same on every repeat.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message","code"]}}}}}}}}}
```

## Recall what a Priority Mass Messages broadcast sent

> \*\*Rate limit:\*\* 5 requests per second\
> \
> The broadcast stops sending and the messages it delivered are taken back out of the fans' chats, as far as the platform's 24-hour recall window allows. A recall is possible within 24 hours of the broadcast's last status change.\
> \
> \*\*This cannot be undone and it is not limited to broadcasts this API created.\*\* Any broadcast of the account can be recalled, including one a person built in the panel.\
> \
> A \`502\` does not promise the broadcast is untouched, but no repeat recalls twice, so repeating the request is safe; read the broadcast if the answer stays \`502\`. This differs from the Auto Messages recall, whose \`502\` asks the caller to read the campaign before repeating at all. Reading the broadcast needs \`priority\_mass\_messages.view\` in addition to \`priority\_mass\_messages.edit\`.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns/{campaign_id}/unsend":{"post":{"summary":"Recall what a Priority Mass Messages broadcast sent","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nThe broadcast stops sending and the messages it delivered are taken back out of the fans' chats, as far as the platform's 24-hour recall window allows. A recall is possible within 24 hours of the broadcast's last status change.\n\n**This cannot be undone and it is not limited to broadcasts this API created.** Any broadcast of the account can be recalled, including one a person built in the panel.\n\nA `502` does not promise the broadcast is untouched, but no repeat recalls twice, so repeating the request is safe; read the broadcast if the answer stays `502`. This differs from the Auto Messages recall, whose `502` asks the caller to read the campaign before repeating at all. Reading the broadcast needs `priority_mass_messages.view` in addition to `priority_mass_messages.edit`.\n\n**Required permission:** `priority_mass_messages.edit`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the broadcast belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Broadcast identifier."}],"responses":{"204":{"description":"The recall was applied: the broadcast stops sending and takes back what it can."},"400":{"description":"The broadcast is not in a state a recall can start from: the wrong state, a paused broadcast that never started sending, or one whose last status change is more than 24 hours old. One code covers every cause; read the broadcast to tell which.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast is not in a state a recall can start from: the wrong state, a paused broadcast that never started sending, or one whose last status change is more than 24 hours old. One code covers every cause; read the broadcast to tell which.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_NOT_RECALLABLE"]}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The broadcast does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The recall did not complete. No broadcast is recalled twice by a repeat, so repeating the request is safe; read the broadcast if the answer stays 502. This differs from the Auto Messages recall, whose 502 asks the caller to read the campaign before repeating at all.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The recall did not complete. No broadcast is recalled twice by a repeat, so repeating the request is safe; read the broadcast if the answer stays 502. This differs from the Auto Messages recall, whose 502 asks the caller to read the campaign before repeating at all.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_RECALL_NOT_APPLIED"]}},"required":["message","code"]}}}}}}}}}
```

## Retrieve the Priority Mass Messages broadcasts of an account

> \*\*Rate limit:\*\* 5 requests per second\
> \
> A schedule reads back as \`null\` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\
> \
> Sent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its \`reply\_rate\` then reads \`null\` rather than a figure above 1.\
> \
> A broadcast whose content could not be read is listed with \`messages: \[]\` and every figure at zero, rather than failing the page.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns":{"get":{"summary":"Retrieve the Priority Mass Messages broadcasts of an account","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nA schedule reads back as `null` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\n\nSent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its `reply_rate` then reads `null` rather than a figure above 1.\n\nA broadcast whose content could not be read is listed with `messages: []` and every figure at zero, rather than failing the page.\n\n**Required permission:** `priority_mass_messages.view`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":50,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 1, max: 100, default: 50)."},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false,"description":"Items to skip (default: 0)."},{"schema":{"default":false,"type":"boolean"},"in":"query","name":"include_archived","required":false,"description":"Include archived broadcasts in the page (default: false). Only `archived` is affected — every other state is always listed."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose broadcasts are read."}],"responses":{"200":{"description":"A page of the account Priority Mass Messages broadcasts, newest first.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A page of the account Priority Mass Messages broadcasts, newest first.","type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}},"has_more":{"description":"True when more broadcasts exist beyond this page.","type":"boolean"}},"required":["items","has_more"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The content of this page could not be read at all. The broadcasts exist and are unchanged, and repeating the request is safe. A single broadcast whose content is gone does not cause this — it is listed with `messages: []` and its figures at zero instead.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The content of this page could not be read at all. The broadcasts exist and are unchanged, and repeating the request is safe. A single broadcast whose content is gone does not cause this — it is listed with `messages: []` and its figures at zero instead.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message","code"]}}}}}}}}}
```

## Start a new vault media upload.

> \*\*Rate limit:\*\* 3 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/medias/uploads/start":{"post":{"summary":"Start a new vault media upload.","tags":["vault"],"description":"**Rate limit:** 3 requests per second\n\n**Required permission:** `media_uploader.manage`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"name":{"minLength":1,"maxLength":255,"pattern":"^[\\w. \\-()]{1,255}$","type":"string"},"size":{"minimum":1,"maximum":5368709120,"type":"integer"},"content_type":{"minLength":1,"maxLength":255,"pattern":"^(image|video|audio)/[a-zA-Z0-9.+-]+$","type":"string"},"duration":{"minimum":0,"type":"number"}},"required":["name","size","content_type"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"anyOf":[{"additionalProperties":false,"type":"object","properties":{"get_url":{"type":"string"},"put_url":{"type":"string"},"key":{"type":"string"}},"required":["get_url","put_url","key"]},{"additionalProperties":false,"type":"object","properties":{"get_url":{"type":"string"},"upload_id":{"type":"string"},"parts":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"integer"},"put_url":{"type":"string"}},"required":["id","put_url"]}},"key":{"type":"string"}},"required":["get_url","upload_id","parts","key"]}]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Finish a multipart vault media upload.

> \*\*Rate limit:\*\* 3 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/medias/uploads/finish":{"post":{"summary":"Finish a multipart vault media upload.","tags":["vault"],"description":"**Rate limit:** 3 requests per second\n\n**Required permission:** `media_uploader.manage`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"key":{"minLength":1,"maxLength":1024,"type":"string"},"upload_id":{"minLength":1,"maxLength":256,"type":"string"},"parts":{"minItems":1,"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"part":{"minimum":1,"type":"integer"},"e_tag":{"minLength":1,"maxLength":256,"type":"string"}},"required":["part","e_tag"]}}},"required":["key","upload_id","parts"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"e_tag":{"type":"string"}},"required":["e_tag"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Export an uploaded media to the vault.

> \*\*Rate limit:\*\* 3 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/medias/uploads/export":{"post":{"summary":"Export an uploaded media to the vault.","tags":["vault"],"description":"**Rate limit:** 3 requests per second\n\n**Required permission:** `media_uploader.manage`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"name":{"minLength":1,"maxLength":255,"pattern":"^[\\w. \\-()]{1,255}$","type":"string"},"size":{"minimum":1,"maximum":5368709120,"type":"integer"},"content_type":{"minLength":1,"maxLength":255,"pattern":"^(image|video|audio)/[a-zA-Z0-9.+-]+$","type":"string"},"duration":{"minimum":0,"type":"number"},"key":{"minLength":1,"maxLength":1024,"type":"string"},"e_tag":{"minLength":1,"maxLength":256,"type":"string"},"get_url":{"minLength":1,"maxLength":2048,"format":"uri","type":"string"},"export_type":{"type":"string","enum":["post","message"]},"export_fan_id":{"minLength":1,"type":"string"},"rf_guest":{"type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}},"rf_partner":{"type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}},"rf_tag":{"type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}}},"required":["name","size","content_type","key","e_tag","get_url","export_type"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["uploaded","processing","processed","exporting","exported","failed","unprocessable"]},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"additionalProperties":false,"type":"object","properties":{"name":{"type":"string"},"size":{"type":"integer"},"content_type":{"type":"string"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}]},"key":{"type":"string"},"e_tag":{"type":"string"},"get_url":{"type":"string"},"export_type":{"type":"string"},"export_fan_id":{"type":"string"},"rf_guest":{"type":"array","items":{"type":"string"}},"rf_partner":{"type":"array","items":{"type":"string"}},"rf_tag":{"type":"array","items":{"type":"string"}}},"required":["name","size","content_type","duration","key","e_tag","get_url","export_type"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","status","media_id","metadata","created_at","updated_at"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retry a failed vault media upload.

> \*\*Rate limit:\*\* 3 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/medias/uploads/{upload_id}/retry":{"post":{"summary":"Retry a failed vault media upload.","tags":["vault"],"description":"**Rate limit:** 3 requests per second\n\n**Required permission:** `media_uploader.manage`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"},{"schema":{"format":"uuid","type":"string"},"in":"path","name":"upload_id","required":true}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"id":{"type":"string"},"status":{"type":"string","enum":["uploaded","processing","processed","exporting","exported","failed","unprocessable"]},"media_id":{"anyOf":[{"type":"string"},{"type":"null"}]},"metadata":{"additionalProperties":false,"type":"object","properties":{"name":{"type":"string"},"size":{"type":"integer"},"content_type":{"type":"string"},"duration":{"anyOf":[{"type":"number"},{"type":"null"}]},"key":{"type":"string"},"e_tag":{"type":"string"},"get_url":{"type":"string"},"export_type":{"type":"string"},"export_fan_id":{"type":"string"},"rf_guest":{"type":"array","items":{"type":"string"}},"rf_partner":{"type":"array","items":{"type":"string"}},"rf_tag":{"type":"array","items":{"type":"string"}}},"required":["name","size","content_type","duration","key","e_tag","get_url","export_type"]},"created_at":{"type":"string"},"updated_at":{"type":"string"}},"required":["id","status","media_id","metadata","created_at","updated_at"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Verify a fan link before exporting vault media. (For OnlyFans account only)

> \*\*Rate limit:\*\* 3 requests per second\
> \
> \*\*Required permission:\*\* \`media\_uploader.manage\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"vault","description":"Endpoints for accessing vault folders and media."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/vault/medias/uploads/fans/verify":{"post":{"summary":"Verify a fan link before exporting vault media. (For OnlyFans account only)","tags":["vault"],"description":"**Rate limit:** 3 requests per second\n\n**Required permission:** `media_uploader.manage`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"fan_link":{"minLength":1,"maxLength":2048,"pattern":"^https?://(www\\.)?onlyfans\\.com/","type":"string"}},"required":["fan_link"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"Big integer id as string"}],"responses":{"200":{"description":"Default Response","content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"fan_id":{"minLength":1,"type":"string"}},"required":["fan_id"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}}}}}}}
```

## Retrieve the Auto Messages campaigns of an account

> \*\*Rate limit:\*\* 5 requests per second\
> \
> \*\*Required permission:\*\* \`auto\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"auto-message-campaigns","description":"Endpoints for reading the Auto Messages campaigns of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/auto-message-campaigns":{"get":{"summary":"Retrieve the Auto Messages campaigns of an account","tags":["auto-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\n**Required permission:** `auto_messages.view`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":50,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 1, max: 100, default: 50)."},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false,"description":"Items to skip (default: 0)."},{"schema":{"default":false,"type":"boolean"},"in":"query","name":"include_archived","required":false,"description":"Include archived campaigns in the page (default: false). Only `archived` is affected — paused, unsending and unsent campaigns are always returned."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose campaigns are read."}],"responses":{"200":{"description":"A page of the account Auto Messages campaigns.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A page of the account Auto Messages campaigns.","type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Campaign identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the campaign belongs to.","type":"string"},"name":{"description":"Campaign name as the account owner set it. Null when the campaign has none.","anyOf":[{"type":"string"},{"type":"null"}]},"trigger":{"type":"string","enum":["welcome_message","online_message","has_expired_message","will_expire_in_message"]},"action":{"description":"What the campaign does when the trigger fires.\n`send_message` — sends the messages listed in `messages`.\n`start_mimic` — opens a Mimic chat instead of sending; such a campaign has no messages.\nNull when this version of the API does not name the action. Such a campaign reports no\nmessages either, since what its content means depends on what it does with it.","anyOf":[{"type":"string","enum":["send_message","start_mimic"]},{"type":"null"}]},"status":{"type":"string","enum":["active","paused","archived","unsending","unsent"]},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the campaign was created (ISO 8601 Zulu).","type":"string"},"rules":{"additionalProperties":false,"description":"When the campaign fires, and on what terms it recalls what it sent.","type":"object","properties":{"send_delay_interval":{"description":"How long the campaign waits between the trigger firing and the send. Null for the expiry triggers, which fire at a fixed offset instead.","anyOf":[{"additionalProperties":false,"type":"object","properties":{"min_sec":{"description":"Shortest the campaign waits after the trigger fires.","type":"integer"},"range_sec":{"description":"Span the delay is drawn from, on top of `min_sec`: a send happens between `min_sec` and `min_sec + range_sec` seconds after the trigger. 0 makes the delay fixed.","type":"integer"}},"required":["min_sec","range_sec"]},{"type":"null"}]},"send_after_expire_min":{"description":"Minutes after a subscription expired at which the campaign fires. Non-null only for trigger `has_expired_message`.","anyOf":[{"type":"integer"},{"type":"null"}]},"send_before_expire_min":{"description":"Minutes before a subscription expires at which the campaign fires. Non-null only for trigger `will_expire_in_message`.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the campaign never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan replied to. A fan who opened the message without replying keeps it too, the same as with `unsend_if_not_read_enabled`.","type":"boolean"},"retry_after_unsend_min":{"description":"Minutes after a recall before the same fan may be targeted again. Null when a fan is targeted at most once, which is the default.","anyOf":[{"type":"integer"},{"type":"null"}]},"end_at":{"description":"When the campaign stops firing (ISO 8601 Zulu). Null when it runs until stopped by hand.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"}},"required":["send_delay_interval","send_after_expire_min","send_before_expire_min","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","retry_after_unsend_min","end_at","mimic_on_reply_enabled"]},"audience_filters":{"description":"Filters evaluated per fan when the trigger fires. Empty when the campaign targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","buying_power_between","active_chatted","belongs_platform_lists","belongs_dynamic_lists","send_within_time_range"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the campaign sends, in send order. Empty for a campaign that starts a Mimic chat.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_sends_count":{"description":"Dispatches the campaign has made since it was created. Cumulative: a fan targeted twice counts twice, and the figure never decreases.","type":"integer"},"first_message_stats":{"additionalProperties":false,"description":"Figures for the first message of the campaign only. Follow-up steps are reported separately.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards. Messages still with the fan are `sent_messages_count` minus this.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid for these messages, before any platform deduction. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]},"follow_up_message_stats":{"description":"Figures for each follow-up step. The campaign's total is `first_message_stats` plus these.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Follow-up step these figures belong to, matching `messages[].step`. Starts at 1; the first message is reported in `first_message_stats`.","type":"integer"},"sent_messages_count":{"description":"Messages recorded as sent. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards. Messages still with the fan are `sent_messages_count` minus this.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid for these messages, before any platform deduction. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["step","sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}}},"required":["id","account_id","name","trigger","action","status","created_by","created_at","rules","audience_filters","messages","targeted_sends_count","first_message_stats","follow_up_message_stats"]}},"has_more":{"description":"True when more campaigns exist beyond this page.","type":"boolean"}},"required":["items","has_more"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"502":{"description":"The campaigns exist and are unchanged; only their content could not be read. Repeating the request is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The campaigns exist and are unchanged; only their content could not be read. Repeating the request is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message"]}}}}}}}}}
```

## Create an Auto Messages campaign

> \*\*Rate limit:\*\* 5 requests per second\
> \
> The campaign starts running as soon as it is created: it begins matching fans the moment this request is answered. There is no way to stage one — use the status endpoint to pause it.\
> \
> An empty \`audience\_filters\` targets every fan that fires the trigger. Campaigns here are trigger-driven and send one message per fan event, so this is the ordinary shape of a welcome campaign rather than a broadcast.\
> \
> \`audience\_filters\[].options.lists\[].name\` is accepted and never published back: a name is required for each fan list, while the read endpoints carry identifiers alone.\
> \
> \*\*This endpoint is not idempotent.\*\* A request that times out may still have created a running campaign. Before retrying, list the account campaigns and look for one already there; a duplicate can be stopped with the status endpoint. Listing the campaigns needs \`auto\_messages.view\` in addition to \`auto\_messages.edit\`.\
> \
> \*\*Required permission:\*\* \`auto\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"auto-message-campaigns","description":"Endpoints for reading the Auto Messages campaigns of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/auto-message-campaigns":{"post":{"summary":"Create an Auto Messages campaign","tags":["auto-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nThe campaign starts running as soon as it is created: it begins matching fans the moment this request is answered. There is no way to stage one — use the status endpoint to pause it.\n\nAn empty `audience_filters` targets every fan that fires the trigger. Campaigns here are trigger-driven and send one message per fan event, so this is the ordinary shape of a welcome campaign rather than a broadcast.\n\n`audience_filters[].options.lists[].name` is accepted and never published back: a name is required for each fan list, while the read endpoints carry identifiers alone.\n\n**This endpoint is not idempotent.** A request that times out may still have created a running campaign. Before retrying, list the account campaigns and look for one already there; a duplicate can be stopped with the status endpoint. Listing the campaigns needs `auto_messages.view` in addition to `auto_messages.edit`.\n\n**Required permission:** `auto_messages.edit`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"trigger":{"type":"string","enum":["welcome_message","online_message","has_expired_message","will_expire_in_message"]},"action":{"type":"string","enum":["send_message","start_mimic"]},"name":{"description":"Campaign name. Required for a sequence and for a message that carries media but no text.","anyOf":[{"type":"null"},{"minLength":1,"maxLength":512,"pattern":"\\S","type":"string"}]},"rules":{"additionalProperties":false,"type":"object","properties":{"send_delay_interval":{"additionalProperties":false,"type":"object","properties":{"min_sec":{"enum":[60,180,300,900,1800],"description":"How long to wait before sending. One of the published delays; each one fixes its own `range_sec`.","type":"integer"},"range_sec":{"enum":[120,600,900,1800],"description":"The spread added to the delay. It is decided by `min_sec` rather than chosen freely — 60 and 180 take 120, 300 takes 600, 900 takes 900, 1800 takes 1800.","type":"integer"}},"required":["min_sec","range_sec"]},"send_after_expire_min":{"enum":[1440,2880,7200,10080,14400,20160],"description":"How long after a subscription expires the campaign fires.","type":"integer"},"send_before_expire_min":{"enum":[1440,2880,7200,10080,14400,20160],"description":"How long before a subscription expires the campaign fires.","type":"integer"},"unsend_delay_sec":{"minimum":0,"maximum":86400,"type":"integer"},"unsend_if_not_read_enabled":{"type":"boolean"},"unsend_if_not_replied_enabled":{"type":"boolean"},"retry_after_unsend_min":{"enum":[1440,4320,10080,14400,21600,28800,43200],"description":"How long before the campaign may reach the same fan again.","type":"integer"},"end_at":{"description":"When the campaign stops firing, as an ISO 8601 instant. An instant needs no timezone of its own.","anyOf":[{"type":"null"},{"format":"date-time","type":"string"}]},"mimic_on_reply_enabled":{"type":"boolean"}}},"audience_filters":{"maxItems":20,"description":"Filters evaluated per fan when the trigger fires. An empty list targets every fan that fires the trigger.","type":"array","items":{"anyOf":[{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["purchased_from_organisation","purchased_from_account"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"additionalProperties":false,"minProperties":1,"type":"object","properties":{"from_at":{"format":"date-time","type":"string"},"to_at":{"format":"date-time","type":"string"},"from_days":{"minimum":0,"maximum":1000000,"type":"integer"},"to_days":{"minimum":1,"maximum":1000000,"type":"integer"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["spent_within_organisation","spent_within_account","buying_power_between"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"additionalProperties":false,"minProperties":1,"type":"object","properties":{"from_amount_gross":{"minimum":0,"type":"number"},"to_amount_gross":{"minimum":0,"type":"number"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"lists":{"minItems":1,"maxItems":100,"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the fan list.","type":"string"},"name":{"minLength":1,"maxLength":255,"description":"Name of the fan list. Stored and shown in the panel; never published back here.","type":"string"}},"required":["id","name"]}}},"required":["lists"]}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["active_chatted"]},"mode":{"type":"string","enum":["exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"within_last_min":{"minimum":0,"maximum":525600,"type":"integer"}},"required":["within_last_min"]}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["send_within_time_range"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]}},"required":["kind","mode","options"]}]}},"messages":{"minItems":1,"maxItems":5,"description":"Messages to send, in order. Required for `send_message` and refused for `start_mimic`.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"text":{"description":"Text the fan receives, rendered per fan. Null for a message that carries only media. A message carries text, at least one attachment, or both.","anyOf":[{"type":"null"},{"maxLength":5000,"type":"string"}]},"price_gross":{"description":"Price the fan pays for this message, before any platform deduction. 0 makes it free; any other amount is between 3 and 200. A price requires something behind the paywall — `text_is_paid` or an attachment with `is_paid` — and either of those requires a price.","anyOf":[{"type":"number","enum":[0]},{"minimum":3,"maximum":200,"type":"number"}]},"delay_sec":{"minimum":0,"maximum":2592000,"description":"Delay after the previous message before this one is sent. Accepted on follow-ups only — the first message is timed by the campaign rules.","type":"integer"},"attachments":{"maxItems":100,"description":"Media to attach. Empty for a message that carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True to put the attachment behind the paywall, hiding it from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True to put the text itself behind the paywall, so the fan buys the message to read it. Requires text that is not empty or whitespace.","type":"boolean"},"tagged_platform_account_ids":{"maxItems":10,"description":"Platform accounts to tag in this message, by their identifier on the platform.","type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}}},"required":["text","price_gross","attachments","text_is_paid","tagged_platform_account_ids"]}}},"required":["trigger","action","rules","audience_filters"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose campaigns are read."}],"responses":{"201":{"description":"One Auto Messages campaign of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Auto Messages campaign of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Campaign identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the campaign belongs to.","type":"string"},"name":{"description":"Campaign name as the account owner set it. Null when the campaign has none.","anyOf":[{"type":"string"},{"type":"null"}]},"trigger":{"type":"string","enum":["welcome_message","online_message","has_expired_message","will_expire_in_message"]},"action":{"description":"What the campaign does when the trigger fires.\n`send_message` — sends the messages listed in `messages`.\n`start_mimic` — opens a Mimic chat instead of sending; such a campaign has no messages.\nNull when this version of the API does not name the action. Such a campaign reports no\nmessages either, since what its content means depends on what it does with it.","anyOf":[{"type":"string","enum":["send_message","start_mimic"]},{"type":"null"}]},"status":{"type":"string","enum":["active","paused","archived","unsending","unsent"]},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the campaign was created (ISO 8601 Zulu).","type":"string"},"rules":{"additionalProperties":false,"description":"When the campaign fires, and on what terms it recalls what it sent.","type":"object","properties":{"send_delay_interval":{"description":"How long the campaign waits between the trigger firing and the send. Null for the expiry triggers, which fire at a fixed offset instead.","anyOf":[{"additionalProperties":false,"type":"object","properties":{"min_sec":{"description":"Shortest the campaign waits after the trigger fires.","type":"integer"},"range_sec":{"description":"Span the delay is drawn from, on top of `min_sec`: a send happens between `min_sec` and `min_sec + range_sec` seconds after the trigger. 0 makes the delay fixed.","type":"integer"}},"required":["min_sec","range_sec"]},{"type":"null"}]},"send_after_expire_min":{"description":"Minutes after a subscription expired at which the campaign fires. Non-null only for trigger `has_expired_message`.","anyOf":[{"type":"integer"},{"type":"null"}]},"send_before_expire_min":{"description":"Minutes before a subscription expires at which the campaign fires. Non-null only for trigger `will_expire_in_message`.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the campaign never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan replied to. A fan who opened the message without replying keeps it too, the same as with `unsend_if_not_read_enabled`.","type":"boolean"},"retry_after_unsend_min":{"description":"Minutes after a recall before the same fan may be targeted again. Null when a fan is targeted at most once, which is the default.","anyOf":[{"type":"integer"},{"type":"null"}]},"end_at":{"description":"When the campaign stops firing (ISO 8601 Zulu). Null when it runs until stopped by hand.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"}},"required":["send_delay_interval","send_after_expire_min","send_before_expire_min","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","retry_after_unsend_min","end_at","mimic_on_reply_enabled"]},"audience_filters":{"description":"Filters evaluated per fan when the trigger fires. Empty when the campaign targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","buying_power_between","active_chatted","belongs_platform_lists","belongs_dynamic_lists","send_within_time_range"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the campaign sends, in send order. Empty for a campaign that starts a Mimic chat.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_sends_count":{"description":"Dispatches the campaign has made since it was created. Cumulative: a fan targeted twice counts twice, and the figure never decreases.","type":"integer"},"first_message_stats":{"additionalProperties":false,"description":"Figures for the first message of the campaign only. Follow-up steps are reported separately.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards. Messages still with the fan are `sent_messages_count` minus this.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid for these messages, before any platform deduction. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]},"follow_up_message_stats":{"description":"Figures for each follow-up step. The campaign's total is `first_message_stats` plus these.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Follow-up step these figures belong to, matching `messages[].step`. Starts at 1; the first message is reported in `first_message_stats`.","type":"integer"},"sent_messages_count":{"description":"Messages recorded as sent. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards. Messages still with the fan are `sent_messages_count` minus this.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid for these messages, before any platform deduction. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["step","sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}}},"required":["id","account_id","name","trigger","action","status","created_by","created_at","rules","audience_filters","messages","targeted_sends_count","first_message_stats","follow_up_message_stats"]}}}},"400":{"description":"The request states something this endpoint cannot accept: a value outside its bounds, a schedule member belonging to another trigger, content on a campaign that sends none, or a fan list that does not exist.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request states something this endpoint cannot accept: a value outside its bounds, a schedule member belonging to another trigger, content on a campaign that sends none, or a fan list that does not exist.","type":"object","properties":{"message":{"description":"What to change about the request.","type":"string"},"code":{"type":"string","enum":["DYNAMIC_LIST_NOT_FOUND","RESTRICTED_WORDS_DETECTED","INVALID_CAMPAIGN_DATA","CAMPAIGN_NAME_REQUIRED_FOR_MEDIA_ONLY","CAMPAIGN_NAME_REQUIRED_FOR_SEQUENCE","MESSAGE_CAMPAIGN_MESSAGE_DATA_REQUIRED","MIMIC_CAMPAIGN_NAME_NOT_ALLOWED","MIMIC_CAMPAIGN_MESSAGE_DATA_NOT_ALLOWED","MIMIC_CAMPAIGN_START_ON_REPLY_NOT_ALLOWED","CAMPAIGN_NOT_CREATED","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."},"details":{"additionalProperties":false,"description":"Present on `RESTRICTED_WORDS_DETECTED`: the words and the topics the content check matched. Either list may be empty when the check names one and not the other.","type":"object","properties":{"words":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"string"}}},"required":["words","topics"]}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"502":{"description":"The campaign could not be created or confirmed. Whether the campaign was created is unknown — list the account campaigns before retrying.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The campaign could not be created or confirmed. Whether the campaign was created is unknown — list the account campaigns before retrying.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Retrieve one Auto Messages campaign

> \*\*Rate limit:\*\* 5 requests per second\
> \
> \*\*Required permission:\*\* \`auto\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"auto-message-campaigns","description":"Endpoints for reading the Auto Messages campaigns of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/auto-message-campaigns/{campaign_id}":{"get":{"summary":"Retrieve one Auto Messages campaign","tags":["auto-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\n**Required permission:** `auto_messages.view`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the campaign belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Campaign identifier."}],"responses":{"200":{"description":"One Auto Messages campaign of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Auto Messages campaign of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Campaign identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the campaign belongs to.","type":"string"},"name":{"description":"Campaign name as the account owner set it. Null when the campaign has none.","anyOf":[{"type":"string"},{"type":"null"}]},"trigger":{"type":"string","enum":["welcome_message","online_message","has_expired_message","will_expire_in_message"]},"action":{"description":"What the campaign does when the trigger fires.\n`send_message` — sends the messages listed in `messages`.\n`start_mimic` — opens a Mimic chat instead of sending; such a campaign has no messages.\nNull when this version of the API does not name the action. Such a campaign reports no\nmessages either, since what its content means depends on what it does with it.","anyOf":[{"type":"string","enum":["send_message","start_mimic"]},{"type":"null"}]},"status":{"type":"string","enum":["active","paused","archived","unsending","unsent"]},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the campaign was created (ISO 8601 Zulu).","type":"string"},"rules":{"additionalProperties":false,"description":"When the campaign fires, and on what terms it recalls what it sent.","type":"object","properties":{"send_delay_interval":{"description":"How long the campaign waits between the trigger firing and the send. Null for the expiry triggers, which fire at a fixed offset instead.","anyOf":[{"additionalProperties":false,"type":"object","properties":{"min_sec":{"description":"Shortest the campaign waits after the trigger fires.","type":"integer"},"range_sec":{"description":"Span the delay is drawn from, on top of `min_sec`: a send happens between `min_sec` and `min_sec + range_sec` seconds after the trigger. 0 makes the delay fixed.","type":"integer"}},"required":["min_sec","range_sec"]},{"type":"null"}]},"send_after_expire_min":{"description":"Minutes after a subscription expired at which the campaign fires. Non-null only for trigger `has_expired_message`.","anyOf":[{"type":"integer"},{"type":"null"}]},"send_before_expire_min":{"description":"Minutes before a subscription expires at which the campaign fires. Non-null only for trigger `will_expire_in_message`.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the campaign never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan replied to. A fan who opened the message without replying keeps it too, the same as with `unsend_if_not_read_enabled`.","type":"boolean"},"retry_after_unsend_min":{"description":"Minutes after a recall before the same fan may be targeted again. Null when a fan is targeted at most once, which is the default.","anyOf":[{"type":"integer"},{"type":"null"}]},"end_at":{"description":"When the campaign stops firing (ISO 8601 Zulu). Null when it runs until stopped by hand.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"}},"required":["send_delay_interval","send_after_expire_min","send_before_expire_min","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","retry_after_unsend_min","end_at","mimic_on_reply_enabled"]},"audience_filters":{"description":"Filters evaluated per fan when the trigger fires. Empty when the campaign targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","buying_power_between","active_chatted","belongs_platform_lists","belongs_dynamic_lists","send_within_time_range"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the campaign sends, in send order. Empty for a campaign that starts a Mimic chat.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_sends_count":{"description":"Dispatches the campaign has made since it was created. Cumulative: a fan targeted twice counts twice, and the figure never decreases.","type":"integer"},"first_message_stats":{"additionalProperties":false,"description":"Figures for the first message of the campaign only. Follow-up steps are reported separately.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards. Messages still with the fan are `sent_messages_count` minus this.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid for these messages, before any platform deduction. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]},"follow_up_message_stats":{"description":"Figures for each follow-up step. The campaign's total is `first_message_stats` plus these.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Follow-up step these figures belong to, matching `messages[].step`. Starts at 1; the first message is reported in `first_message_stats`.","type":"integer"},"sent_messages_count":{"description":"Messages recorded as sent. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards. Messages still with the fan are `sent_messages_count` minus this.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid for these messages, before any platform deduction. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null when the figure cannot be computed.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["step","sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}}},"required":["id","account_id","name","trigger","action","status","created_by","created_at","rules","audience_filters","messages","targeted_sends_count","first_message_stats","follow_up_message_stats"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The campaign does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The campaign does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"502":{"description":"The campaign exists and is unchanged; only its content could not be read. Repeating the request is safe but may not help: the content can be missing for good, and then every repeat answers the same.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The campaign exists and is unchanged; only its content could not be read. Repeating the request is safe but may not help: the content can be missing for good, and then every repeat answers the same.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message"]}}}}}}}}}
```

## Start, pause or archive an Auto Messages campaign

> \*\*Rate limit:\*\* 5 requests per second\
> \
> Asking for the state the campaign is already in is accepted and does not change the campaign, but it is not free: the change is carried out again, which is how a change that did not complete is retried. If the answer is \`502\`, repeat the same request to complete the change; after a \`204\` there is nothing to repeat. Every request, a repeat included, counts toward the rate limit.\
> \
> \*\*Required permission:\*\* \`auto\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"auto-message-campaigns","description":"Endpoints for reading the Auto Messages campaigns of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/auto-message-campaigns/{campaign_id}/status":{"patch":{"summary":"Start, pause or archive an Auto Messages campaign","tags":["auto-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nAsking for the state the campaign is already in is accepted and does not change the campaign, but it is not free: the change is carried out again, which is how a change that did not complete is retried. If the answer is `502`, repeat the same request to complete the change; after a `204` there is nothing to repeat. Every request, a repeat included, counts toward the rate limit.\n\n**Required permission:** `auto_messages.edit`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"description":"State to move the campaign to.\n`active` — the campaign reacts to its trigger again.\n`paused` — the campaign stops reacting and keeps what it already queued.\n`archived` — the campaign stops for good and its pending queue is cleared.","type":"object","properties":{"status":{"type":"string","enum":["active","paused","archived"]}},"required":["status"]}}},"required":true,"description":"State to move the campaign to.\n`active` — the campaign reacts to its trigger again.\n`paused` — the campaign stops reacting and keeps what it already queued.\n`archived` — the campaign stops for good and its pending queue is cleared."},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the campaign belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Campaign identifier."}],"responses":{"204":{"description":"The status was changed and the change was confirmed."},"400":{"description":"The requested state is not one of the three, or the campaign is recalling what it sent and cannot change state at all.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The requested state is not one of the three, or the campaign is recalling what it sent and cannot change state at all.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_UNSEND_IN_PROGRESS"]}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The campaign does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The campaign does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"502":{"description":"The change did not complete. Repeating the request is safe and is how the change is retried.\nOn a stop the campaign already reads as stopped and starts no new sends; messages already on their way may still be delivered.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The change did not complete. Repeating the request is safe and is how the change is retried.\nOn a stop the campaign already reads as stopped and starts no new sends; messages already on their way may still be delivered.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_STATUS_NOT_CONFIRMED"]}},"required":["message"]}}}}}}}}}
```

## Recall what an Auto Messages campaign has sent

> \*\*Rate limit:\*\* 5 requests per second\
> \
> The campaign stops sending, its queue is cleared, and the messages it delivered within the last 24 hours are taken back out of the fans' chats. Anything older stays: the platform allows no recall beyond that window.\
> \
> \*\*This cannot be undone and it is not limited to campaigns this API created.\*\* Any campaign of the account can be recalled, including one a member built in the panel.\
> \
> Unlike a status change, repeating this request is not always safe: a campaign that is already recalling refuses it. If the answer is \`502\`, read the campaign before repeating — recalling or recalled means the recall started and finishes on its own, while active or paused means it never started and only a repeat performs it. Reading the campaign needs \`auto\_messages.view\` in addition to \`auto\_messages.edit\`.\
> \
> \*\*Required permission:\*\* \`auto\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"auto-message-campaigns","description":"Endpoints for reading the Auto Messages campaigns of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/auto-message-campaigns/{campaign_id}/unsend":{"post":{"summary":"Recall what an Auto Messages campaign has sent","tags":["auto-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nThe campaign stops sending, its queue is cleared, and the messages it delivered within the last 24 hours are taken back out of the fans' chats. Anything older stays: the platform allows no recall beyond that window.\n\n**This cannot be undone and it is not limited to campaigns this API created.** Any campaign of the account can be recalled, including one a member built in the panel.\n\nUnlike a status change, repeating this request is not always safe: a campaign that is already recalling refuses it. If the answer is `502`, read the campaign before repeating — recalling or recalled means the recall started and finishes on its own, while active or paused means it never started and only a repeat performs it. Reading the campaign needs `auto_messages.view` in addition to `auto_messages.edit`.\n\n**Required permission:** `auto_messages.edit`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the campaign belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Campaign identifier."}],"responses":{"204":{"description":"The recall was accepted: the campaign stops sending and takes back what it can."},"400":{"description":"The campaign is not in a state a recall can start from: it is already recalling, or it is archived, or it opens a Mimic chat and sends nothing of its own. One code covers every cause; read the campaign to tell which.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The campaign is not in a state a recall can start from: it is already recalling, or it is archived, or it opens a Mimic chat and sends nothing of its own. One code covers every cause; read the campaign to tell which.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_NOT_RECALLABLE"]}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The campaign does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The campaign does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"502":{"description":"Unlike a status change, this answer is not an invitation to repeat the request blindly: the campaign stops sending the moment the recall is accepted, before the recall itself is confirmed, so a repeat against a campaign that did start meets the recall branch and is refused.\nRead the campaign to tell the two apart. Recalling or recalled means it started, and it is finished without further requests. Active or paused means the request never reached the campaign, and repeating it is the only way the recall happens.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"Unlike a status change, this answer is not an invitation to repeat the request blindly: the campaign stops sending the moment the recall is accepted, before the recall itself is confirmed, so a repeat against a campaign that did start meets the recall branch and is refused.\nRead the campaign to tell the two apart. Recalling or recalled means it started, and it is finished without further requests. Active or paused means the request never reached the campaign, and repeating it is the only way the recall happens.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_RECALL_NOT_CONFIRMED"]}},"required":["message"]}}}}}}}}}
```

## Create a Priority Mass Messages broadcast

> \*\*Rate limit:\*\* 1 request per second\
> \
> \*\*A created broadcast is a real broadcast to its whole audience, not a draft.\*\* Without a schedule it is queued and goes out without further action; with one it waits for the hour it names. Use the status endpoint to pause it.\
> \
> \*\*This endpoint is not idempotent, and a repeated create is a second broadcast to every fan it matches.\*\* A request that times out, or that answers \`500\` or \`502\`, may still have created one: whether it exists is unknown, so list the account broadcasts before retrying and pause a duplicate at once. Listing the broadcasts needs \`priority\_mass\_messages.view\` in addition to \`priority\_mass\_messages.edit\`.\
> \
> A schedule and an end are each a wall-clock date and whole hour plus the clock it is read on. An offset carried by the value is ignored. A schedule in the past goes out at once, an end before the schedule is accepted, and a broadcast whose end passes completes as sent whatever state it was in.\
> \
> A broadcast reads its schedule back as the UTC instant plus the zone name, not as the wall clock it was stated on, and reads it back as \`null\` once it has been dispatched.\
> \
> \`audience\_filters\[].options.lists\[].name\` is required on every fan list and never published back: the reads carry identifiers alone.\
> \
> Revoking or narrowing the key that created a broadcast does not stop it. Pause it through the status endpoint instead.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns":{"post":{"summary":"Create a Priority Mass Messages broadcast","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 1 request per second\n\n**A created broadcast is a real broadcast to its whole audience, not a draft.** Without a schedule it is queued and goes out without further action; with one it waits for the hour it names. Use the status endpoint to pause it.\n\n**This endpoint is not idempotent, and a repeated create is a second broadcast to every fan it matches.** A request that times out, or that answers `500` or `502`, may still have created one: whether it exists is unknown, so list the account broadcasts before retrying and pause a duplicate at once. Listing the broadcasts needs `priority_mass_messages.view` in addition to `priority_mass_messages.edit`.\n\nA schedule and an end are each a wall-clock date and whole hour plus the clock it is read on. An offset carried by the value is ignored. A schedule in the past goes out at once, an end before the schedule is accepted, and a broadcast whose end passes completes as sent whatever state it was in.\n\nA broadcast reads its schedule back as the UTC instant plus the zone name, not as the wall clock it was stated on, and reads it back as `null` once it has been dispatched.\n\n`audience_filters[].options.lists[].name` is required on every fan list and never published back: the reads carry identifiers alone.\n\nRevoking or narrowing the key that created a broadcast does not stop it. Pause it through the status endpoint instead.\n\n**Required permission:** `priority_mass_messages.edit`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":{"not":{}},"type":"object","properties":{"name":{"description":"Broadcast name. Required when the broadcast sends more than one message, and when its only message carries media but no text. A single text message sent without a name reads back with that text as its name.","anyOf":[{"type":"null"},{"minLength":1,"maxLength":100,"pattern":"\\S","type":"string"}]},"scheduled_at":{"format":"date-time","description":"Wall-clock date and whole hour at which the broadcast goes out, read on the clock `scheduled_at_timezone_mode` names. An offset carried by the value is ignored, so the hour written is the hour used — the value is not moved to the instant an offset would name. Required together with `scheduled_at_timezone_mode`. A schedule in the past is accepted and goes out at once. Omit both to send as soon as the broadcast is queued.","type":"string"},"scheduled_at_timezone_mode":{"type":"string","enum":["utc","organisation"]},"rules":{"additionalProperties":false,"description":"When the broadcast stops, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"type":"string","enum":["off","online_now","online_only"],"description":"Whether the broadcast waits for the fan to be online before sending. Omit for `off`."},"unsend_delay_sec":{"type":"integer","enum":[3600,7200,18000,28800,54000,72000],"description":"Delay after which a sent message is recalled: 1, 2, 5, 8, 15 or 20 hours, the choices the panel offers. Omit to never recall."},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. Stated only together with `unsend_delay_sec`. Omit for false, which recalls every message.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat. Omit for false.","type":"boolean"},"end_at":{"format":"date-time","description":"Wall-clock date and whole hour at which the broadcast stops, read on the clock `end_at_timezone_mode` names. An offset carried by the value is ignored, so the hour written is the hour used. Required together with `end_at_timezone_mode`. An end before the schedule is accepted; when the end passes the broadcast completes as sent whatever state it is in, so a paused broadcast past its end can no longer be resumed and an early end can complete a broadcast that sent nothing.","type":"string"},"end_at_timezone_mode":{"type":"string","enum":["utc","organisation"]}}},"audience_filters":{"maxItems":20,"description":"Who the broadcast sends to. At least one include filter is required. A fan-list include is not combined with an include of another kind, and one list does not appear twice under one kind.","type":"array","items":{"anyOf":[{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","purchased_from_account"]},"mode":{"type":"string","enum":["include"]},"options":{"additionalProperties":false,"minProperties":1,"description":"A window stated either as a date range (`from_at`/`to_at`) or as a range of days ago (`from_days`/`to_days`), never as both at once.","type":"object","properties":{"from_at":{"format":"date-time","type":"string"},"to_at":{"format":"date-time","type":"string"},"from_days":{"minimum":0,"maximum":1000000,"type":"integer"},"to_days":{"minimum":1,"maximum":1000000,"type":"integer"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["spent_within_organisation","spent_within_account"]},"mode":{"type":"string","enum":["include"]},"options":{"additionalProperties":false,"minProperties":1,"type":"object","properties":{"from_amount_gross":{"minimum":0,"type":"number"},"to_amount_gross":{"minimum":0,"type":"number"}}}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"lists":{"minItems":1,"maxItems":100,"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the fan list.","type":"string"},"name":{"minLength":1,"maxLength":255,"description":"Name of the fan list. Stored and shown in the panel; never published back here.","type":"string"}},"required":["id","name"]}}},"required":["lists"]}},"required":["kind","mode","options"]},{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["active_chatted"]},"mode":{"type":"string","enum":["exclude"]},"options":{"additionalProperties":false,"type":"object","properties":{"within_last_min":{"minimum":0,"maximum":525600,"type":"integer"}},"required":["within_last_min"]}},"required":["kind","mode","options"]}]}},"messages":{"minItems":1,"maxItems":5,"description":"Messages to send, in order: the broadcast and up to four follow-ups.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"text":{"description":"Text the fan receives, rendered per fan. Null for a message that carries only media. A message carries text, at least one attachment, or both. A fan's name is a placeholder written exactly as the panel writes it: `{{ name | default: \"babe\" }}`, where `name` is the name on the fan's profile, `displayName` the name the organisation assigned the fan, and the quoted `default:` value what the fan is called when the name is missing.","anyOf":[{"type":"null"},{"maxLength":5000,"type":"string"}]},"price_gross":{"description":"Price the fan pays for this message, before any platform deduction. 0 makes it free; any other amount is between 3 and 200. A price requires something behind the paywall — `text_is_paid` or an attachment with `is_paid` — and either of those requires a price.","anyOf":[{"type":"number","enum":[0]},{"minimum":3,"maximum":200,"type":"number"}]},"delay_sec":{"minimum":0,"maximum":2592000,"description":"Delay after the previous message before this one is sent. Accepted on follow-ups only — a delay on the first message is refused, because the broadcast itself decides when it goes out.","type":"integer"},"attachments":{"maxItems":100,"description":"Media to attach. Empty for a message that carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"maxLength":100,"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True to put the attachment behind the paywall, hiding it from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True to put the text itself behind the paywall, so the fan buys the message to read it. Requires text that is not empty or whitespace.","type":"boolean"},"tagged_platform_account_ids":{"maxItems":10,"description":"Platform accounts to tag in this message, by their identifier on the platform.","type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}}},"required":["text","price_gross","attachments","text_is_paid","tagged_platform_account_ids"]}}},"required":["rules","audience_filters","messages"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose broadcasts are read."}],"responses":{"201":{"description":"One Priority Mass Messages broadcast of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Priority Mass Messages broadcast of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}}}},"400":{"description":"The request states something this endpoint cannot accept: a value outside its bounds, an audience no broadcast can be built from, a message whose price and paywall disagree, half a schedule pair, a time that is not a whole hour, or a fan list that does not exist. A refusal this endpoint decides itself carries no code.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request states something this endpoint cannot accept: a value outside its bounds, an audience no broadcast can be built from, a message whose price and paywall disagree, half a schedule pair, a time that is not a whole hour, or a fan list that does not exist. A refusal this endpoint decides itself carries no code.","type":"object","properties":{"message":{"description":"What to change about the request.","type":"string"},"code":{"type":"string","enum":["DYNAMIC_LIST_NOT_FOUND","RESTRICTED_WORDS_DETECTED","CAMPAIGN_NAME_REQUIRED_FOR_MEDIA_ONLY","INVALID_CAMPAIGN_DATA","CAMPAIGN_NOT_CREATED","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."},"details":{"additionalProperties":false,"description":"Present on `RESTRICTED_WORDS_DETECTED`: the words and the topics the content check matched. Either list may be empty when the check names one and not the other.","type":"object","properties":{"words":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"string"}}},"required":["words","topics"]}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. The broadcast may still have been created: list the account broadcasts before retrying.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. The broadcast may still have been created: list the account broadcasts before retrying.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The broadcast could not be created or confirmed. Whether it exists is unknown — list the account broadcasts before retrying, and pause a duplicate at once.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast could not be created or confirmed. Whether it exists is unknown — list the account broadcasts before retrying, and pause a duplicate at once.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Retrieve one Priority Mass Messages broadcast

> \*\*Rate limit:\*\* 5 requests per second\
> \
> A schedule reads back as \`null\` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\
> \
> Sent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its \`reply\_rate\` then reads \`null\` rather than a figure above 1.\
> \
> A broadcast whose content could not be read is refused with \`502\` here, because that content is exactly what was asked for.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns/{campaign_id}":{"get":{"summary":"Retrieve one Priority Mass Messages broadcast","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nA schedule reads back as `null` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\n\nSent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its `reply_rate` then reads `null` rather than a figure above 1.\n\nA broadcast whose content could not be read is refused with `502` here, because that content is exactly what was asked for.\n\n**Required permission:** `priority_mass_messages.view`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the broadcast belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Broadcast identifier."}],"responses":{"200":{"description":"One Priority Mass Messages broadcast of the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Priority Mass Messages broadcast of the account.","type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The broadcast does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"This broadcast exists and is unchanged; only its content could not be read, and here it is exactly what was asked for. Repeating the request is safe. A temporary failure to read the content passes on a later repeat; content missing for good answers the same on every repeat.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"This broadcast exists and is unchanged; only its content could not be read, and here it is exactly what was asked for. Repeating the request is safe. A temporary failure to read the content passes on a later repeat; content missing for good answers the same on every repeat.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message","code"]}}}}}}}}}
```

## Recall what a Priority Mass Messages broadcast sent

> \*\*Rate limit:\*\* 5 requests per second\
> \
> The broadcast stops sending and the messages it delivered are taken back out of the fans' chats, as far as the platform's 24-hour recall window allows. A recall is possible within 24 hours of the broadcast's last status change.\
> \
> \*\*This cannot be undone and it is not limited to broadcasts this API created.\*\* Any broadcast of the account can be recalled, including one a person built in the panel.\
> \
> A \`502\` does not promise the broadcast is untouched, but no repeat recalls twice, so repeating the request is safe; read the broadcast if the answer stays \`502\`. This differs from the Auto Messages recall, whose \`502\` asks the caller to read the campaign before repeating at all. Reading the broadcast needs \`priority\_mass\_messages.view\` in addition to \`priority\_mass\_messages.edit\`.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns/{campaign_id}/unsend":{"post":{"summary":"Recall what a Priority Mass Messages broadcast sent","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nThe broadcast stops sending and the messages it delivered are taken back out of the fans' chats, as far as the platform's 24-hour recall window allows. A recall is possible within 24 hours of the broadcast's last status change.\n\n**This cannot be undone and it is not limited to broadcasts this API created.** Any broadcast of the account can be recalled, including one a person built in the panel.\n\nA `502` does not promise the broadcast is untouched, but no repeat recalls twice, so repeating the request is safe; read the broadcast if the answer stays `502`. This differs from the Auto Messages recall, whose `502` asks the caller to read the campaign before repeating at all. Reading the broadcast needs `priority_mass_messages.view` in addition to `priority_mass_messages.edit`.\n\n**Required permission:** `priority_mass_messages.edit`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the broadcast belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"campaign_id","required":true,"description":"Broadcast identifier."}],"responses":{"204":{"description":"The recall was applied: the broadcast stops sending and takes back what it can."},"400":{"description":"The broadcast is not in a state a recall can start from: the wrong state, a paused broadcast that never started sending, or one whose last status change is more than 24 hours old. One code covers every cause; read the broadcast to tell which.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast is not in a state a recall can start from: the wrong state, a paused broadcast that never started sending, or one whose last status change is more than 24 hours old. One code covers every cause; read the broadcast to tell which.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_NOT_RECALLABLE"]}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The broadcast does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The broadcast does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The recall did not complete. No broadcast is recalled twice by a repeat, so repeating the request is safe; read the broadcast if the answer stays 502. This differs from the Auto Messages recall, whose 502 asks the caller to read the campaign before repeating at all.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The recall did not complete. No broadcast is recalled twice by a repeat, so repeating the request is safe; read the broadcast if the answer stays 502. This differs from the Auto Messages recall, whose 502 asks the caller to read the campaign before repeating at all.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_RECALL_NOT_APPLIED"]}},"required":["message","code"]}}}}}}}}}
```

## Retrieve the Priority Mass Messages broadcasts of an account

> \*\*Rate limit:\*\* 5 requests per second\
> \
> A schedule reads back as \`null\` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\
> \
> Sent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its \`reply\_rate\` then reads \`null\` rather than a figure above 1.\
> \
> A broadcast whose content could not be read is listed with \`messages: \[]\` and every figure at zero, rather than failing the page.\
> \
> \*\*Required permission:\*\* \`priority\_mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"priority-mass-message-campaigns","description":"Endpoints for reading, creating, pausing and recalling the Priority Mass Messages broadcasts of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/priority-mass-message-campaigns":{"get":{"summary":"Retrieve the Priority Mass Messages broadcasts of an account","tags":["priority-mass-message-campaigns"],"description":"**Rate limit:** 5 requests per second\n\nA schedule reads back as `null` once the broadcast has been dispatched; a broadcast paused before its schedule came due keeps it.\n\nSent, unsent and purchased figures, and the purchased amount, count the first message of the broadcast only; replies are counted across every step. Because of that a sequence can report more replies than sends, and its `reply_rate` then reads `null` rather than a figure above 1.\n\nA broadcast whose content could not be read is listed with `messages: []` and every figure at zero, rather than failing the page.\n\n**Required permission:** `priority_mass_messages.view`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":50,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 1, max: 100, default: 50)."},{"schema":{"minimum":0,"default":0,"type":"integer"},"in":"query","name":"offset","required":false,"description":"Items to skip (default: 0)."},{"schema":{"default":false,"type":"boolean"},"in":"query","name":"include_archived","required":false,"description":"Include archived broadcasts in the page (default: false). Only `archived` is affected — every other state is always listed."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose broadcasts are read."}],"responses":{"200":{"description":"A page of the account Priority Mass Messages broadcasts, newest first.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A page of the account Priority Mass Messages broadcasts, newest first.","type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Broadcast identifier.","type":"string"},"account_id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"OnlyMonster account the broadcast belongs to.","type":"string"},"name":{"description":"Broadcast name as the account owner set it. For a single-message broadcast created without a name, the text of that message, as the panel shows it. Null for a broadcast created without a name whose content could not be read.","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"State of the broadcast, as the panel shows it. Null for a broadcast holding a state this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["scheduled","queued","sending","paused","unsending","sent","unsent","archived"]}]},"pause_reason":{"description":"Why the broadcast is paused: `manual` when a person paused it, `send_errors` when too many sends failed. Null when it is not paused.","anyOf":[{"type":"null"},{"type":"string","enum":["manual","send_errors"]}]},"progress_percent":{"minimum":0,"maximum":100,"description":"How far the broadcast has got through its audience, from 0 to 100.","type":"integer"},"created_by":{"additionalProperties":false,"description":"Who created the campaign.","type":"object","properties":{"type":{"type":"string","enum":["user","api_key"]},"id":{"description":"For `user`, the id of the member who created the campaign in OnlyMonster; for `api_key`, the id of the API key that created it. Null when the creator is unknown.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["type","id"]},"created_at":{"format":"date-time","description":"When the broadcast was created (ISO 8601 Zulu).","type":"string"},"scheduled_at":{"description":"When the broadcast is due to go out (ISO 8601 Zulu). Null once it has been dispatched, and null for one that was never scheduled; a broadcast paused before its schedule came due keeps it.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"scheduled_at_timezone":{"description":"IANA zone name the schedule was stated in, so a client can show it the way the panel does. Null whenever `scheduled_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]},"rules":{"additionalProperties":false,"description":"Who the broadcast sends to, and on what terms it recalls what it sent.","type":"object","properties":{"online_check_mode":{"description":"Whether the broadcast waits for the fan to be online before sending, and on what terms. Null for a broadcast holding a term this API does not name, which no broadcast created through it can reach.","anyOf":[{"type":"null"},{"type":"string","enum":["off","online_now","online_only"]}]},"unsend_delay_sec":{"description":"Delay after which a sent message is recalled. Null when the broadcast never recalls.","anyOf":[{"type":"integer"},{"type":"null"}]},"unsend_if_not_read_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened. False means the message is recalled whatever the fan did.","type":"boolean"},"unsend_if_not_replied_enabled":{"description":"Whether the recall is skipped for a message the fan has already opened, the same as `unsend_if_not_read_enabled`: the recall checks whether a message was read, never whether it was replied to. A broadcast cannot be created with it.","type":"boolean"},"mimic_on_reply_enabled":{"description":"Whether a reply from the fan opens a Mimic chat.","type":"boolean"},"end_at":{"description":"When the broadcast stops (ISO 8601 Zulu). Null when it carries no end. Once the end passes the broadcast completes as sent, whatever state it was in.","anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"end_at_timezone":{"description":"IANA zone name the end was stated in, so a client can show it the way the panel does. Null whenever `end_at` is null.","anyOf":[{"type":"null"},{"type":"string"}]}},"required":["online_check_mode","unsend_delay_sec","unsend_if_not_read_enabled","unsend_if_not_replied_enabled","mimic_on_reply_enabled","end_at","end_at_timezone"]},"audience_filters":{"description":"Filters evaluated per fan when the audience is resolved. Empty when the broadcast targets every fan.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"kind":{"type":"string","enum":["subscribed_date","purchased_from_organisation","spent_within_organisation","purchased_from_account","spent_within_account","active_chatted","belongs_platform_lists","belongs_dynamic_lists"]},"mode":{"type":"string","enum":["include","exclude"]},"options":{"anyOf":[{"additionalProperties":false,"description":"Absolute date range.","type":"object","properties":{"from_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]},"to_at":{"anyOf":[{"format":"date-time","type":"string"},{"type":"null"}]}},"required":["from_at","to_at"]},{"additionalProperties":false,"description":"Range expressed in days back from now.","type":"object","properties":{"from_days":{"anyOf":[{"type":"integer"},{"type":"null"}]},"to_days":{"anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["from_days","to_days"]},{"additionalProperties":false,"description":"Monetary range, before platform deductions.","type":"object","properties":{"from_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]},"to_amount_gross":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["from_amount_gross","to_amount_gross"]},{"additionalProperties":false,"description":"Hour of the day the campaign may send in, as `HH:00`. `timezone_mode` says whose clock the hours are read on: `utc`, or `organisation` for the timezone configured on the organisation.","type":"object","properties":{"from_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"to_time":{"pattern":"^([01]\\d|2[0-3]):00$","type":"string"},"timezone_mode":{"type":"string","enum":["utc","organisation"]}},"required":["from_time","to_time","timezone_mode"]},{"additionalProperties":false,"description":"Identifiers of the fan lists the filter selects on.","type":"object","properties":{"list_ids":{"type":"array","items":{"type":"string"}}},"required":["list_ids"]},{"additionalProperties":false,"description":"Window, in minutes back from the moment the trigger fires.","type":"object","properties":{"within_last_min":{"type":"integer"}},"required":["within_last_min"]},{"additionalProperties":false,"description":"No parameters: the filter kind alone decides what it selects.","type":"object","properties":{}}]}},"required":["kind","mode","options"]}},"messages":{"description":"Messages the broadcast sends, in send order. Empty, together with every figure at zero, for a broadcast whose content could not be read — there the zeros stand for unknown values rather than for measurements.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"step":{"description":"Position of the message in the campaign: 0 is the first message, 1 and up are its follow-ups.","type":"integer"},"text":{"description":"Text the fan receives. Null for a message that carries only media.","anyOf":[{"type":"string"},{"type":"null"}]},"price_gross":{"minimum":0,"description":"Price the fan pays for this message, before any platform deduction. 0 when the message is free.","type":"number"},"delay_sec":{"description":"Delay after the previous message of the campaign before this one is sent. Null for the first message, which is timed by the campaign rules instead.","anyOf":[{"type":"integer"},{"type":"null"}]},"attachments":{"description":"Media attached to this message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio","gif"]},"is_paid":{"description":"True when the attachment sits behind the paywall and is hidden from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"text_is_paid":{"description":"True when the text itself sits behind the paywall, so the fan buys the message to read it rather than only to open its media. False when the text is visible before paying, including when the message carries no price at all.","type":"boolean"},"tagged_platform_account_ids":{"description":"Platform accounts tagged in this message, by their identifier on the platform. Empty when it tags none.","type":"array","items":{"type":"string"}}},"required":["step","text","price_gross","delay_sec","attachments","text_is_paid","tagged_platform_account_ids"]}},"targeted_recipients_count":{"description":"Fans the broadcast resolved to. 0 until it has been prepared, and unaffected by what was delivered afterwards.","type":"integer"},"stats":{"additionalProperties":false,"description":"What the broadcast delivered and earned.","type":"object","properties":{"sent_messages_count":{"description":"Messages recorded as sent, counting the first message of the broadcast only. Includes messages recalled afterwards.","type":"integer"},"unsent_messages_count":{"description":"Of the sent messages, how many were recalled afterwards, counting the first message of the broadcast only.","type":"integer"},"replied_messages_count":{"description":"Sent messages a fan replied to, counted across every step of the broadcast. Counted per message, not per fan, and not reduced by a recall.","type":"integer"},"purchased_messages_count":{"description":"Sent messages a fan paid for, counting the first message of the broadcast only.","type":"integer"},"purchased_amount_gross":{"description":"Total the fans paid, before any platform deduction, counting the first message of the broadcast only. 0 when nothing was bought.","type":"number"},"reply_rate":{"description":"Replied messages over sent messages, between 0 and 1. Null while nothing was sent, and null whenever the ratio would exceed 1 — a sequence counts replies on every step and sends on the first one only, so it can reach that bound in ordinary use.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]},"purchase_rate":{"description":"Purchased messages over sent messages, between 0 and 1. Null while nothing was sent, and null for a broadcast no message of which carries a price.","anyOf":[{"minimum":0,"maximum":1,"type":"number"},{"type":"null"}]}},"required":["sent_messages_count","unsent_messages_count","replied_messages_count","purchased_messages_count","purchased_amount_gross","reply_rate","purchase_rate"]}},"required":["id","account_id","name","status","pause_reason","progress_percent","created_by","created_at","scheduled_at","scheduled_at_timezone","rules","audience_filters","messages","targeted_recipients_count","stats"]}},"has_more":{"description":"True when more broadcasts exist beyond this page.","type":"boolean"}},"required":["items","has_more"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"429":{"description":"The token or per-endpoint rate limit was exceeded.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token or per-endpoint rate limit was exceeded.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The content of this page could not be read at all. The broadcasts exist and are unchanged, and repeating the request is safe. A single broadcast whose content is gone does not cause this — it is listed with `messages: []` and its figures at zero instead.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The content of this page could not be read at all. The broadcasts exist and are unchanged, and repeating the request is safe. A single broadcast whose content is gone does not cause this — it is listed with `messages: []` and its figures at zero instead.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["CAMPAIGN_CONTENT_UNAVAILABLE"]}},"required":["message","code"]}}}}}}}}}
```

## Take a Mass Message back

> \*\*Rate limit:\*\* 5 requests per second\
> \
> \*\*This cannot be undone and it reaches every Mass Message of the account, not only one this API sent\*\* — including one a person sent from the panel.\
> \
> OnlyFans decides how long a Mass Message can be taken back for; once that window closes the request is refused.\
> \
> Listing or reading a Mass Message needs \`mass\_messages.view\` in addition to \`mass\_messages.edit\`.\
> \
> \*\*Required permission:\*\* \`mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"mass-messages","description":"Endpoints for sending, listing, reading and unsending the Mass Messages of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/mass-messages/{mass_message_id}/unsend":{"post":{"summary":"Take a Mass Message back","tags":["mass-messages"],"description":"**Rate limit:** 5 requests per second\n\n**This cannot be undone and it reaches every Mass Message of the account, not only one this API sent** — including one a person sent from the panel.\n\nOnlyFans decides how long a Mass Message can be taken back for; once that window closes the request is refused.\n\nListing or reading a Mass Message needs `mass_messages.view` in addition to `mass_messages.edit`.\n\n**Required permission:** `mass_messages.edit`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the Mass Message belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"mass_message_id","required":true,"description":"Identifier of the Mass Message."}],"responses":{"204":{"description":"The Mass Message was taken back as far as the platform allows."},"400":{"description":"The platform refused to take the Mass Message back — its unsend window has closed, or the account may not unsend it — or the account is not an OnlyFans account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The platform refused to take the Mass Message back — its unsend window has closed, or the account may not unsend it — or the account is not an OnlyFans account.","type":"object","properties":{"message":{"description":"Why the Mass Message cannot be taken back.","type":"string"},"code":{"type":"string","enum":["FACE_VERIFICATION_REQUIRED","MASS_MESSAGE_NOT_UNSENDABLE","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The Mass Message does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The Mass Message does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"description":"The account's platform session or proxy cannot be used.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's platform session or proxy cannot be used.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message","code"]}}}},"429":{"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The request failed for a reason that is not about the request.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason that is not about the request.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Send a Mass Message from an account

> \*\*Rate limit:\*\* 5 requests per second\
> \
> \*\*A send is a real broadcast to every fan of the selected lists, not a draft, and this endpoint is not idempotent.\*\* A repeated send is a second Mass Message to every one of those fans.\
> \
> A \`502\` means whether the Mass Message went out is unknown: list the Mass Messages of the account before retrying, and unsend a duplicate while the platform window allows it.\
> \
> The API key that sent the Mass Message is published only here, as \`created\_by\`. In the list such a Mass Message carries \`created\_by: null\` and \`null\` fan lists, paid split and tagged accounts — read it by id for those.\
> \
> Listing or reading a Mass Message needs \`mass\_messages.view\` in addition to \`mass\_messages.edit\`.\
> \
> \*\*Required permission:\*\* \`mass\_messages.edit\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"mass-messages","description":"Endpoints for sending, listing, reading and unsending the Mass Messages of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/mass-messages":{"post":{"summary":"Send a Mass Message from an account","tags":["mass-messages"],"description":"**Rate limit:** 5 requests per second\n\n**A send is a real broadcast to every fan of the selected lists, not a draft, and this endpoint is not idempotent.** A repeated send is a second Mass Message to every one of those fans.\n\nA `502` means whether the Mass Message went out is unknown: list the Mass Messages of the account before retrying, and unsend a duplicate while the platform window allows it.\n\nThe API key that sent the Mass Message is published only here, as `created_by`. In the list such a Mass Message carries `created_by: null` and `null` fan lists, paid split and tagged accounts — read it by id for those.\n\nListing or reading a Mass Message needs `mass_messages.view` in addition to `mass_messages.edit`.\n\n**Required permission:** `mass_messages.edit`","requestBody":{"content":{"application/json":{"schema":{"additionalProperties":false,"type":"object","properties":{"text":{"description":"Text the fan receives. Null for a message that carries only media or a GIF. A message carries text, at least one attachment, or a GIF.","anyOf":[{"type":"null"},{"maxLength":5000,"type":"string"}]},"text_is_paid":{"description":"True to put the text itself behind the paywall, so the fan buys the message to read it. Requires text that is not empty or whitespace.","type":"boolean"},"price_gross":{"description":"Price the fan pays for this message, before any platform deduction. 0 makes it free; any other amount is between 3 and 200. A price requires something behind the paywall — `text_is_paid` or an attachment with `is_paid` — and either of those requires a price.","anyOf":[{"type":"number","enum":[0]},{"minimum":3,"maximum":200,"type":"number"}]},"attachments":{"maxItems":100,"description":"Media to attach. Empty for a message that carries none. A GIF is not an attachment — it travels as `giphy_id`.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio"],"description":"Kind of media being attached."},"is_paid":{"description":"True to put the attachment behind the paywall, hiding it from the preview the fan sees before paying.","type":"boolean"}},"required":["id","type","is_paid"]}},"giphy_id":{"description":"Identifier of the GIF to send, or null to send none.","anyOf":[{"type":"null"},{"maxLength":128,"type":"string"}]},"user_list_ids":{"maxItems":100,"description":"Fan lists this message is sent to, up to 100. Empty to send to every fan except the excluded lists; at least one list is stated here or in `excluded_user_list_ids`.","type":"array","items":{"minLength":1,"maxLength":64,"description":"Identifier of a fan list on the platform.","type":"string"}},"excluded_user_list_ids":{"maxItems":100,"description":"Fan lists to leave out of the audience. Empty to leave out none.","type":"array","items":{"minLength":1,"maxLength":64,"description":"Identifier of a fan list on the platform.","type":"string"}},"tagged_platform_account_ids":{"maxItems":10,"description":"Platform accounts to tag in this message, by their identifier on the platform.","type":"array","items":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"description":"Big integer id as string","type":"string"}}},"required":["text","text_is_paid","price_gross","attachments","giphy_id","user_list_ids","excluded_user_list_ids","tagged_platform_account_ids"]}}},"required":true},"parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose Mass Messages are addressed."}],"responses":{"201":{"description":"The queue state of the Mass Message that was just sent.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The queue state of the Mass Message that was just sent.","type":"object","properties":{"id":{"description":"Identifier of the Mass Message.","type":"string"},"status":{"type":"string","enum":["sending","done","unsent"],"description":"Where the Mass Message stands: `sending` while the platform is still delivering it, `done` once every message has gone out, `unsent` once it has been taken back."},"created_at":{"format":"date-time","description":"When the Mass Message was queued.","type":"string"},"targeted_recipients_count":{"description":"Fans the Mass Message is going out to. Null while the platform is still counting the audience.","anyOf":[{"type":"integer"},{"type":"null"}]},"pending_messages_count":{"description":"Messages of this Mass Message still waiting to be sent.","type":"integer"},"can_unsend":{"description":"True while the Mass Message can still be taken back.","type":"boolean"},"unsend_window_sec":{"description":"Seconds the platform allows a Mass Message to be taken back within.","type":"integer"},"created_by":{"additionalProperties":false,"description":"The API key that made this request. Published only in this answer.","type":"object","properties":{"type":{"type":"string","enum":["api_key"]},"id":{"description":"Identifier of the API key that sent the Mass Message.","type":"string"}},"required":["type","id"]}},"required":["id","status","created_at","targeted_recipients_count","pending_messages_count","can_unsend","unsend_window_sec","created_by"]}}}},"400":{"description":"The request states something this endpoint cannot accept: a value outside its bounds, a message whose price and paywall disagree, a message that carries nothing, an account that is not an OnlyFans account, or a send the platform refused. A refusal this endpoint decides itself carries no code.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request states something this endpoint cannot accept: a value outside its bounds, a message whose price and paywall disagree, a message that carries nothing, an account that is not an OnlyFans account, or a send the platform refused. A refusal this endpoint decides itself carries no code.","type":"object","properties":{"message":{"description":"What to change about the request.","type":"string"},"code":{"type":"string","enum":["RESTRICTED_WORDS_DETECTED","FACE_VERIFICATION_REQUIRED","MASS_MESSAGE_NOT_SENT","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."},"details":{"additionalProperties":false,"description":"Present on `RESTRICTED_WORDS_DETECTED`: the words and the topics the content check matched. Either list may be empty when the check names one and not the other.","type":"object","properties":{"words":{"type":"array","items":{"type":"string"}},"topics":{"type":"array","items":{"type":"string"}}},"required":["words","topics"]}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"422":{"description":"The account's platform session or proxy cannot be used.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's platform session or proxy cannot be used.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message","code"]}}}},"429":{"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. The Mass Message may still have gone out: list the Mass Messages of the account before retrying.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. The Mass Message may still have gone out: list the Mass Messages of the account before retrying.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The send failed or could not be confirmed. Whether the Mass Message went out is unknown — list the account's Mass Messages before retrying, and take a duplicate back while the window allows.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The send failed or could not be confirmed. Whether the Mass Message went out is unknown — list the account's Mass Messages before retrying, and take a duplicate back while the window allows.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Retrieve the Mass Messages of an account

> \*\*Rate limit:\*\* 5 requests per second\
> \
> Pagination is by cursor: set \`to\` to the \`created\_at\` of the last item of the page just read. The cursor has one-second precision — deduplicate by \`id\`.\
> \
> The first page also carries every Mass Message still sending, so it may hold more than \`limit\` items, and it is the only page that carries \`total\`; \`total\` reads \`null\` on every page after it.\
> \
> A Mass Message sent through this API is listed with \`created\_by: null\` and with \`null\` fan lists, paid split and tagged accounts — read it by id for those.\
> \
> \*\*Required permission:\*\* \`mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"mass-messages","description":"Endpoints for sending, listing, reading and unsending the Mass Messages of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/mass-messages":{"get":{"summary":"Retrieve the Mass Messages of an account","tags":["mass-messages"],"description":"**Rate limit:** 5 requests per second\n\nPagination is by cursor: set `to` to the `created_at` of the last item of the page just read. The cursor has one-second precision — deduplicate by `id`.\n\nThe first page also carries every Mass Message still sending, so it may hold more than `limit` items, and it is the only page that carries `total`; `total` reads `null` on every page after it.\n\nA Mass Message sent through this API is listed with `created_by: null` and with `null` fan lists, paid split and tagged accounts — read it by id for those.\n\n**Required permission:** `mass_messages.view`","parameters":[{"schema":{"minimum":1,"maximum":100,"default":50,"type":"integer"},"in":"query","name":"limit","required":false,"description":"Items per page (min: 1, max: 100, default: 50)."},{"schema":{"format":"date-time","type":"string"},"in":"query","name":"to","required":false,"description":"Cursor: the `created_at` of the last item of the previous page."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account whose Mass Messages are addressed."}],"responses":{"200":{"description":"A page of the account's Mass Messages, newest first. The first page also carries every message still sending, so it may hold more than `limit` items.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A page of the account's Mass Messages, newest first. The first page also carries every message still sending, so it may hold more than `limit` items.","type":"object","properties":{"items":{"type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the Mass Message.","type":"string"},"status":{"type":"string","enum":["sending","done","unsent"],"description":"Where the Mass Message stands: `sending` while the platform is still delivering it, `done` once every message has gone out, `unsent` once it has been taken back."},"can_unsend":{"description":"True while the Mass Message can still be taken back.","type":"boolean"},"created_at":{"format":"date-time","description":"When the Mass Message was queued.","type":"string"},"created_by":{"description":"The member who sent the Mass Message. Null when the author is unknown, including every Mass Message sent through this API.","anyOf":[{"type":"null"},{"additionalProperties":false,"type":"object","properties":{"type":{"type":"string","enum":["user"]},"id":{"description":"Identifier of the member.","type":"string"}},"required":["type","id"]}]},"message":{"additionalProperties":false,"description":"The content of a Mass Message.","type":"object","properties":{"text":{"description":"Text the fan receives. Null when the message carries none.","anyOf":[{"type":"null"},{"type":"string"}]},"text_is_paid":{"description":"Whether the text sits behind the paywall. Null when it is not known for this message.","anyOf":[{"type":"null"},{"type":"boolean"}]},"price_gross":{"description":"Price the fan pays for this message, before any platform deduction. Null when it is not known for this message.","anyOf":[{"type":"null"},{"type":"number"}]},"attachments":{"description":"Media attached to the message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio"],"description":"Kind of media attached."},"is_paid":{"description":"Whether the attachment sits behind the paywall. Null when the paid/free split is not known for this message.","anyOf":[{"type":"null"},{"type":"boolean"}]}},"required":["id","type","is_paid"]}},"giphy_id":{"description":"Identifier of the GIF sent with the message. Null when it carries none.","anyOf":[{"type":"null"},{"type":"string"}]},"user_list_ids":{"description":"Fan lists the message was sent to, as identifiers. Null when they are not known for this message.","anyOf":[{"type":"null"},{"type":"array","items":{"type":"string"}}]},"excluded_user_list_ids":{"description":"Fan lists left out of the audience, as identifiers. Null when they are not known for this message.","anyOf":[{"type":"null"},{"type":"array","items":{"type":"string"}}]},"tagged_platform_account_ids":{"description":"Platform accounts tagged in the message. Null when they are not known for this message.","anyOf":[{"type":"null"},{"type":"array","items":{"type":"string"}}]}},"required":["text","text_is_paid","price_gross","attachments","giphy_id","user_list_ids","excluded_user_list_ids","tagged_platform_account_ids"]},"stats":{"additionalProperties":false,"type":"object","properties":{"sent_messages_count":{"description":"Messages the platform has sent.","type":"integer"},"viewed_messages_count":{"description":"Messages a fan has opened.","type":"integer"},"purchased_messages_count":{"description":"Messages a fan has paid for.","type":"integer"},"purchased_amount_gross":{"description":"Price times purchases, before any platform deduction.","type":"number"}},"required":["sent_messages_count","viewed_messages_count","purchased_messages_count","purchased_amount_gross"]}},"required":["id","status","can_unsend","created_at","created_by","message","stats"]}},"has_more":{"description":"True when more Mass Messages exist beyond this page.","type":"boolean"},"total":{"description":"The account's number of Mass Messages. Null on every page after the first.","anyOf":[{"type":"integer"},{"type":"null"}]}},"required":["items","has_more","total"]}}}},"400":{"description":"The request states something this endpoint cannot accept: a query value outside its bounds, or an account that is not an OnlyFans account. A refusal this endpoint decides itself carries no code.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request states something this endpoint cannot accept: a query value outside its bounds, or an account that is not an OnlyFans account. A refusal this endpoint decides itself carries no code.","type":"object","properties":{"message":{"description":"What to change about the request.","type":"string"},"code":{"type":"string","enum":["FACE_VERIFICATION_REQUIRED","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"422":{"description":"The account's platform session or proxy cannot be used.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's platform session or proxy cannot be used.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message","code"]}}}},"429":{"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The request failed for a reason that is not about the request.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason that is not about the request.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```

## Retrieve one Mass Message of an account

> \*\*Rate limit:\*\* 5 requests per second\
> \
> The Mass Message with its fan lists and paid split. It carries no \`status\`, no \`stats\`, no \`created\_at\` and no \`created\_by\` — read those on the list.\
> \
> \*\*Required permission:\*\* \`mass\_messages.view\`

```json
{"openapi":"3.0.0","info":{"title":"om-api-service","version":"0.61.0"},"tags":[{"name":"mass-messages","description":"Endpoints for sending, listing, reading and unsending the Mass Messages of an account."}],"servers":[{"url":"https://omapi.onlymonster.ai","description":"Production"}],"security":[{"ApiToken":[]}],"components":{"securitySchemes":{"ApiToken":{"type":"apiKey","in":"header","name":"x-om-auth-token","description":"API token for authentication"}}},"paths":{"/api/v0/accounts/{account_id}/mass-messages/{mass_message_id}":{"get":{"summary":"Retrieve one Mass Message of an account","tags":["mass-messages"],"description":"**Rate limit:** 5 requests per second\n\nThe Mass Message with its fan lists and paid split. It carries no `status`, no `stats`, no `created_at` and no `created_by` — read those on the list.\n\n**Required permission:** `mass_messages.view`","parameters":[{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"account_id","required":true,"description":"OnlyMonster account the Mass Message belongs to."},{"schema":{"pattern":"^(0|[1-9]\\d*)$","maxLength":19,"type":"string"},"in":"path","name":"mass_message_id","required":true,"description":"Identifier of the Mass Message."}],"responses":{"200":{"description":"One Mass Message of the account, with its fan lists and paid split. It carries no `status`, `stats`, `created_at` or `created_by`.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"One Mass Message of the account, with its fan lists and paid split. It carries no `status`, `stats`, `created_at` or `created_by`.","type":"object","properties":{"id":{"description":"Identifier of the Mass Message.","type":"string"},"account_id":{"description":"OnlyMonster account the Mass Message belongs to.","type":"string"},"message":{"additionalProperties":false,"description":"The content of a Mass Message.","type":"object","properties":{"text":{"description":"Text the fan receives. Null when the message carries none.","anyOf":[{"type":"null"},{"type":"string"}]},"text_is_paid":{"description":"Whether the text sits behind the paywall. Null when it is not known for this message.","anyOf":[{"type":"null"},{"type":"boolean"}]},"price_gross":{"description":"Price the fan pays for this message, before any platform deduction. Null when it is not known for this message.","anyOf":[{"type":"null"},{"type":"number"}]},"attachments":{"description":"Media attached to the message. Empty when it carries none.","type":"array","items":{"additionalProperties":false,"type":"object","properties":{"id":{"description":"Identifier of the media on the platform.","type":"string"},"type":{"type":"string","enum":["image","video","audio"],"description":"Kind of media attached."},"is_paid":{"description":"Whether the attachment sits behind the paywall. Null when the paid/free split is not known for this message.","anyOf":[{"type":"null"},{"type":"boolean"}]}},"required":["id","type","is_paid"]}},"giphy_id":{"description":"Identifier of the GIF sent with the message. Null when it carries none.","anyOf":[{"type":"null"},{"type":"string"}]},"user_list_ids":{"description":"Fan lists the message was sent to, as identifiers. Null when they are not known for this message.","anyOf":[{"type":"null"},{"type":"array","items":{"type":"string"}}]},"excluded_user_list_ids":{"description":"Fan lists left out of the audience, as identifiers. Null when they are not known for this message.","anyOf":[{"type":"null"},{"type":"array","items":{"type":"string"}}]},"tagged_platform_account_ids":{"description":"Platform accounts tagged in the message. Null when they are not known for this message.","anyOf":[{"type":"null"},{"type":"array","items":{"type":"string"}}]}},"required":["text","text_is_paid","price_gross","attachments","giphy_id","user_list_ids","excluded_user_list_ids","tagged_platform_account_ids"]}},"required":["id","account_id","message"]}}}},"400":{"description":"The request states something this endpoint cannot accept: an identifier outside its bounds, or an account that is not an OnlyFans account. A refusal this endpoint decides itself carries no code.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request states something this endpoint cannot accept: an identifier outside its bounds, or an account that is not an OnlyFans account. A refusal this endpoint decides itself carries no code.","type":"object","properties":{"message":{"description":"What to change about the request.","type":"string"},"code":{"type":"string","enum":["FACE_VERIFICATION_REQUIRED","CAMPAIGN_PLATFORM_NOT_SUPPORTED"],"description":"Machine-readable error code, when there is one."}},"required":["message"]}}}},"401":{"description":"The token is missing or invalid.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The token is missing or invalid.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"403":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","content":{"application/json":{"schema":{"description":"The API key lacks the permission this endpoint requires, or the request is outside what the organisation or the API key can access.","anyOf":[{"additionalProperties":false,"description":"The organisation does not own the account, the API key scope does not reach it, or the endpoint is not enabled for the organisation.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]},{"additionalProperties":false,"description":"The API key lacks the permission this endpoint requires.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["API_KEY_PERMISSION_DENIED"]},"details":{"additionalProperties":false,"type":"object","properties":{"required_permission":{"description":"The permission the API key lacks.","type":"string"}},"required":["required_permission"]}},"required":["message","code","details"]}]}}}},"404":{"description":"The Mass Message does not exist for this account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The Mass Message does not exist for this account.","type":"object","properties":{"message":{"type":"string"}},"required":["message"]}}}},"422":{"description":"The account's platform session or proxy cannot be used.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The account's platform session or proxy cannot be used.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"},"code":{"description":"Machine-readable error code.","type":"string","enum":["PLATFORM_ACCOUNT_SESSION_UNAVAILABLE"]}},"required":["message","code"]}}}},"429":{"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"A rate limit was exceeded: the token or per-endpoint limit of this API, or the platform's limit on the account.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"500":{"description":"The request failed for a reason this API does not describe. Repeating it is safe.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason this API does not describe. Repeating it is safe.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}},"502":{"description":"The request failed for a reason that is not about the request.","content":{"application/json":{"schema":{"additionalProperties":false,"description":"The request failed for a reason that is not about the request.","type":"object","properties":{"message":{"description":"Human-readable explanation of the failure.","type":"string"}},"required":["message"]}}}}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.onlymonster.ai/integrations-and-api/openapi.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
