Offer controls, support, and reports API
These routes require a publisher dashboard Authorization: Bearer session and the /publisher/v2 base path. They require both the publisher foundation and offer delivery features. The service scopes each resource to the authenticated publisher. They do not accept the Static API key or SDK session token.
Blacklists
| Method and path | Input | Success |
|---|---|---|
GET /blacklists | None | 200 {items,count} including inactive records. |
POST /blacklists | JSON kind, value, reason; optional placementId, adSlotId. | 201 created or reactivated blacklist. |
DELETE /blacklists/{blacklistId} | Reason in JSON body or ?reason=. | 204 and deactivated record. |
kind is CAMPAIGN or PROVIDER. value is the campaign ID or provider code, normalized to uppercase and limited to 2–128 letters, digits, underscores, or dashes. reason is 3–240 characters. If adSlotId is provided, it must belong to the authenticated publisher and any supplied placement. Omitting both IDs applies the control to all that publisher's Offers V2 inventory.
POST /publisher/v2/blacklists
Authorization: Bearer DASHBOARD_TOKEN
Content-Type: application/json
{"placementId":"PLACEMENT_ID","adSlotId":"SLOT_ID","kind":"CAMPAIGN","value":"CAMPAIGN_ID","reason":"Not suitable for this rewards tab"}
User bans
| Method and path | Input | Success |
|---|---|---|
GET /user-bans | None | 200 {items,count}, without the stored user hash. |
POST /user-bans | JSON externalUserId, reason; optional placementId, future expiresAt. | 201 created or reactivated ban. |
PATCH /user-bans/{banId} | JSON active, reason, and/or expiresAt (null clears expiry). | 200 updated ban. |
externalUserId is 1–128 characters and must match the identifier passed to the user's SDK session. A placement-scoped ban applies only to that placement. The create operation is an upsert for the same publisher, scope, and user. A reason is required for creation and for any updated reason.
Offer gallery and support
| Method and path | Input | Success |
|---|---|---|
GET /offer-gallery | Required placementId, adSlotId; optional two-letter country, compatible platform. | 200 current matching offer feed for an owned OFFERWALL or OFFER_API slot. |
GET /support-cases | Optional status. | 200 {items,count} of up to 100 latest cases. |
PATCH /support-cases/{supportCaseId} | JSON status, reason. | 200 updated case. |
Publisher support status may be changed to IN_REVIEW, RESOLVED, or CLOSED; the reason must be 3–240 characters. The user creates cases through the SDK support API. The publisher list strips evidence storage keys. Do not build a client upload flow for production: the current SDK evidence route rejects production uploads.
Publisher report
GET /reports/offers returns JSON metrics, rewards (count, payoutMicros), freshnessWatermark, and reconciliation (ledgerPayoutMicros, rewardPayoutMicros, differenceMicros, exact). GET /reports/offers?format=csv returns a CSV attachment with the reward and ledger totals. This report is scoped to the signed-in publisher and counts settled rewards. The freshness watermark describes the latest analytics event, not a guarantee that every callback has delivered.
{
"metrics": {"IMPRESSION": 12, "LAUNCH_RESERVED": 3},
"rewards": {"count": 1, "payoutMicros": 750000},
"freshnessWatermark": "2026-09-29T08:00:00.000Z",
"reconciliation": {
"ledgerPayoutMicros": 750000,
"rewardPayoutMicros": 750000,
"differenceMicros": 0,
"exact": true
}
}
The exact metric keys depend on events emitted for that publisher. Use callback deliveries to investigate missing credits, and errors for authentication and feature-gate responses. The publisher route for /reports/rewarded-video is a separate product and is outside this Offers V2 reference.