# info.description
Clickwise is a meta affiliate network: one panel that aggregates programs from many upstream networks (Awin, Tradedoubler, Lomadee, Partnerize, ShareASale, Webgains, …). This API lets merchants, affiliates, managers, and AI agents read campaigns, programs, applications, transactions, payments, and curated insights, and write through gated endpoints.

See also: https://r2.clickwise.net/llms.txt — single-file LLM brief. OpenAPI JSON: https://r2.clickwise.net/api/v1/openapi.json.

# paths./api/v1/affiliate-categories/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/affiliate-categories/{id}/.get.parameters[].description
A unique integer value identifying this affiliate_ category.

# paths./api/v1/affiliate-categories/{id}/.put.parameters[].description
A unique integer value identifying this affiliate_ category.

# paths./api/v1/affiliate-categories/{id}/.patch.parameters[].description
A unique integer value identifying this affiliate_ category.

# paths./api/v1/affiliate-categories/{id}/.delete.parameters[].description
A unique integer value identifying this affiliate_ category.

# paths./api/v1/affiliate-ledger/.get.description
The unified commission ledger: entries + an FX-safe rollup.

GET params: ?network= ?status= ?limit= (default 200, max 1000)
?affiliate_id= (full-read only).

# paths./api/v1/affiliate-network-integrations/.get.description
Affiliates manage their own connections; full-read roles see all.

# paths./api/v1/affiliate-network-integrations/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/affiliate-network-integrations/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/affiliate-network-integrations/.post.description
Affiliates manage their own connections; full-read roles see all.

# paths./api/v1/affiliate-network-integrations/{id}/.get.description
Affiliates manage their own connections; full-read roles see all.

# paths./api/v1/affiliate-network-integrations/{id}/.get.parameters[].description
A unique integer value identifying this affiliate network integration.

# paths./api/v1/affiliate-network-integrations/{id}/.put.description
Affiliates manage their own connections; full-read roles see all.

# paths./api/v1/affiliate-network-integrations/{id}/.put.parameters[].description
A unique integer value identifying this affiliate network integration.

# paths./api/v1/affiliate-network-integrations/{id}/.patch.description
Affiliates manage their own connections; full-read roles see all.

# paths./api/v1/affiliate-network-integrations/{id}/.patch.parameters[].description
A unique integer value identifying this affiliate network integration.

# paths./api/v1/affiliate-network-integrations/{id}/.delete.description
Affiliates manage their own connections; full-read roles see all.

# paths./api/v1/affiliate-network-integrations/{id}/.delete.parameters[].description
A unique integer value identifying this affiliate network integration.

# paths./api/v1/affiliate-network-integrations/{id}/sync/.post.description
Pull this integration's transactions into the unified ledger.

# paths./api/v1/affiliate-network-integrations/{id}/sync/.post.parameters[].description
A unique integer value identifying this affiliate network integration.

# paths./api/v1/affiliate-network-integrations/{id}/test/.post.description
Real auth check: one authenticated request to the network. Unlike a
parse-only stub, an invalid key reports as invalid.

# paths./api/v1/affiliate-network-integrations/{id}/test/.post.parameters[].description
A unique integer value identifying this affiliate network integration.

# paths./api/v1/affiliate-network-integrations/networks/.get.description
Server-authoritative network + per-network credential-field map for
the paste form.

# paths./api/v1/affiliate-portal/dashboard/.get.description
Affiliate-facing dashboard widgets.

Returns the affiliate's own balance, EPC, conv breakdown, top campaigns,
and a 7-day commission trend — all scoped to their RefId. Built on top of
the existing cw-api proxy (sales + clicks per day) plus the panel DB.

# paths./api/v1/affiliate-portal/growth-recommendations/.get.description
Surface Growth Agent / launch plans relevant to the resolved affiliate.

Read-only. Each item points at programs the affiliate can already take
action on (via the existing AffiliatePortalLinkView) plus pipeline programs
waiting for application. Never sends email.

# paths./api/v1/affiliate-portal/links-performance/.get.description
Per-link performance for the calling affiliate.

Walks the affiliate's recent Deeplinks + asks cw-api per-link aggregates.
Returns one row per link with clicks, conversions, commission, EPC.
Sortable client-side.

# paths./api/v1/affiliate-reporting/api-token/.get.description
GET → the caller's Bearer token (created on first call). POST → rotate it.
Send ``Authorization: Bearer <token>`` on every reporting request.

# paths./api/v1/affiliate-reporting/api-token/.post.description
GET → the caller's Bearer token (created on first call). POST → rotate it.
Send ``Authorization: Bearer <token>`` on every reporting request.

# paths./api/v1/affiliate-reporting/apply/.post.description
POST /api/v1/affiliate-reporting/apply/ {campaign_id} — apply to any
active Clickwise campaign. Gemini quick-reviews the fit and either approves
(activates the assignment) or asks for more info; never hard-declines.

# paths./api/v1/affiliate-reporting/campaigns/.get.description
GET /api/v1/affiliate-reporting/campaigns/ — live campaigns assigned to
the authenticated affiliate, with their approved upstream program/link
readiness. This is read-only: external affiliates cannot create Clickwise
campaigns through the reporting API.

# paths./api/v1/affiliate-reporting/clicks/.get.description
GET /api/v1/affiliate-reporting/clicks/ — native click stream.

First-party, affiliate-scoped: reads v2-native `TrackingClick` rows minted
by `DeeplinkRedirectView` (cwclk), filtered hard by the calling affiliate's
own FK — never the staff-scoped cw-api `/clicks/raw` proxy (that path was
an IDOR risk and stays unused here). Network-link campaigns whose clicks
happen upstream (e.g. Admitad sub_ids) won't appear — only clicks on our
own /dl/ redirects do.

# paths./api/v1/affiliate-reporting/health/.get.description
Staff-only health for the self-serve affiliate reporting pipeline.

# paths./api/v1/affiliate-reporting/joinable/.get.description
GET /api/v1/affiliate-reporting/joinable/ — ALL active Clickwise
campaigns the affiliate is NOT already assigned to, so they can apply to
any program in the v2 catalog (not just the ones a manager assigned).

# paths./api/v1/affiliate-reporting/links/.get.description
GET lists this affiliate's Clickwise deeplinks. POST creates/returns an
idempotent Clickwise redirect for an assigned campaign + subid.

# paths./api/v1/affiliate-reporting/links/.post.description
GET lists this affiliate's Clickwise deeplinks. POST creates/returns an
idempotent Clickwise redirect for an assigned campaign + subid.

# paths./api/v1/affiliate-reporting/sales/.get.description
GET /api/v1/affiliate-reporting/sales/ — the affiliate's commissions from
the unified network ledger, filterable by date_from/date_to/status/network/
subid/merchant, paginated, with FX-safe USD totals.

# paths./api/v1/affiliate-reporting/sales/export/.get.description
GET /api/v1/affiliate-reporting/sales/export/ — same filters as /sales/,
streamed as CSV.

# paths./api/v1/affiliate-reporting/summary/.get.description
GET /api/v1/affiliate-reporting/summary/ — optimization rollup of the
ledger grouped by `group_by` (subid|network|campaign|status), each with sale
count + FX-safe USD revenue. The view an affiliate uses to pause losers /
scale winners per Yandex campaign (subid).

# paths./api/v1/affiliates/.get.description
CRUD for affiliates.

list:   GET  /api/v1/affiliates/
create: POST /api/v1/affiliates/
read:   GET  /api/v1/affiliates/{id}/
update: PUT/PATCH /api/v1/affiliates/{id}/
delete: DELETE /api/v1/affiliates/{id}/ (soft-delete)

# paths./api/v1/affiliates/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/affiliates/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/affiliates/.post.description
CRUD for affiliates.

list:   GET  /api/v1/affiliates/
create: POST /api/v1/affiliates/
read:   GET  /api/v1/affiliates/{id}/
update: PUT/PATCH /api/v1/affiliates/{id}/
delete: DELETE /api/v1/affiliates/{id}/ (soft-delete)

# paths./api/v1/affiliates/{id}/.get.description
CRUD for affiliates.

list:   GET  /api/v1/affiliates/
create: POST /api/v1/affiliates/
read:   GET  /api/v1/affiliates/{id}/
update: PUT/PATCH /api/v1/affiliates/{id}/
delete: DELETE /api/v1/affiliates/{id}/ (soft-delete)

# paths./api/v1/affiliates/{id}/.get.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/affiliates/{id}/.put.description
CRUD for affiliates.

list:   GET  /api/v1/affiliates/
create: POST /api/v1/affiliates/
read:   GET  /api/v1/affiliates/{id}/
update: PUT/PATCH /api/v1/affiliates/{id}/
delete: DELETE /api/v1/affiliates/{id}/ (soft-delete)

# paths./api/v1/affiliates/{id}/.put.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/affiliates/{id}/.patch.description
CRUD for affiliates.

list:   GET  /api/v1/affiliates/
create: POST /api/v1/affiliates/
read:   GET  /api/v1/affiliates/{id}/
update: PUT/PATCH /api/v1/affiliates/{id}/
delete: DELETE /api/v1/affiliates/{id}/ (soft-delete)

# paths./api/v1/affiliates/{id}/.patch.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/affiliates/{id}/.delete.description
CRUD for affiliates.

list:   GET  /api/v1/affiliates/
create: POST /api/v1/affiliates/
read:   GET  /api/v1/affiliates/{id}/
update: PUT/PATCH /api/v1/affiliates/{id}/
delete: DELETE /api/v1/affiliates/{id}/ (soft-delete)

# paths./api/v1/affiliates/{id}/.delete.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/affiliates/{id}/api_key/.get.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/affiliates/{id}/campaigns/.get.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/affiliates/{id}/stats/.get.description
GET /api/v1/affiliates/{id}/stats/ — proxy to CW API.

# paths./api/v1/affiliates/{id}/stats/.get.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/affiliates/{id}/transactions/.get.description
GET /api/v1/affiliates/{id}/transactions/ — proxy to CW API.

# paths./api/v1/affiliates/{id}/transactions/.get.parameters[].description
A unique integer value identifying this affiliate.

# paths./api/v1/ai/analyze/.post.description
POST /api/v1/ai/analyze/

AI-powered analysis of specific data. Can analyze campaigns,
affiliates, transactions, or custom datasets.

Request body:
    {
        "type": "campaign",
        "data": {...}
    }

# paths./api/v1/ai/chat/.post.description
POST /api/v1/ai/chat/

Conversational AI for the panel. Send questions about campaigns,
affiliates, performance, etc.

Request body:
    {
        "question": "How are campaigns performing this month?",
        "context": {"page": "dashboard"}
    }

# paths./api/v1/ai/creatives-filter/.post.description
POST /api/v1/ai/creatives-filter/

Natural-language -> creatives filter plan. The user types e.g. "French
300x250 banners for Iberia" and Gemini returns a whitelisted {filters, sort,
columns} plan the creatives grid applies. Read-only: every key is validated
against the whitelist; the grid still performs the scoped data query.

# paths./api/v1/ai/report-query/.post.description
POST /api/v1/ai/report-query/

Read-only natural-language transaction report planner. Gemini can suggest
filters, sorting, and visible columns, but all keys are whitelisted and the
reports API still performs the data query with tenant scoping.

# paths./api/v1/ai/suggest/.post.description
POST /api/v1/ai/suggest/

AI-powered smart search. Understands natural language queries
and returns structured filters and recommendations.

Request body:
    {
        "query": "top performing campaigns in UAE",
        "entity_type": "campaign"
    }

# paths./api/v1/anomalies/.get.description
Anomaly alerts created by the detect_anomalies Celery task.

# paths./api/v1/anomalies/.get.parameters[].description
* `commission_spike` - Commission Spike
* `high_value_order` - High Value Order
* `duplicate_order` - Duplicate Order ID
* `conversion_lag` - Suspicious Conversion Lag
* `margin_squeeze` - Margin Squeeze
* `low_conversion` - Low Conversion Rate

# paths./api/v1/anomalies/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/anomalies/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/anomalies/.get.parameters[].description
* `low` - Low
* `medium` - Medium
* `high` - High
* `critical` - Critical

# paths./api/v1/anomalies/{id}/.get.description
Anomaly alerts created by the detect_anomalies Celery task.

# paths./api/v1/anomalies/{id}/.get.parameters[].description
A unique integer value identifying this Anomaly Alert.

# paths./api/v1/anomalies/{id}/resolve/.post.description
Anomaly alerts created by the detect_anomalies Celery task.

# paths./api/v1/anomalies/{id}/resolve/.post.parameters[].description
A unique integer value identifying this Anomaly Alert.

# paths./api/v1/anomalies/summary/.get.description
Anomaly alerts created by the detect_anomalies Celery task.

# paths./api/v1/applications/.get.description
Affiliates see own applications; managers see all.

# paths./api/v1/applications/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/applications/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/applications/{id}/.get.description
Affiliates see own applications; managers see all.

# paths./api/v1/applications/{id}/decision/.post.description
Affiliates see own applications; managers see all.

# paths./api/v1/assistant/act/.post.description
Chat turn for the role-aware agentic assistant.

POST {message, history?} -> {reply, role, executed?, proposed_action?}.
ANY authenticated user — the catalog is scoped to their role server-side
(manager/finance/account/affiliate/merchant). Read actions run inline;
mutating actions come back as a proposal confirmed via AssistantConfirmView.

# paths./api/v1/assistant/confirm/.post.description
Execute a previously proposed mutating assistant action.

# paths./api/v1/audit-logs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/audit-logs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/audit-logs/{id}/.get.parameters[].description
A unique integer value identifying this audit log.

# paths./api/v1/auth/2fa/login/verify/.post.description
Verify a login challenge and issue the API token.

# paths./api/v1/auth/api-token/.get.description
GET → return current API token (creates one if missing).
POST → rotate (replace existing).

Available to any authenticated user — most relevant for merchants
who want to script against their own data via the public API.

# paths./api/v1/auth/api-token/.post.description
GET → return current API token (creates one if missing).
POST → rotate (replace existing).

Available to any authenticated user — most relevant for merchants
who want to script against their own data via the public API.

# paths./api/v1/auth/google/.post.description
Google OAuth login - validates Google ID token and returns session.

# paths./api/v1/auth/google/link/.post.description
Attach a verified Google identity to the currently signed-in account.

# paths./api/v1/auth/google/start/.get.description
Browser redirect flow for Google login/linking.

The GSI iframe is sensitive to Google-side origin config. This flow uses
the standard OAuth authorization-code redirect and works from the v2 panel
without exposing the client secret to React.

# paths./api/v1/auth/login-as/.get.description
POST {username} → impersonate; GET → current state.

# paths./api/v1/auth/login-as/.post.description
POST {username} → impersonate; GET → current state.

# paths./api/v1/auth/me/.patch.description
Update current user preferences (Lang, Time_Zone, Preference).

# paths./api/v1/auth/shell/.get.description
Lightweight shell bootstrap for modern React pages.

# paths./api/v1/automation/.get.description
GET  /api/v1/automation/  → list every automation stream + run history.
PATCH /api/v1/automation/  → update one stream's control fields (by `key`).

# paths./api/v1/automation/.patch.description
GET  /api/v1/automation/  → list every automation stream + run history.
PATCH /api/v1/automation/  → update one stream's control fields (by `key`).

# paths./api/v1/campaign-affiliates/.get.description
Read-only master list of campaign↔affiliate assignments.

Surfaces the relationship-level fields v1 had (channel, email, URL,
add date, status) so managers can scan/search across all campaigns
without drilling in. v2-only and DB-driven; does not call cw-api.

# paths./api/v1/campaign-affiliates/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/campaign-affiliates/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/campaign-affiliates/{id}/.get.description
Read-only master list of campaign↔affiliate assignments.

Surfaces the relationship-level fields v1 had (channel, email, URL,
add date, status) so managers can scan/search across all campaigns
without drilling in. v2-only and DB-driven; does not call cw-api.

# paths./api/v1/campaign-affiliates/{id}/.get.parameters[].description
A unique integer value identifying this campaign assign affiliate.

# paths./api/v1/campaign-assignments/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/campaign-assignments/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/campaign-assignments/{id}/.get.parameters[].description
A unique integer value identifying this campaign assign affiliate.

# paths./api/v1/campaign-assignments/{id}/.put.parameters[].description
A unique integer value identifying this campaign assign affiliate.

# paths./api/v1/campaign-assignments/{id}/.patch.parameters[].description
A unique integer value identifying this campaign assign affiliate.

# paths./api/v1/campaign-assignments/{id}/.delete.parameters[].description
A unique integer value identifying this campaign assign affiliate.

# paths./api/v1/campaign-categories/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/campaign-categories/{id}/.get.parameters[].description
A unique integer value identifying this campaign_ category.

# paths./api/v1/campaign-categories/{id}/.put.parameters[].description
A unique integer value identifying this campaign_ category.

# paths./api/v1/campaign-categories/{id}/.patch.parameters[].description
A unique integer value identifying this campaign_ category.

# paths./api/v1/campaign-categories/{id}/.delete.parameters[].description
A unique integer value identifying this campaign_ category.

# paths./api/v1/campaign-integrations/.get.description
Manage tracking integration metadata per CW campaign.

v2-only. Reading is open to anyone with CanViewCampaigns. PATCH writes
`manager_confirmed` so subsequent re-seeds from v1 do not overwrite the
edit. Never writes to v1.

# paths./api/v1/campaign-integrations/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/campaign-integrations/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/campaign-integrations/{id}/.get.description
Manage tracking integration metadata per CW campaign.

v2-only. Reading is open to anyone with CanViewCampaigns. PATCH writes
`manager_confirmed` so subsequent re-seeds from v1 do not overwrite the
edit. Never writes to v1.

# paths./api/v1/campaign-integrations/{id}/.get.parameters[].description
A unique integer value identifying this campaign integration.

# paths./api/v1/campaign-integrations/{id}/.patch.description
Manage tracking integration metadata per CW campaign.

v2-only. Reading is open to anyone with CanViewCampaigns. PATCH writes
`manager_confirmed` so subsequent re-seeds from v1 do not overwrite the
edit. Never writes to v1.

# paths./api/v1/campaign-integrations/{id}/.patch.parameters[].description
A unique integer value identifying this campaign integration.

# paths./api/v1/campaign-tracking-pixels/.get.description
Manage v2 pixel/postback configs per campaign.

Lets managers create the spec to send to a merchant (Kiwi etc.), see
incoming fires, and toggle disable. v2-only — does not write to v1.

# paths./api/v1/campaign-tracking-pixels/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/campaign-tracking-pixels/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/campaign-tracking-pixels/.post.description
Manage v2 pixel/postback configs per campaign.

Lets managers create the spec to send to a merchant (Kiwi etc.), see
incoming fires, and toggle disable. v2-only — does not write to v1.

# paths./api/v1/campaign-tracking-pixels/{id}/.get.description
Manage v2 pixel/postback configs per campaign.

Lets managers create the spec to send to a merchant (Kiwi etc.), see
incoming fires, and toggle disable. v2-only — does not write to v1.

# paths./api/v1/campaign-tracking-pixels/{id}/.get.parameters[].description
A unique integer value identifying this campaign tracking pixel.

# paths./api/v1/campaign-tracking-pixels/{id}/.put.description
Manage v2 pixel/postback configs per campaign.

Lets managers create the spec to send to a merchant (Kiwi etc.), see
incoming fires, and toggle disable. v2-only — does not write to v1.

# paths./api/v1/campaign-tracking-pixels/{id}/.put.parameters[].description
A unique integer value identifying this campaign tracking pixel.

# paths./api/v1/campaign-tracking-pixels/{id}/.patch.description
Manage v2 pixel/postback configs per campaign.

Lets managers create the spec to send to a merchant (Kiwi etc.), see
incoming fires, and toggle disable. v2-only — does not write to v1.

# paths./api/v1/campaign-tracking-pixels/{id}/.patch.parameters[].description
A unique integer value identifying this campaign tracking pixel.

# paths./api/v1/campaign-tracking-pixels/{id}/.delete.description
Manage v2 pixel/postback configs per campaign.

Lets managers create the spec to send to a merchant (Kiwi etc.), see
incoming fires, and toggle disable. v2-only — does not write to v1.

# paths./api/v1/campaign-tracking-pixels/{id}/.delete.parameters[].description
A unique integer value identifying this campaign tracking pixel.

# paths./api/v1/campaign-tracking-pixels/{id}/fires/.get.description
Manage v2 pixel/postback configs per campaign.

Lets managers create the spec to send to a merchant (Kiwi etc.), see
incoming fires, and toggle disable. v2-only — does not write to v1.

# paths./api/v1/campaign-tracking-pixels/{id}/fires/.get.parameters[].description
A unique integer value identifying this campaign tracking pixel.

# paths./api/v1/campaigns/.get.description
CRUD for campaigns.

list:   GET  /api/v1/campaigns/
create: POST /api/v1/campaigns/
read:   GET  /api/v1/campaigns/{id}/
update: PUT/PATCH /api/v1/campaigns/{id}/
delete: DELETE /api/v1/campaigns/{id}/ (soft-delete)

# paths./api/v1/campaigns/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/campaigns/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/campaigns/.post.description
CRUD for campaigns.

list:   GET  /api/v1/campaigns/
create: POST /api/v1/campaigns/
read:   GET  /api/v1/campaigns/{id}/
update: PUT/PATCH /api/v1/campaigns/{id}/
delete: DELETE /api/v1/campaigns/{id}/ (soft-delete)

# paths./api/v1/campaigns/{campaign_id}/queries/.get.description
Affiliate submits a question; lists are role-aware.

# paths./api/v1/campaigns/{campaign_id}/queries/.post.description
Affiliate submits a question; lists are role-aware.

# paths./api/v1/campaigns/{id}/.get.description
CRUD for campaigns.

list:   GET  /api/v1/campaigns/
create: POST /api/v1/campaigns/
read:   GET  /api/v1/campaigns/{id}/
update: PUT/PATCH /api/v1/campaigns/{id}/
delete: DELETE /api/v1/campaigns/{id}/ (soft-delete)

# paths./api/v1/campaigns/{id}/.get.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/.put.description
CRUD for campaigns.

list:   GET  /api/v1/campaigns/
create: POST /api/v1/campaigns/
read:   GET  /api/v1/campaigns/{id}/
update: PUT/PATCH /api/v1/campaigns/{id}/
delete: DELETE /api/v1/campaigns/{id}/ (soft-delete)

# paths./api/v1/campaigns/{id}/.put.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/.patch.description
CRUD for campaigns.

list:   GET  /api/v1/campaigns/
create: POST /api/v1/campaigns/
read:   GET  /api/v1/campaigns/{id}/
update: PUT/PATCH /api/v1/campaigns/{id}/
delete: DELETE /api/v1/campaigns/{id}/ (soft-delete)

# paths./api/v1/campaigns/{id}/.patch.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/.delete.description
CRUD for campaigns.

list:   GET  /api/v1/campaigns/
create: POST /api/v1/campaigns/
read:   GET  /api/v1/campaigns/{id}/
update: PUT/PATCH /api/v1/campaigns/{id}/
delete: DELETE /api/v1/campaigns/{id}/ (soft-delete)

# paths./api/v1/campaigns/{id}/.delete.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/affiliates/.get.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/default_payouts/.get.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/payouts/.get.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/stats/.get.description
GET /api/v1/campaigns/{id}/stats/ — proxy to CW API.

# paths./api/v1/campaigns/{id}/stats/.get.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/campaigns/{id}/transactions/.get.description
GET /api/v1/campaigns/{id}/transactions/ — proxy to CW API.

# paths./api/v1/campaigns/{id}/transactions/.get.parameters[].description
A unique integer value identifying this campaign.

# paths./api/v1/clicks/.get.description
GET /api/v1/clicks/
Proxy to CW API /api/v1/clicks/summary.

Query params: campaign_id, affiliate_id, date_from, date_to, group_by

# paths./api/v1/clicks/export.csv.get.description
Stream raw click CSV with v1 fields plus v2 metadata/visible columns.

# paths./api/v1/clicks/health/.get.description
Local operational freshness for v1-mirrored and v2-native click data.

# paths./api/v1/clicks/parity/.get.description
GET /api/v1/clicks/parity/
Read-only v1/v2 click comparison. It never changes the active click source.

# paths./api/v1/clicks/raw/.get.description
GET /api/v1/clicks/raw/
V2 raw click report proxy. Returns v1-equivalent fields plus v2 metadata.

# paths./api/v1/countries/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/countries/{id}/.get.parameters[].description
A unique integer value identifying this country.

# paths./api/v1/creatives/all-banners/.get.description
Unified, filterable banner index across BOTH banner sources:
  - legacy CW `Banner` rows (editable; manual or network-synced)
  - catalog `AggregatedProgramCreative` banners (network-imported)

Normalized to one shape so the panel renders + bulk-acts on every banner.
Read-only. Bulk Clickwise-link generation reuses the existing per-item
endpoints (legacy: banner-items/<id>/generate-link/, catalog: network-link/),
so this view never mints links itself.

# paths./api/v1/creatives/banner-items/.get.description
CRUD for individual banners (image creatives).

list:    GET    /api/v1/creatives/banner-items/
create:  POST   /api/v1/creatives/banner-items/
read:    GET    /api/v1/creatives/banner-items/{id}/
update:  PATCH  /api/v1/creatives/banner-items/{id}/
delete:  DELETE /api/v1/creatives/banner-items/{id}/  (soft-delete)

# paths./api/v1/creatives/banner-items/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/banner-items/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/banner-items/.post.description
CRUD for individual banners (image creatives).

list:    GET    /api/v1/creatives/banner-items/
create:  POST   /api/v1/creatives/banner-items/
read:    GET    /api/v1/creatives/banner-items/{id}/
update:  PATCH  /api/v1/creatives/banner-items/{id}/
delete:  DELETE /api/v1/creatives/banner-items/{id}/  (soft-delete)

# paths./api/v1/creatives/banner-items/{id}/.get.description
CRUD for individual banners (image creatives).

list:    GET    /api/v1/creatives/banner-items/
create:  POST   /api/v1/creatives/banner-items/
read:    GET    /api/v1/creatives/banner-items/{id}/
update:  PATCH  /api/v1/creatives/banner-items/{id}/
delete:  DELETE /api/v1/creatives/banner-items/{id}/  (soft-delete)

# paths./api/v1/creatives/banner-items/{id}/.get.parameters[].description
A unique integer value identifying this banner.

# paths./api/v1/creatives/banner-items/{id}/.put.description
CRUD for individual banners (image creatives).

list:    GET    /api/v1/creatives/banner-items/
create:  POST   /api/v1/creatives/banner-items/
read:    GET    /api/v1/creatives/banner-items/{id}/
update:  PATCH  /api/v1/creatives/banner-items/{id}/
delete:  DELETE /api/v1/creatives/banner-items/{id}/  (soft-delete)

# paths./api/v1/creatives/banner-items/{id}/.put.parameters[].description
A unique integer value identifying this banner.

# paths./api/v1/creatives/banner-items/{id}/.patch.description
CRUD for individual banners (image creatives).

list:    GET    /api/v1/creatives/banner-items/
create:  POST   /api/v1/creatives/banner-items/
read:    GET    /api/v1/creatives/banner-items/{id}/
update:  PATCH  /api/v1/creatives/banner-items/{id}/
delete:  DELETE /api/v1/creatives/banner-items/{id}/  (soft-delete)

# paths./api/v1/creatives/banner-items/{id}/.patch.parameters[].description
A unique integer value identifying this banner.

# paths./api/v1/creatives/banner-items/{id}/.delete.description
CRUD for individual banners (image creatives).

list:    GET    /api/v1/creatives/banner-items/
create:  POST   /api/v1/creatives/banner-items/
read:    GET    /api/v1/creatives/banner-items/{id}/
update:  PATCH  /api/v1/creatives/banner-items/{id}/
delete:  DELETE /api/v1/creatives/banner-items/{id}/  (soft-delete)

# paths./api/v1/creatives/banner-items/{id}/.delete.parameters[].description
A unique integer value identifying this banner.

# paths./api/v1/creatives/banner-items/{id}/generate-link/.post.parameters[].description
A unique integer value identifying this banner.

# paths./api/v1/creatives/banner-items/upload-image/.post.description
Accept a multipart image upload, write to GCS, return public URL.

POST /api/v1/creatives/banner-items/upload-image/
multipart fields:
  file: <image>
  banner_id: (optional) — if given, sets Banner.Img immediately

# paths./api/v1/creatives/banners/.get.description
Banner sets with nested banners.

list:    GET    /api/v1/creatives/banners/
create:  POST   /api/v1/creatives/banners/
read:    GET    /api/v1/creatives/banners/{id}/
update:  PATCH  /api/v1/creatives/banners/{id}/
delete:  DELETE /api/v1/creatives/banners/{id}/  (soft-delete)

# paths./api/v1/creatives/banners/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/banners/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/banners/.post.description
Banner sets with nested banners.

list:    GET    /api/v1/creatives/banners/
create:  POST   /api/v1/creatives/banners/
read:    GET    /api/v1/creatives/banners/{id}/
update:  PATCH  /api/v1/creatives/banners/{id}/
delete:  DELETE /api/v1/creatives/banners/{id}/  (soft-delete)

# paths./api/v1/creatives/banners/{id}/.get.description
Banner sets with nested banners.

list:    GET    /api/v1/creatives/banners/
create:  POST   /api/v1/creatives/banners/
read:    GET    /api/v1/creatives/banners/{id}/
update:  PATCH  /api/v1/creatives/banners/{id}/
delete:  DELETE /api/v1/creatives/banners/{id}/  (soft-delete)

# paths./api/v1/creatives/banners/{id}/.get.parameters[].description
A unique integer value identifying this banner_ set.

# paths./api/v1/creatives/banners/{id}/.put.description
Banner sets with nested banners.

list:    GET    /api/v1/creatives/banners/
create:  POST   /api/v1/creatives/banners/
read:    GET    /api/v1/creatives/banners/{id}/
update:  PATCH  /api/v1/creatives/banners/{id}/
delete:  DELETE /api/v1/creatives/banners/{id}/  (soft-delete)

# paths./api/v1/creatives/banners/{id}/.put.parameters[].description
A unique integer value identifying this banner_ set.

# paths./api/v1/creatives/banners/{id}/.patch.description
Banner sets with nested banners.

list:    GET    /api/v1/creatives/banners/
create:  POST   /api/v1/creatives/banners/
read:    GET    /api/v1/creatives/banners/{id}/
update:  PATCH  /api/v1/creatives/banners/{id}/
delete:  DELETE /api/v1/creatives/banners/{id}/  (soft-delete)

# paths./api/v1/creatives/banners/{id}/.patch.parameters[].description
A unique integer value identifying this banner_ set.

# paths./api/v1/creatives/banners/{id}/.delete.description
Banner sets with nested banners.

list:    GET    /api/v1/creatives/banners/
create:  POST   /api/v1/creatives/banners/
read:    GET    /api/v1/creatives/banners/{id}/
update:  PATCH  /api/v1/creatives/banners/{id}/
delete:  DELETE /api/v1/creatives/banners/{id}/  (soft-delete)

# paths./api/v1/creatives/banners/{id}/.delete.parameters[].description
A unique integer value identifying this banner_ set.

# paths./api/v1/creatives/banners/{id}/banners/.get.parameters[].description
A unique integer value identifying this banner_ set.

# paths./api/v1/creatives/banners/produce-ai/.post.description
Generate AI display banners ("Nano Banana") for a campaign's program.

POST /api/v1/creatives/banners/produce-ai/
  {"campaign_id": <pk or CampaignId>, "force": false,
   "model": "<image model>", "sizes": ["300x250","728x90"]}

Admin only. Reads the program package off the merchant's onboarding
application (or synthesizes one) and writes a Banner_Set + Banners on the
campaign. Writes only to v2 (GCS media + creatives tables).

# paths./api/v1/creatives/coupons/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/coupons/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/coupons/{id}/.get.parameters[].description
A unique integer value identifying this coupon_ set.

# paths./api/v1/creatives/coupons/{id}/.put.parameters[].description
A unique integer value identifying this coupon_ set.

# paths./api/v1/creatives/coupons/{id}/.patch.parameters[].description
A unique integer value identifying this coupon_ set.

# paths./api/v1/creatives/coupons/{id}/.delete.parameters[].description
A unique integer value identifying this coupon_ set.

# paths./api/v1/creatives/coupons/{id}/coupons/.get.parameters[].description
A unique integer value identifying this coupon_ set.

# paths./api/v1/creatives/deeplink-auto-config/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/deeplink-auto-config/{id}/.get.parameters[].description
A unique integer value identifying this deeplink_ auto_ config.

# paths./api/v1/creatives/deeplink-auto-config/{id}/.put.parameters[].description
A unique integer value identifying this deeplink_ auto_ config.

# paths./api/v1/creatives/deeplink-auto-config/{id}/.patch.parameters[].description
A unique integer value identifying this deeplink_ auto_ config.

# paths./api/v1/creatives/deeplink-auto-config/{id}/.delete.parameters[].description
A unique integer value identifying this deeplink_ auto_ config.

# paths./api/v1/creatives/deeplink-configs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/deeplink-configs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/deeplink-configs/{id}/.get.parameters[].description
A unique integer value identifying this deeplink_ config.

# paths./api/v1/creatives/deeplink-configs/{id}/.put.parameters[].description
A unique integer value identifying this deeplink_ config.

# paths./api/v1/creatives/deeplink-configs/{id}/.patch.parameters[].description
A unique integer value identifying this deeplink_ config.

# paths./api/v1/creatives/deeplink-configs/{id}/.delete.parameters[].description
A unique integer value identifying this deeplink_ config.

# paths./api/v1/creatives/deeplinks/.get.description
CRUD for deeplinks.

list:   GET  /api/v1/creatives/deeplinks/
create: POST /api/v1/creatives/deeplinks/
read:   GET  /api/v1/creatives/deeplinks/{id}/
update: PATCH /api/v1/creatives/deeplinks/{id}/
delete: DELETE /api/v1/creatives/deeplinks/{id}/ (soft-delete)

# paths./api/v1/creatives/deeplinks/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/deeplinks/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/deeplinks/.post.description
CRUD for deeplinks.

list:   GET  /api/v1/creatives/deeplinks/
create: POST /api/v1/creatives/deeplinks/
read:   GET  /api/v1/creatives/deeplinks/{id}/
update: PATCH /api/v1/creatives/deeplinks/{id}/
delete: DELETE /api/v1/creatives/deeplinks/{id}/ (soft-delete)

# paths./api/v1/creatives/deeplinks/{id}/.get.description
CRUD for deeplinks.

list:   GET  /api/v1/creatives/deeplinks/
create: POST /api/v1/creatives/deeplinks/
read:   GET  /api/v1/creatives/deeplinks/{id}/
update: PATCH /api/v1/creatives/deeplinks/{id}/
delete: DELETE /api/v1/creatives/deeplinks/{id}/ (soft-delete)

# paths./api/v1/creatives/deeplinks/{id}/.get.parameters[].description
A unique integer value identifying this deeplink.

# paths./api/v1/creatives/deeplinks/{id}/.put.description
CRUD for deeplinks.

list:   GET  /api/v1/creatives/deeplinks/
create: POST /api/v1/creatives/deeplinks/
read:   GET  /api/v1/creatives/deeplinks/{id}/
update: PATCH /api/v1/creatives/deeplinks/{id}/
delete: DELETE /api/v1/creatives/deeplinks/{id}/ (soft-delete)

# paths./api/v1/creatives/deeplinks/{id}/.put.parameters[].description
A unique integer value identifying this deeplink.

# paths./api/v1/creatives/deeplinks/{id}/.patch.description
CRUD for deeplinks.

list:   GET  /api/v1/creatives/deeplinks/
create: POST /api/v1/creatives/deeplinks/
read:   GET  /api/v1/creatives/deeplinks/{id}/
update: PATCH /api/v1/creatives/deeplinks/{id}/
delete: DELETE /api/v1/creatives/deeplinks/{id}/ (soft-delete)

# paths./api/v1/creatives/deeplinks/{id}/.patch.parameters[].description
A unique integer value identifying this deeplink.

# paths./api/v1/creatives/deeplinks/{id}/.delete.description
CRUD for deeplinks.

list:   GET  /api/v1/creatives/deeplinks/
create: POST /api/v1/creatives/deeplinks/
read:   GET  /api/v1/creatives/deeplinks/{id}/
update: PATCH /api/v1/creatives/deeplinks/{id}/
delete: DELETE /api/v1/creatives/deeplinks/{id}/ (soft-delete)

# paths./api/v1/creatives/deeplinks/{id}/.delete.parameters[].description
A unique integer value identifying this deeplink.

# paths./api/v1/creatives/emails/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/emails/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/emails/{id}/.get.parameters[].description
A unique integer value identifying this email_ set.

# paths./api/v1/creatives/emails/{id}/.put.parameters[].description
A unique integer value identifying this email_ set.

# paths./api/v1/creatives/emails/{id}/.patch.parameters[].description
A unique integer value identifying this email_ set.

# paths./api/v1/creatives/emails/{id}/.delete.parameters[].description
A unique integer value identifying this email_ set.

# paths./api/v1/creatives/html-banners/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/html-banners/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/html-banners/{id}/.get.parameters[].description
A unique integer value identifying this htm l_ banner_ set.

# paths./api/v1/creatives/html-banners/{id}/.put.parameters[].description
A unique integer value identifying this htm l_ banner_ set.

# paths./api/v1/creatives/html-banners/{id}/.patch.parameters[].description
A unique integer value identifying this htm l_ banner_ set.

# paths./api/v1/creatives/html-banners/{id}/.delete.parameters[].description
A unique integer value identifying this htm l_ banner_ set.

# paths./api/v1/creatives/langs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/langs/{id}/.get.parameters[].description
A unique integer value identifying this lang.

# paths./api/v1/creatives/links/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/creatives/links/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/creatives/links/{id}/.get.parameters[].description
A unique integer value identifying this link_ set.

# paths./api/v1/creatives/links/{id}/.put.parameters[].description
A unique integer value identifying this link_ set.

# paths./api/v1/creatives/links/{id}/.patch.parameters[].description
A unique integer value identifying this link_ set.

# paths./api/v1/creatives/links/{id}/.delete.parameters[].description
A unique integer value identifying this link_ set.

# paths./api/v1/creatives/links/{id}/links/.get.parameters[].description
A unique integer value identifying this link_ set.

# paths./api/v1/creatives/network-link/.post.description
Generate a Clickwise v2 deeplink for an imported network asset.

This is intentionally v2-only: it writes a Deeplink row and returns a v2
redirect URL. It does not publish to RabbitMQ or mutate v1.

# paths./api/v1/custom-payouts/.get.description
Per-affiliate per-campaign payout overrides.

- Superadmin/Admin/IT_Manager/Finance_Manager: full read+write.
- Merchant: read/write only for their own campaigns.
- Affiliate: read-only, only their own.
- Otherwise: empty.

# paths./api/v1/custom-payouts/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/custom-payouts/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/custom-payouts/.post.description
Per-affiliate per-campaign payout overrides.

- Superadmin/Admin/IT_Manager/Finance_Manager: full read+write.
- Merchant: read/write only for their own campaigns.
- Affiliate: read-only, only their own.
- Otherwise: empty.

# paths./api/v1/custom-payouts/{id}/.get.description
Per-affiliate per-campaign payout overrides.

- Superadmin/Admin/IT_Manager/Finance_Manager: full read+write.
- Merchant: read/write only for their own campaigns.
- Affiliate: read-only, only their own.
- Otherwise: empty.

# paths./api/v1/custom-payouts/{id}/.get.parameters[].description
A unique integer value identifying this custom payout.

# paths./api/v1/custom-payouts/{id}/.put.description
Per-affiliate per-campaign payout overrides.

- Superadmin/Admin/IT_Manager/Finance_Manager: full read+write.
- Merchant: read/write only for their own campaigns.
- Affiliate: read-only, only their own.
- Otherwise: empty.

# paths./api/v1/custom-payouts/{id}/.put.parameters[].description
A unique integer value identifying this custom payout.

# paths./api/v1/custom-payouts/{id}/.patch.description
Per-affiliate per-campaign payout overrides.

- Superadmin/Admin/IT_Manager/Finance_Manager: full read+write.
- Merchant: read/write only for their own campaigns.
- Affiliate: read-only, only their own.
- Otherwise: empty.

# paths./api/v1/custom-payouts/{id}/.patch.parameters[].description
A unique integer value identifying this custom payout.

# paths./api/v1/custom-payouts/{id}/.delete.description
Per-affiliate per-campaign payout overrides.

- Superadmin/Admin/IT_Manager/Finance_Manager: full read+write.
- Merchant: read/write only for their own campaigns.
- Affiliate: read-only, only their own.
- Otherwise: empty.

# paths./api/v1/custom-payouts/{id}/.delete.parameters[].description
A unique integer value identifying this custom payout.

# paths./api/v1/dashboard/.get.description
GET /api/v1/dashboard/
Complete dashboard overview: counts, summary, top 5, time series.

# paths./api/v1/dashboard/filter-options/.get.description
Tenant-scoped option catalog for v1-style dashboard/report filters.

# paths./api/v1/dashboard/insights/.get.description
GET /api/v1/dashboard/insights/

Auto-generated insights for the dashboard. Returns key observations,
anomalies, and trends based on current click and sale data.

Also available at GET /api/v1/dashboard/insights/ for frontend convenience.

Query params:
    date_from, date_to (optional)

# paths./api/v1/dashboard/top/.get.description
GET /api/v1/dashboard/top/
Top campaigns and affiliates by performance (enriched with names).

# paths./api/v1/i18n/onboarding/.get.description
Public — returns the user's likely language + localized labels.

React calls this on first paint to fill the signup form in the
visitor's language without forcing them to pick from a dropdown.

# paths./api/v1/internal/approvals/{id}/mark-sent/.post.description
POST /api/v1/internal/approvals/<id>/mark-sent/

Called by the puller after it has published to the local RabbitMQ.

# paths./api/v1/internal/merchant-contacts/.post.description
Internal: ingest harvested merchant contacts (Impact/CJ portals, browser
agent) into Leads with verified, sendable emails. Service-key auth.

# paths./api/v1/internal/network-2fa/.get.description
Internal: latest portal 2FA code from the clickwise inbox, for the
networkaggregator Playwright runner (Impact/CJ headless login). Service-key
auth (X-API-Key). Returns the most recent code within max_age_minutes.

# paths./api/v1/internal/pending-approvals/.get.description
GET /api/v1/internal/pending-approvals/

Returns ready-to-publish messages grouped by Report_Valid_Set.
The puller is a dumb relay — all business logic (which rows, which
transactions, message shape) stays here.

# paths./api/v1/internal/v1-sync-upload/.post.description
Receive CSV dump from cw-panel cron and upsert to v2.

# paths./api/v1/landing-qa/.post.description
POST {message, lang?} → AI answer. Anonymous OK. Rate-limited per IP.

# paths./api/v1/media-types/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/media-types/{id}/.get.parameters[].description
A unique integer value identifying this media.

# paths./api/v1/merchant-network-integrations/.get.description
Merchants manage their own; managers see all.

# paths./api/v1/merchant-network-integrations/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/merchant-network-integrations/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/merchant-network-integrations/.post.description
Merchants manage their own; managers see all.

# paths./api/v1/merchant-network-integrations/{id}/.get.description
Merchants manage their own; managers see all.

# paths./api/v1/merchant-network-integrations/{id}/.get.parameters[].description
A unique integer value identifying this merchant network integration.

# paths./api/v1/merchant-network-integrations/{id}/.put.description
Merchants manage their own; managers see all.

# paths./api/v1/merchant-network-integrations/{id}/.put.parameters[].description
A unique integer value identifying this merchant network integration.

# paths./api/v1/merchant-network-integrations/{id}/.patch.description
Merchants manage their own; managers see all.

# paths./api/v1/merchant-network-integrations/{id}/.patch.parameters[].description
A unique integer value identifying this merchant network integration.

# paths./api/v1/merchant-network-integrations/{id}/.delete.description
Merchants manage their own; managers see all.

# paths./api/v1/merchant-network-integrations/{id}/.delete.parameters[].description
A unique integer value identifying this merchant network integration.

# paths./api/v1/merchant-network-integrations/{id}/sync/.post.description
Trigger an advertiser-side stats pull for this integration.

Calls :func:`merchants.services.network_stats_sync.sync_integration_stats`
synchronously and returns the report. Days window comes from
``?days=N`` (default 30, max 365).

# paths./api/v1/merchant-network-integrations/{id}/sync/.post.parameters[].description
A unique integer value identifying this merchant network integration.

# paths./api/v1/merchant-network-integrations/{id}/test/.post.description
Stub: ping the network with stored credentials. Wire to per-network
adapter in a follow-up. For now, just returns whether creds parse.

# paths./api/v1/merchant-network-integrations/{id}/test/.post.parameters[].description
A unique integer value identifying this merchant network integration.

# paths./api/v1/merchant-portal/affiliate-recommendations/.get.description
Return AI-scored affiliates the merchant should consider recruiting.

GET params:
    limit (int, default 10, max 50)
    with_rationale (bool, default 'false') — pre-generate Gemini rationale
        for the top-N. Adds ~1-2s latency per affiliate; off by default.

# paths./api/v1/merchant-portal/affiliate-recommendations/.post.description
Queue an outreach pitch from CW partnerships@ to the recommended affiliate.

Body: {"affiliate_id": 123, "extra_notes": "optional"}

# paths./api/v1/merchant-portal/commission-coach/.get.description
Tell the merchant where their commission rate sits vs peer brands.

Returns peer rate distribution (min/p25/median/p75/max), the merchant's
current rate (from Campaign_Payout), a verdict, and a recommendation
string. Cheap: deterministic statistics over AggregatedNetworkProgram.

# paths./api/v1/merchant-portal/conversions-key/.get.description
GET → this merchant's conversions ingest key (cw_mk_...), minted on
first call. POST → rotate it (revokes the old one).

The key authenticates `POST /api/v1/conversions/` via the `X-Merchant-Key`
header — the universal, network-agnostic way for a merchant to report a
sale to Clickwise, whether or not they're on a network we pull stats from.

# paths./api/v1/merchant-portal/conversions-key/.post.description
GET → this merchant's conversions ingest key (cw_mk_...), minted on
first call. POST → rotate it (revokes the old one).

The key authenticates `POST /api/v1/conversions/` via the `X-Merchant-Key`
header — the universal, network-agnostic way for a merchant to report a
sale to Clickwise, whether or not they're on a network we pull stats from.

# paths./api/v1/merchant-portal/dashboard/.get.description
High-level merchant snapshot: clicks, conversions, EPC, top affiliates.

Manager roles can pass ?merchant_id=<id> to peek at a specific merchant.

# paths./api/v1/merchant-portal/networks-dashboard/.get.description
Cross-network unified dashboard for one merchant.

Pulls from cached ``MerchantNetworkStat`` rows (filled by the
advertiser-side sync). Returns per-network breakdown + totals so the
React panel can show "across Awin + Impact + CJ + Partnerize + Rakuten,
Chow received X clicks / Y conversions / $Z commissions last 30d".

Manager roles may pass ``?merchant_id=<id>`` to inspect a specific
merchant.

# paths./api/v1/monetize/links/.post.description
POST → create provisional affiliate + real Clickwise tracking links.

# paths./api/v1/monetize/profile/{id}/.get.description
Secret-gated magic profile for instant-link affiliates.

# paths./api/v1/monetize/profile/{id}/.patch.description
Secret-gated magic profile for instant-link affiliates.

# paths./api/v1/monetize/programs/.get.description
GET programs without signup.

Two modes on the same endpoint:
  * default — relevance-scored recommendations (top matches, max 20).
  * browse  — paginated walk over EVERY live program with filters, triggered
              by ?browse=1 (or any page/page_size param). Returns
              total/page/total_pages so the UI can page the full catalog.

# paths./api/v1/monetize/requests/{id}/.get.description
GET issued links/review status with application_id + access_secret.

# paths./api/v1/network-catalog/actions/.get.description
Operational queue for manager actions on external catalog programs.

# paths./api/v1/network-catalog/actions/.get.parameters[].description
* `apply_to_network` - Apply to network
* `promote_to_affiliates` - Promote to affiliates
* `create_cw_campaign` - Create Clickwise campaign
* `activate_cw_campaign` - Activate Clickwise campaign
* `refresh_assets` - Refresh assets

# paths./api/v1/network-catalog/actions/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/network-catalog/actions/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/network-catalog/actions/.get.parameters[].description
* `low` - Low
* `normal` - Normal
* `high` - High

# paths./api/v1/network-catalog/actions/.get.parameters[].description
* `queued` - Queued
* `in_progress` - In progress
* `done` - Done
* `failed` - Failed
* `cancelled` - Cancelled

# paths./api/v1/network-catalog/actions/.post.description
Operational queue for manager actions on external catalog programs.

# paths./api/v1/network-catalog/actions/{id}/.get.description
Operational queue for manager actions on external catalog programs.

# paths./api/v1/network-catalog/actions/{id}/.get.parameters[].description
A unique integer value identifying this aggregated program action.

# paths./api/v1/network-catalog/actions/{id}/.patch.description
Operational queue for manager actions on external catalog programs.

# paths./api/v1/network-catalog/actions/{id}/.patch.parameters[].description
A unique integer value identifying this aggregated program action.

# paths./api/v1/network-catalog/creatives/.get.parameters[].description
* `banner` - Banner
* `coupon` - Coupon
* `deeplink` - Deeplink
* `text_link` - Text link
* `html` - HTML
* `product` - Product
* `other` - Other

# paths./api/v1/network-catalog/creatives/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/network-catalog/creatives/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/network-catalog/creatives/{id}/.get.parameters[].description
A unique integer value identifying this aggregated program creative.

# paths./api/v1/network-catalog/programs/.get.description
Read-only catalog of programs synced from networkaggregator.

# paths./api/v1/network-catalog/programs/.get.parameters[].description
Multiple values may be separated by commas.

# paths./api/v1/network-catalog/programs/.get.parameters[].description
Multiple values may be separated by commas.

# paths./api/v1/network-catalog/programs/.get.parameters[].description
Multiple values may be separated by commas.

# paths./api/v1/network-catalog/programs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/network-catalog/programs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/network-catalog/programs/.get.parameters[].description
Multiple values may be separated by commas.

# paths./api/v1/network-catalog/programs/{id}/.get.description
Read-only catalog of programs synced from networkaggregator.

# paths./api/v1/network-catalog/programs/{id}/.get.parameters[].description
A unique integer value identifying this aggregated network program.

# paths./api/v1/network-catalog/programs/{id}/actions/.get.description
List or queue operational actions for a catalog program.

# paths./api/v1/network-catalog/programs/{id}/actions/.get.parameters[].description
A unique integer value identifying this aggregated network program.

# paths./api/v1/network-catalog/programs/{id}/actions/.post.description
List or queue operational actions for a catalog program.

# paths./api/v1/network-catalog/programs/{id}/actions/.post.parameters[].description
A unique integer value identifying this aggregated network program.

# paths./api/v1/network-catalog/programs/{id}/promotion/.get.description
Promotion cockpit endpoint for ready-to-promote programs.

GET returns active affiliates + assets. POST generates Clickwise v2
redirect links in batch. It writes only v2 Deeplink rows.

# paths./api/v1/network-catalog/programs/{id}/promotion/.get.parameters[].description
A unique integer value identifying this aggregated network program.

# paths./api/v1/network-catalog/programs/{id}/promotion/.post.description
Promotion cockpit endpoint for ready-to-promote programs.

GET returns active affiliates + assets. POST generates Clickwise v2
redirect links in batch. It writes only v2 Deeplink rows.

# paths./api/v1/network-catalog/programs/{id}/promotion/.post.parameters[].description
A unique integer value identifying this aggregated network program.

# paths./api/v1/network-catalog/programs/application-pipeline/.get.description
Operational view of external-program application status.

This is intentionally built from v2's synced catalog and action audit
log, so the dashboard stays fast and does not depend on a live
networkaggregator request.

# paths./api/v1/network-catalog/programs/summary/.get.description
Read-only catalog of programs synced from networkaggregator.

# paths./api/v1/network-catalog/sync-runs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/network-catalog/sync-runs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/network-catalog/sync-runs/.get.parameters[].description
* `running` - Running
* `completed` - Completed
* `failed` - Failed

# paths./api/v1/network-catalog/sync-runs/{id}/.get.parameters[].description
A unique integer value identifying this aggregated program sync run.

# paths./api/v1/network-idea-runs/.get.description
Background AI/Gemma runs that generate network launch plans.

NOT staff-gated: affiliates queue analyses for their own RefId and read
their own launch packs — get_queryset/perform_create scope non-managers
to affiliate__user=user, which is the tenancy boundary here.

# paths./api/v1/network-idea-runs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/network-idea-runs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/network-idea-runs/.post.description
Background AI/Gemma runs that generate network launch plans.

NOT staff-gated: affiliates queue analyses for their own RefId and read
their own launch packs — get_queryset/perform_create scope non-managers
to affiliate__user=user, which is the tenancy boundary here.

# paths./api/v1/network-idea-runs/{id}/.get.description
Background AI/Gemma runs that generate network launch plans.

NOT staff-gated: affiliates queue analyses for their own RefId and read
their own launch packs — get_queryset/perform_create scope non-managers
to affiliate__user=user, which is the tenancy boundary here.

# paths./api/v1/network-launch-plans/.get.description
Actionable launch plans and affiliate pitch drafts generated by AI.

NOT staff-gated: serves non-managers their affiliate_pitch packs (the
growth-agent output); queryset scoping is the tenancy boundary.

# paths./api/v1/network-launch-plans/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/network-launch-plans/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/network-launch-plans/.post.description
Actionable launch plans and affiliate pitch drafts generated by AI.

NOT staff-gated: serves non-managers their affiliate_pitch packs (the
growth-agent output); queryset scoping is the tenancy boundary.

# paths./api/v1/network-launch-plans/{id}/.get.description
Actionable launch plans and affiliate pitch drafts generated by AI.

NOT staff-gated: serves non-managers their affiliate_pitch packs (the
growth-agent output); queryset scoping is the tenancy boundary.

# paths./api/v1/network-launch-plans/{id}/.patch.description
Actionable launch plans and affiliate pitch drafts generated by AI.

NOT staff-gated: serves non-managers their affiliate_pitch packs (the
growth-agent output); queryset scoping is the tenancy boundary.

# paths./api/v1/network-launch-plans/{id}/launch-pack/.get.description
Actionable launch plans and affiliate pitch drafts generated by AI.

NOT staff-gated: serves non-managers their affiliate_pitch packs (the
growth-agent output); queryset scoping is the tenancy boundary.

# paths./api/v1/network-launch-plans/launch-packs/.get.description
Actionable launch plans and affiliate pitch drafts generated by AI.

NOT staff-gated: serves non-managers their affiliate_pitch packs (the
growth-agent output); queryset scoping is the tenancy boundary.

# paths./api/v1/network-signups/.get.description
GET the portal-signup queue + the prefilled registration identity.

# paths./api/v1/network-signups/{id}/.post.description
POST an action on one queued program (record the signup outcome).

# paths./api/v1/onboarding/affiliate/.post.description
Minimum: `email` (or `username`) + how you promote (`website` or social handle + category). The AI evaluates instantly and interviews via /respond/ if it needs more. Fiscal/payout data is NOT needed here — it is requested at first payout.

# paths./api/v1/onboarding/affiliate/.post.summary
Start an affiliate onboarding application (public, AI-driven)

# paths./api/v1/onboarding/affiliate/{id}/.get.description
GET state + conversation. Secret, owner, or full-read role only.

# paths./api/v1/onboarding/affiliate/{id}/respond/.post.description
POST {message} → next turn from the agent. Secret, owner, or full-read.

# paths./api/v1/onboarding/merchant/.post.description
Frictionless start: a free-text `message` OR `company_name`/`website` is enough — the AI collects the rest (including email) conversationally via /respond/. Returns the application state + a one-time `access_secret` to authenticate follow-ups (header `X-Application-Secret`).

# paths./api/v1/onboarding/merchant/.post.summary
Start a merchant onboarding application (public, AI-driven)

# paths./api/v1/onboarding/merchant/{id}/.get.description
Public — anonymous candidate can read with access_secret; managers always.
Authenticated email-matching candidates can also read.

# paths./api/v1/onboarding/merchant/{id}/decision/.post.description
Manager override → on approve, provision Merchant + integrations.

# paths./api/v1/onboarding/merchant/{id}/respond/.post.description
Same auth as Detail — secret OR manager OR email-match.

# paths./api/v1/opportunities/inbox/.get.description
Manager inbox for AI ideas, Gmail signals, catalog gaps and failed actions.

# paths./api/v1/opportunities/inbox/.post.description
Manager inbox for AI ideas, Gmail signals, catalog gaps and failed actions.

# paths./api/v1/ops/assistant/.get.description
Read-only operations assistant for superadmins.

GET returns the current operational snapshot. POST answers a question using
the snapshot and, when configured, Gemini. It never applies mutations.

# paths./api/v1/ops/assistant/.post.description
Read-only operations assistant for superadmins.

GET returns the current operational snapshot. POST answers a question using
the snapshot and, when configured, Gemini. It never applies mutations.

# paths./api/v1/ops/assistant/act/.post.description
Chat turn for the role-aware agentic assistant.

POST {message, history?} -> {reply, role, executed?, proposed_action?}.
ANY authenticated user — the catalog is scoped to their role server-side
(manager/finance/account/affiliate/merchant). Read actions run inline;
mutating actions come back as a proposal confirmed via AssistantConfirmView.

# paths./api/v1/ops/assistant/confirm/.post.description
Execute a previously proposed mutating assistant action.

# paths./api/v1/ops/commission-import/preview/.post.description
Preview a manual/network commission import without applying it.

# paths./api/v1/outreach/queue/.get.description
GET → list reviewable merchant outreach drafts.

# paths./api/v1/outreach/queue/{id}/.get.description
GET → full draft incl. full body and personalization_context.

# paths./api/v1/outreach/reconcile-replies/.post.description
POST → backfill reply attribution onto OutreachMessage, then return the
refreshed stats. Lets a superadmin reconcile on demand (the same job also
runs every 30 min via beat). Idempotent.

# paths./api/v1/outreach/scan-replies/.post.description
POST → run the Gmail reply poller (ATTRIBUTION ONLY — no sends) now and
return what it attributed. `dry_run=true` matches without writing. The same
job also runs every 30 min via beat under the inbound_replies stream.

# paths./api/v1/outreach/stats/.get.description
GET → aggregated outreach outcomes for the dashboard header.

Trailing-window summary of drafts, AI decisions, send outcomes and
per-bucket reply/open rates. Read-only, superadmin-only, cheap.

# paths./api/v1/payments/affiliate-groups/.get.description
Payment affiliate groups for batch processing.

# paths./api/v1/payments/affiliate-groups/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/payments/affiliate-groups/.post.description
Payment affiliate groups for batch processing.

# paths./api/v1/payments/affiliate-groups/{id}/.get.description
Payment affiliate groups for batch processing.

# paths./api/v1/payments/affiliate-groups/{id}/.get.parameters[].description
A unique integer value identifying this payment_ affiliate_ group.

# paths./api/v1/payments/affiliate-groups/{id}/.put.description
Payment affiliate groups for batch processing.

# paths./api/v1/payments/affiliate-groups/{id}/.put.parameters[].description
A unique integer value identifying this payment_ affiliate_ group.

# paths./api/v1/payments/affiliate-groups/{id}/.patch.description
Payment affiliate groups for batch processing.

# paths./api/v1/payments/affiliate-groups/{id}/.patch.parameters[].description
A unique integer value identifying this payment_ affiliate_ group.

# paths./api/v1/payments/affiliate-groups/{id}/.delete.description
Payment affiliate groups for batch processing.

# paths./api/v1/payments/affiliate-groups/{id}/.delete.parameters[].description
A unique integer value identifying this payment_ affiliate_ group.

# paths./api/v1/payments/invoice-sets/.get.description
CRUD for payment invoice sets.

list:   GET  /api/v1/payments/invoice-sets/
read:   GET  /api/v1/payments/invoice-sets/{id}/
update: PATCH /api/v1/payments/invoice-sets/{id}/

# paths./api/v1/payments/invoice-sets/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/payments/invoice-sets/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/payments/invoice-sets/.post.description
CRUD for payment invoice sets.

list:   GET  /api/v1/payments/invoice-sets/
read:   GET  /api/v1/payments/invoice-sets/{id}/
update: PATCH /api/v1/payments/invoice-sets/{id}/

# paths./api/v1/payments/invoice-sets/{id}/.get.description
CRUD for payment invoice sets.

list:   GET  /api/v1/payments/invoice-sets/
read:   GET  /api/v1/payments/invoice-sets/{id}/
update: PATCH /api/v1/payments/invoice-sets/{id}/

# paths./api/v1/payments/invoice-sets/{id}/.get.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/.put.description
CRUD for payment invoice sets.

list:   GET  /api/v1/payments/invoice-sets/
read:   GET  /api/v1/payments/invoice-sets/{id}/
update: PATCH /api/v1/payments/invoice-sets/{id}/

# paths./api/v1/payments/invoice-sets/{id}/.put.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/.patch.description
CRUD for payment invoice sets.

list:   GET  /api/v1/payments/invoice-sets/
read:   GET  /api/v1/payments/invoice-sets/{id}/
update: PATCH /api/v1/payments/invoice-sets/{id}/

# paths./api/v1/payments/invoice-sets/{id}/.patch.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/.delete.description
CRUD for payment invoice sets.

list:   GET  /api/v1/payments/invoice-sets/
read:   GET  /api/v1/payments/invoice-sets/{id}/
update: PATCH /api/v1/payments/invoice-sets/{id}/

# paths./api/v1/payments/invoice-sets/{id}/.delete.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/bridge-dry-run/.get.description
Dry-run the future v2 -> v1 payment bridge for one invoice set.

This is intentionally read-only. It answers: if the bridge were enabled
now, which v1 unpaid payment atoms would be targeted, which are missing,
and whether duplicate invoice sets would block the write.

# paths./api/v1/payments/invoice-sets/{id}/bridge-dry-run/.get.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/confirm/.post.description
POST /api/v1/payments/invoice-sets/{id}/confirm/

Marks the set as reviewed/confirmed by finance. No v1 writes.

# paths./api/v1/payments/invoice-sets/{id}/confirm/.post.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/export.csv/.get.description
Stream a v1-equivalent CSV for a single invoice set.

Useful for finance hand-off without giving them DB access. Uses the
Payment_Invoice rows already on the set, joined with v2 affiliate
display info. Read-only.

# paths./api/v1/payments/invoice-sets/{id}/export.csv/.get.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/invoices/.get.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/{id}/mark_paid/.post.description
POST /api/v1/payments/invoice-sets/{id}/mark_paid/.

Guarded local-only flag — does NOT update v1 transactions.payout_status.
Until the real v1 approval bridge is live, this endpoint must be able
to prove the invoice set still maps cleanly to current v1 approved/
unpaid rows before flipping the local v2 Paid flag.

# paths./api/v1/payments/invoice-sets/{id}/mark_paid/.post.parameters[].description
A unique integer value identifying this payment_ invoice_ set.

# paths./api/v1/payments/invoice-sets/bridge-readiness/.get.description
Summarize payment bridge readiness across invoice sets.

Read-only finance dashboard. It evaluates invoice sets against current
v1 unpaid rows through cw-api and never mutates v1/v2 payment state.

# paths./api/v1/payments/invoice-sets/generate-draft/.post.description
Build a draft invoice set from current cw-api unpaid balances.

v2-only and read-only against v1: pulls (status=A, payout_status=U)
aggregates with `validation_id`, groups by (affiliate, currency), and
writes a `Payment_Invoice_Set` with one `Payment_Invoice` per affiliate/
currency. The set starts with `Confirm=False` and `Paid=False`. v1's
transaction.payout_status stays untouched until the approval bridge is
live.

# paths./api/v1/payments/invoices/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/payments/invoices/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/payments/invoices/{id}/.get.parameters[].description
A unique integer value identifying this payment_ invoice.

# paths./api/v1/payments/invoices/{id}/.put.parameters[].description
A unique integer value identifying this payment_ invoice.

# paths./api/v1/payments/invoices/{id}/.patch.parameters[].description
A unique integer value identifying this payment_ invoice.

# paths./api/v1/payments/invoices/{id}/.delete.parameters[].description
A unique integer value identifying this payment_ invoice.

# paths./api/v1/payments/records/.get.description
CRUD for payment records.

list:   GET  /api/v1/payments/records/
create: POST /api/v1/payments/records/
read:   GET  /api/v1/payments/records/{id}/
update: PUT/PATCH /api/v1/payments/records/{id}/
delete: DELETE /api/v1/payments/records/{id}/ (soft-delete)

# paths./api/v1/payments/records/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/payments/records/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/payments/records/.post.description
CRUD for payment records.

list:   GET  /api/v1/payments/records/
create: POST /api/v1/payments/records/
read:   GET  /api/v1/payments/records/{id}/
update: PUT/PATCH /api/v1/payments/records/{id}/
delete: DELETE /api/v1/payments/records/{id}/ (soft-delete)

# paths./api/v1/payments/records/{id}/.get.description
CRUD for payment records.

list:   GET  /api/v1/payments/records/
create: POST /api/v1/payments/records/
read:   GET  /api/v1/payments/records/{id}/
update: PUT/PATCH /api/v1/payments/records/{id}/
delete: DELETE /api/v1/payments/records/{id}/ (soft-delete)

# paths./api/v1/payments/records/{id}/.get.parameters[].description
A unique integer value identifying this payment_ record.

# paths./api/v1/payments/records/{id}/.put.description
CRUD for payment records.

list:   GET  /api/v1/payments/records/
create: POST /api/v1/payments/records/
read:   GET  /api/v1/payments/records/{id}/
update: PUT/PATCH /api/v1/payments/records/{id}/
delete: DELETE /api/v1/payments/records/{id}/ (soft-delete)

# paths./api/v1/payments/records/{id}/.put.parameters[].description
A unique integer value identifying this payment_ record.

# paths./api/v1/payments/records/{id}/.patch.description
CRUD for payment records.

list:   GET  /api/v1/payments/records/
create: POST /api/v1/payments/records/
read:   GET  /api/v1/payments/records/{id}/
update: PUT/PATCH /api/v1/payments/records/{id}/
delete: DELETE /api/v1/payments/records/{id}/ (soft-delete)

# paths./api/v1/payments/records/{id}/.patch.parameters[].description
A unique integer value identifying this payment_ record.

# paths./api/v1/payments/records/{id}/.delete.description
CRUD for payment records.

list:   GET  /api/v1/payments/records/
create: POST /api/v1/payments/records/
read:   GET  /api/v1/payments/records/{id}/
update: PUT/PATCH /api/v1/payments/records/{id}/
delete: DELETE /api/v1/payments/records/{id}/ (soft-delete)

# paths./api/v1/payments/records/{id}/.delete.parameters[].description
A unique integer value identifying this payment_ record.

# paths./api/v1/payments/records/unpaid-balances/.get.description
Read-only affiliate unpaid balances from the CW tracking API.

Mirrors the first operational surface of v1 Payments without requiring
v2 invoice sets to exist yet. It does not mark paid or mutate v1/v2.

# paths./api/v1/programs/.get.description
Public-to-CW-affiliates catalog of network programs.

Filtering: ?network=, ?category=, ?country=, ?cw_status=

# paths./api/v1/programs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/programs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/programs/{id}/.get.description
Public-to-CW-affiliates catalog of network programs.

Filtering: ?network=, ?category=, ?country=, ?cw_status=

# paths./api/v1/programs/{id}/.get.parameters[].description
A unique integer value identifying this aggregated network program.

# paths./api/v1/programs/{id}/apply/.post.description
Public-to-CW-affiliates catalog of network programs.

Filtering: ?network=, ?category=, ?country=, ?cw_status=

# paths./api/v1/programs/{id}/apply/.post.parameters[].description
A unique integer value identifying this aggregated network program.

# paths./api/v1/queries/{query_id}/answer/.post.description
Merchant answers (or declines) — gated to the merchant_username on the row.

# paths./api/v1/queries/{query_id}/deliver/.post.description
Manager delivers the merchant's answer back to the affiliate.

# paths./api/v1/reconciliation/creatives/.get.description
Upstream creatives/ads from partner networks.

list:   GET /api/v1/reconciliation/creatives/
detail: GET /api/v1/reconciliation/creatives/{id}/

# paths./api/v1/reconciliation/creatives/.get.parameters[].description
* `banner` - Banner Image
* `text_link` - Text Link
* `coupon` - Coupon/Deal
* `deeplink` - Deep Link
* `html` - HTML Ad
* `product` - Product Feed Item
* `video` - Video

# paths./api/v1/reconciliation/creatives/.get.parameters[].description
* `impact` - Impact
* `awin` - Awin
* `partnerize` - Partnerize

# paths./api/v1/reconciliation/creatives/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reconciliation/creatives/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reconciliation/creatives/{id}/.get.description
Upstream creatives/ads from partner networks.

list:   GET /api/v1/reconciliation/creatives/
detail: GET /api/v1/reconciliation/creatives/{id}/

# paths./api/v1/reconciliation/creatives/{id}/.get.parameters[].description
A unique integer value identifying this Network Creative.

# paths./api/v1/reconciliation/details/.get.description
Upstream campaign details — rates, terms, restrictions, creatives.

list:   GET /api/v1/reconciliation/details/
detail: GET /api/v1/reconciliation/details/{id}/

# paths./api/v1/reconciliation/details/.get.parameters[].description
* `CPS` - Cost Per Sale (%)
* `CPA` - Cost Per Action ($)
* `CPC` - Cost Per Click
* `hybrid` - Hybrid

# paths./api/v1/reconciliation/details/.get.parameters[].description
* `impact` - Impact
* `awin` - Awin
* `partnerize` - Partnerize

# paths./api/v1/reconciliation/details/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reconciliation/details/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reconciliation/details/{id}/.get.description
Upstream campaign details — rates, terms, restrictions, creatives.

list:   GET /api/v1/reconciliation/details/
detail: GET /api/v1/reconciliation/details/{id}/

# paths./api/v1/reconciliation/details/{id}/.get.parameters[].description
A unique integer value identifying this Network Campaign Detail.

# paths./api/v1/reconciliation/mappings/.get.description
CRUD for campaign-to-network mappings.

list:    GET  /api/v1/reconciliation/mappings/
create:  POST /api/v1/reconciliation/mappings/
read:    GET  /api/v1/reconciliation/mappings/{id}/
update:  PATCH /api/v1/reconciliation/mappings/{id}/
confirm: POST /api/v1/reconciliation/mappings/{id}/confirm/

# paths./api/v1/reconciliation/mappings/.get.parameters[].description
* `impact` - Impact
* `awin` - Awin
* `partnerize` - Partnerize

# paths./api/v1/reconciliation/mappings/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reconciliation/mappings/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reconciliation/mappings/.post.description
CRUD for campaign-to-network mappings.

list:    GET  /api/v1/reconciliation/mappings/
create:  POST /api/v1/reconciliation/mappings/
read:    GET  /api/v1/reconciliation/mappings/{id}/
update:  PATCH /api/v1/reconciliation/mappings/{id}/
confirm: POST /api/v1/reconciliation/mappings/{id}/confirm/

# paths./api/v1/reconciliation/mappings/{id}/.get.description
CRUD for campaign-to-network mappings.

list:    GET  /api/v1/reconciliation/mappings/
create:  POST /api/v1/reconciliation/mappings/
read:    GET  /api/v1/reconciliation/mappings/{id}/
update:  PATCH /api/v1/reconciliation/mappings/{id}/
confirm: POST /api/v1/reconciliation/mappings/{id}/confirm/

# paths./api/v1/reconciliation/mappings/{id}/.get.parameters[].description
A unique integer value identifying this campaign network mapping.

# paths./api/v1/reconciliation/mappings/{id}/.put.description
CRUD for campaign-to-network mappings.

list:    GET  /api/v1/reconciliation/mappings/
create:  POST /api/v1/reconciliation/mappings/
read:    GET  /api/v1/reconciliation/mappings/{id}/
update:  PATCH /api/v1/reconciliation/mappings/{id}/
confirm: POST /api/v1/reconciliation/mappings/{id}/confirm/

# paths./api/v1/reconciliation/mappings/{id}/.put.parameters[].description
A unique integer value identifying this campaign network mapping.

# paths./api/v1/reconciliation/mappings/{id}/.patch.description
CRUD for campaign-to-network mappings.

list:    GET  /api/v1/reconciliation/mappings/
create:  POST /api/v1/reconciliation/mappings/
read:    GET  /api/v1/reconciliation/mappings/{id}/
update:  PATCH /api/v1/reconciliation/mappings/{id}/
confirm: POST /api/v1/reconciliation/mappings/{id}/confirm/

# paths./api/v1/reconciliation/mappings/{id}/.patch.parameters[].description
A unique integer value identifying this campaign network mapping.

# paths./api/v1/reconciliation/mappings/{id}/.delete.description
CRUD for campaign-to-network mappings.

list:    GET  /api/v1/reconciliation/mappings/
create:  POST /api/v1/reconciliation/mappings/
read:    GET  /api/v1/reconciliation/mappings/{id}/
update:  PATCH /api/v1/reconciliation/mappings/{id}/
confirm: POST /api/v1/reconciliation/mappings/{id}/confirm/

# paths./api/v1/reconciliation/mappings/{id}/.delete.parameters[].description
A unique integer value identifying this campaign network mapping.

# paths./api/v1/reconciliation/mappings/{id}/confirm/.post.parameters[].description
A unique integer value identifying this campaign network mapping.

# paths./api/v1/reconciliation/mappings/{id}/unconfirm/.post.parameters[].description
A unique integer value identifying this campaign network mapping.

# paths./api/v1/reconciliation/matches/.get.description
Read-only access to reconciliation matches.

list:   GET /api/v1/reconciliation/matches/
detail: GET /api/v1/reconciliation/matches/{id}/

# paths./api/v1/reconciliation/matches/.get.parameters[].description
* `impact` - Impact
* `awin` - Awin
* `partnerize` - Partnerize

# paths./api/v1/reconciliation/matches/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reconciliation/matches/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reconciliation/matches/{id}/.get.description
Read-only access to reconciliation matches.

list:   GET /api/v1/reconciliation/matches/
detail: GET /api/v1/reconciliation/matches/{id}/

# paths./api/v1/reconciliation/matches/{id}/.get.parameters[].description
A unique integer value identifying this reconciliation match.

# paths./api/v1/reconciliation/runs/.get.description
Read-only access to reconciliation runs.

list:   GET /api/v1/reconciliation/runs/
detail: GET /api/v1/reconciliation/runs/{id}/

# paths./api/v1/reconciliation/runs/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reconciliation/runs/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reconciliation/runs/.get.parameters[].description
* `running` - Running
* `completed` - Completed
* `failed` - Failed

# paths./api/v1/reconciliation/runs/{id}/.get.description
Read-only access to reconciliation runs.

list:   GET /api/v1/reconciliation/runs/
detail: GET /api/v1/reconciliation/runs/{id}/

# paths./api/v1/reconciliation/runs/{id}/.get.parameters[].description
A unique integer value identifying this reconciliation run.

# paths./api/v1/reports/downloads/.get.description
Report downloads — files generated for export.

list:   GET  /api/v1/reports/downloads/
create: POST /api/v1/reports/downloads/
read:   GET  /api/v1/reports/downloads/{id}/

# paths./api/v1/reports/downloads/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reports/downloads/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reports/downloads/.post.description
Report downloads — files generated for export.

list:   GET  /api/v1/reports/downloads/
create: POST /api/v1/reports/downloads/
read:   GET  /api/v1/reports/downloads/{id}/

# paths./api/v1/reports/downloads/{id}/.get.description
Report downloads — files generated for export.

list:   GET  /api/v1/reports/downloads/
create: POST /api/v1/reports/downloads/
read:   GET  /api/v1/reports/downloads/{id}/

# paths./api/v1/reports/downloads/{id}/.get.parameters[].description
A unique integer value identifying this report_ down load.

# paths./api/v1/reports/downloads/{id}/.put.description
Report downloads — files generated for export.

list:   GET  /api/v1/reports/downloads/
create: POST /api/v1/reports/downloads/
read:   GET  /api/v1/reports/downloads/{id}/

# paths./api/v1/reports/downloads/{id}/.put.parameters[].description
A unique integer value identifying this report_ down load.

# paths./api/v1/reports/downloads/{id}/.patch.description
Report downloads — files generated for export.

list:   GET  /api/v1/reports/downloads/
create: POST /api/v1/reports/downloads/
read:   GET  /api/v1/reports/downloads/{id}/

# paths./api/v1/reports/downloads/{id}/.patch.parameters[].description
A unique integer value identifying this report_ down load.

# paths./api/v1/reports/downloads/{id}/.delete.description
Report downloads — files generated for export.

list:   GET  /api/v1/reports/downloads/
create: POST /api/v1/reports/downloads/
read:   GET  /api/v1/reports/downloads/{id}/

# paths./api/v1/reports/downloads/{id}/.delete.parameters[].description
A unique integer value identifying this report_ down load.

# paths./api/v1/reports/mq-status/.get.description
Read-only view of message queue status entries.

# paths./api/v1/reports/mq-status/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reports/mq-status/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reports/mq-status/{id}/.get.description
Read-only view of message queue status entries.

# paths./api/v1/reports/mq-status/{id}/.get.parameters[].description
A unique integer value identifying this m q_ status.

# paths./api/v1/reports/stats-cache/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reports/stats-cache/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reports/stats-cache/{id}/.get.parameters[].description
A unique integer value identifying this stats_ cache.

# paths./api/v1/reports/uploads/.get.description
Report uploads — files uploaded for processing.

list:   GET  /api/v1/reports/uploads/
create: POST /api/v1/reports/uploads/
read:   GET  /api/v1/reports/uploads/{id}/

# paths./api/v1/reports/uploads/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reports/uploads/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reports/uploads/.post.description
Report uploads — files uploaded for processing.

list:   GET  /api/v1/reports/uploads/
create: POST /api/v1/reports/uploads/
read:   GET  /api/v1/reports/uploads/{id}/

# paths./api/v1/reports/uploads/{id}/.get.description
Report uploads — files uploaded for processing.

list:   GET  /api/v1/reports/uploads/
create: POST /api/v1/reports/uploads/
read:   GET  /api/v1/reports/uploads/{id}/

# paths./api/v1/reports/uploads/{id}/.get.parameters[].description
A unique integer value identifying this report_ up load.

# paths./api/v1/reports/uploads/{id}/.put.description
Report uploads — files uploaded for processing.

list:   GET  /api/v1/reports/uploads/
create: POST /api/v1/reports/uploads/
read:   GET  /api/v1/reports/uploads/{id}/

# paths./api/v1/reports/uploads/{id}/.put.parameters[].description
A unique integer value identifying this report_ up load.

# paths./api/v1/reports/uploads/{id}/.patch.description
Report uploads — files uploaded for processing.

list:   GET  /api/v1/reports/uploads/
create: POST /api/v1/reports/uploads/
read:   GET  /api/v1/reports/uploads/{id}/

# paths./api/v1/reports/uploads/{id}/.patch.parameters[].description
A unique integer value identifying this report_ up load.

# paths./api/v1/reports/uploads/{id}/.delete.description
Report uploads — files uploaded for processing.

list:   GET  /api/v1/reports/uploads/
create: POST /api/v1/reports/uploads/
read:   GET  /api/v1/reports/uploads/{id}/

# paths./api/v1/reports/uploads/{id}/.delete.parameters[].description
A unique integer value identifying this report_ up load.

# paths./api/v1/reports/valid-sets/.get.description
Validation sets — batch validation runs.

# paths./api/v1/reports/valid-sets/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reports/valid-sets/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reports/valid-sets/.post.description
Validation sets — batch validation runs.

# paths./api/v1/reports/valid-sets/{id}/.get.description
Validation sets — batch validation runs.

# paths./api/v1/reports/valid-sets/{id}/.get.parameters[].description
A unique integer value identifying this report_ valid_ set.

# paths./api/v1/reports/valid-sets/{id}/.put.description
Validation sets — batch validation runs.

# paths./api/v1/reports/valid-sets/{id}/.put.parameters[].description
A unique integer value identifying this report_ valid_ set.

# paths./api/v1/reports/valid-sets/{id}/.patch.description
Validation sets — batch validation runs.

# paths./api/v1/reports/valid-sets/{id}/.patch.parameters[].description
A unique integer value identifying this report_ valid_ set.

# paths./api/v1/reports/valid-sets/{id}/.delete.description
Validation sets — batch validation runs.

# paths./api/v1/reports/valid-sets/{id}/.delete.parameters[].description
A unique integer value identifying this report_ valid_ set.

# paths./api/v1/reports/valid-sets/{id}/approve/.post.parameters[].description
A unique integer value identifying this report_ valid_ set.

# paths./api/v1/reports/valid-sets/{id}/validations/.get.parameters[].description
A unique integer value identifying this report_ valid_ set.

# paths./api/v1/reports/validations/.get.description
Validation reports — individual validation file entries.

# paths./api/v1/reports/validations/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/reports/validations/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/reports/validations/.post.description
Validation reports — individual validation file entries.

# paths./api/v1/reports/validations/{id}/.get.description
Validation reports — individual validation file entries.

# paths./api/v1/reports/validations/{id}/.get.parameters[].description
A unique integer value identifying this validation_ report.

# paths./api/v1/reports/validations/{id}/.put.description
Validation reports — individual validation file entries.

# paths./api/v1/reports/validations/{id}/.put.parameters[].description
A unique integer value identifying this validation_ report.

# paths./api/v1/reports/validations/{id}/.patch.description
Validation reports — individual validation file entries.

# paths./api/v1/reports/validations/{id}/.patch.parameters[].description
A unique integer value identifying this validation_ report.

# paths./api/v1/reports/validations/{id}/.delete.description
Validation reports — individual validation file entries.

# paths./api/v1/reports/validations/{id}/.delete.parameters[].description
A unique integer value identifying this validation_ report.

# paths./api/v1/scouting/activities/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/scouting/activities/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/scouting/activities/{id}/.get.parameters[].description
A unique integer value identifying this lead activity.

# paths./api/v1/scouting/grades/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/scouting/grades/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/scouting/grades/{id}/.get.parameters[].description
A unique integer value identifying this client grade.

# paths./api/v1/scouting/leads/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/scouting/leads/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/scouting/leads/{id}/.get.parameters[].description
A unique integer value identifying this lead.

# paths./api/v1/scouting/leads/{id}/.put.parameters[].description
A unique integer value identifying this lead.

# paths./api/v1/scouting/leads/{id}/.patch.parameters[].description
A unique integer value identifying this lead.

# paths./api/v1/scouting/leads/{id}/.delete.parameters[].description
A unique integer value identifying this lead.

# paths./api/v1/scouting/leads/{id}/change_status/.post.parameters[].description
A unique integer value identifying this lead.

# paths./api/v1/scouting/leads/pipeline/.get.description
GET /api/v1/scouting/leads/pipeline/ — counts by status.

# paths./api/v1/scouting/onboarding/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/scouting/onboarding/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/scouting/onboarding/{id}/.get.parameters[].description
A unique integer value identifying this onboarding process.

# paths./api/v1/scouting/onboarding/{id}/.put.parameters[].description
A unique integer value identifying this onboarding process.

# paths./api/v1/scouting/onboarding/{id}/.patch.parameters[].description
A unique integer value identifying this onboarding process.

# paths./api/v1/scouting/onboarding/{id}/.delete.parameters[].description
A unique integer value identifying this onboarding process.

# paths./api/v1/scouting/onboarding/{id}/verify_tracking/.post.parameters[].description
A unique integer value identifying this onboarding process.

# paths./api/v1/scouting/outreach-campaigns/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/scouting/outreach-campaigns/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/scouting/outreach-campaigns/{id}/.get.parameters[].description
A unique integer value identifying this outreach campaign.

# paths./api/v1/scouting/outreach-campaigns/{id}/.put.parameters[].description
A unique integer value identifying this outreach campaign.

# paths./api/v1/scouting/outreach-campaigns/{id}/.patch.parameters[].description
A unique integer value identifying this outreach campaign.

# paths./api/v1/scouting/outreach-campaigns/{id}/.delete.parameters[].description
A unique integer value identifying this outreach campaign.

# paths./api/v1/scouting/outreach-messages/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/scouting/outreach-messages/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/scouting/outreach-messages/{id}/.get.parameters[].description
A unique integer value identifying this outreach message.

# paths./api/v1/scouting/outreach-messages/{id}/.put.parameters[].description
A unique integer value identifying this outreach message.

# paths./api/v1/scouting/outreach-messages/{id}/.patch.parameters[].description
A unique integer value identifying this outreach message.

# paths./api/v1/scouting/outreach-messages/{id}/.delete.parameters[].description
A unique integer value identifying this outreach message.

# paths./api/v1/settings/cache/clear/.post.description
POST /api/v1/settings/cache/clear/ — flush stale caches (superuser only).

# paths./api/v1/settings/currencies/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/settings/currencies/{id}/.get.parameters[].description
A unique integer value identifying this currency.

# paths./api/v1/settings/currencies/{id}/.put.parameters[].description
A unique integer value identifying this currency.

# paths./api/v1/settings/currencies/{id}/.patch.parameters[].description
A unique integer value identifying this currency.

# paths./api/v1/settings/currencies/{id}/.delete.parameters[].description
A unique integer value identifying this currency.

# paths./api/v1/settings/legal-entities/.get.description
Legal entity types (read-only reference).

# paths./api/v1/settings/legal-entities/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/settings/legal-entities/{id}/.get.description
Legal entity types (read-only reference).

# paths./api/v1/settings/legal-entities/{id}/.get.parameters[].description
A unique integer value identifying this legal_ entity.

# paths./api/v1/settings/merchants/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/settings/merchants/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/settings/merchants/{id}/.get.parameters[].description
A unique integer value identifying this merchant.

# paths./api/v1/settings/merchants/{id}/.put.parameters[].description
A unique integer value identifying this merchant.

# paths./api/v1/settings/merchants/{id}/.patch.parameters[].description
A unique integer value identifying this merchant.

# paths./api/v1/settings/merchants/{id}/.delete.parameters[].description
A unique integer value identifying this merchant.

# paths./api/v1/settings/merchants/{id}/profile/.get.description
GET /api/v1/settings/merchants/<id>/profile/ — v1-parity merchant
window: identity + contacts + every campaign with its resolved RULES
(allowed channels, terms, cookie window, geo, restrictions), sourced
from the network catalog sync → network detail → v1 conditions.

# paths./api/v1/settings/merchants/{id}/profile/.get.parameters[].description
A unique integer value identifying this merchant.

# paths./api/v1/settings/offices/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/settings/offices/{id}/.get.parameters[].description
A unique integer value identifying this office.

# paths./api/v1/settings/offices/{id}/.put.parameters[].description
A unique integer value identifying this office.

# paths./api/v1/settings/offices/{id}/.patch.parameters[].description
A unique integer value identifying this office.

# paths./api/v1/settings/offices/{id}/.delete.parameters[].description
A unique integer value identifying this office.

# paths./api/v1/settings/users/.get.description
GET /api/v1/settings/users/
List active, non-deleted users.

# paths./api/v1/settings/users/{id}/.get.description
GET /api/v1/settings/users/{id}/
Get full user profile.

# paths./api/v1/smart-matching/.get.description
Suggest the top N affiliates for a given campaign (or vice-versa)
based on category overlap, country overlap, and recent EPC.

Manager-only (impact.com calls this "Brandcast / Discover").

# paths./api/v1/transactions/.get.description
GET /api/v1/transactions/
Proxy to CW API /api/v1/transactions with filtering.

Query params: campaign_id, affiliate_id, date_from, date_to,
              status, order_id, page, page_size

# paths./api/v1/transactions/{transaction_id}/.get.description
GET /api/v1/transactions/{transaction_id}/
Proxy to CW API for a single transaction.

# paths./api/v1/transactions/export.csv.get.description
Stream a CSV with v1-equivalent columns for the requested filter window.

Iterates the cw-api transactions endpoint server-side so finance/managers can
pull the full set without holding everything in browser memory. Read-only —
cw-api itself rejects writes by design.

# paths./api/v1/transactions/health/.get.description
Local operational freshness for v1-mirrored transaction/sales data.

# paths./api/v1/webhook-deliveries/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/webhook-deliveries/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/webhook-deliveries/{id}/.get.parameters[].description
A unique integer value identifying this webhook delivery.

# paths./api/v1/webhooks/.get.description
Outbound webhooks. Merchants own theirs; managers see all.

# paths./api/v1/webhooks/.get.parameters[].description
Which field to use when ordering the results.

# paths./api/v1/webhooks/.get.parameters[].description
A page number within the paginated result set.

# paths./api/v1/webhooks/.post.description
Outbound webhooks. Merchants own theirs; managers see all.

# paths./api/v1/webhooks/{id}/.get.description
Outbound webhooks. Merchants own theirs; managers see all.

# paths./api/v1/webhooks/{id}/.get.parameters[].description
A unique integer value identifying this webhook.

# paths./api/v1/webhooks/{id}/.put.description
Outbound webhooks. Merchants own theirs; managers see all.

# paths./api/v1/webhooks/{id}/.put.parameters[].description
A unique integer value identifying this webhook.

# paths./api/v1/webhooks/{id}/.patch.description
Outbound webhooks. Merchants own theirs; managers see all.

# paths./api/v1/webhooks/{id}/.patch.parameters[].description
A unique integer value identifying this webhook.

# paths./api/v1/webhooks/{id}/.delete.description
Outbound webhooks. Merchants own theirs; managers see all.

# paths./api/v1/webhooks/{id}/.delete.parameters[].description
A unique integer value identifying this webhook.

# paths./api/v1/webhooks/{id}/rotate-secret/.post.description
Outbound webhooks. Merchants own theirs; managers see all.

# paths./api/v1/webhooks/{id}/rotate-secret/.post.parameters[].description
A unique integer value identifying this webhook.

# paths./api/v1/webhooks/{id}/test/.post.description
Send a synthetic test payload to verify the endpoint is reachable.

# paths./api/v1/webhooks/{id}/test/.post.parameters[].description
A unique integer value identifying this webhook.

# paths./api/v1/widgets/items/.get.description
Items + config the loader renders. Bumps the impression counter.

# paths./api/v1/widgets/loader.js.get.description
Serves the drop-in loader JS. Scans for [data-cw-widget] and renders.

# components.schemas.ActionTypeEnum.description
* `apply_to_network` - Apply to network
* `promote_to_affiliates` - Promote to affiliates
* `create_cw_campaign` - Create Clickwise campaign
* `activate_cw_campaign` - Activate Clickwise campaign
* `refresh_assets` - Refresh assets

# components.schemas.ActivityTypeEnum.description
* `created` - Created
* `status_changed` - Status Changed
* `email_sent` - Email Sent
* `email_opened` - Email Opened
* `email_replied` - Email Replied
* `note_added` - Note Added
* `research_completed` - Research Completed
* `tracking_verified` - Tracking Verified
* `graded` - Graded

# components.schemas.AffiliateNetworkIntegration.properties.affiliate.description
Managers may set explicitly; affiliates leave blank — the view locks it to their own row.

# components.schemas.AffiliateNetworkIntegration.properties.account_id.description
Public network identifier: Awin publisher_id / Impact sid / Partnerize publisher_id / Levanta creator_id.

# components.schemas.AffiliateNetworkIntegrationNetworkEnum.description
* `awin` - Awin
* `impact` - Impact
* `partnerize` - Partnerize
* `levanta` - Levanta (Amazon)
* `rakuten` - Rakuten Advertising
* `admitad` - Admitad / Mitgo

# components.schemas.AffiliateNetworkIntegrationStatusEnum.description
* `pending` - Pending — no sync yet
* `active` - Active — synced
* `error` - Error — last sync failed

# components.schemas.AggregatedProgramActionStatusEnum.description
* `queued` - Queued
* `in_progress` - In progress
* `done` - Done
* `failed` - Failed
* `cancelled` - Cancelled

# components.schemas.AggregatedProgramCreativeCreativeTypeEnum.description
* `banner` - Banner
* `coupon` - Coupon
* `deeplink` - Deeplink
* `text_link` - Text link
* `html` - HTML
* `product` - Product
* `other` - Other

# components.schemas.AlertTypeEnum.description
* `commission_spike` - Commission Spike
* `high_value_order` - High Value Order
* `duplicate_order` - Duplicate Order ID
* `conversion_lag` - Suspicious Conversion Lag
* `margin_squeeze` - Margin Squeeze
* `low_conversion` - Low Conversion Rate

# components.schemas.ApplicationRequestStatusEnum.description
* `pending_manager_review` - Pending manager review
* `declined_by_manager` - Declined by Clickwise
* `applied_on_network` - Applied on network
* `approved_by_network` - Approved by network
* `declined_by_network` - Declined by network
* `info_needed` - Network requested more info

# components.schemas.AuditLog.properties.actor_real_username.description
Set when impersonating — the operator who actually ran the action.

# components.schemas.CampaignAffiliateRow.description
Rich row for the Affiliates-in-Campaign overview page.

Adds the relationship-level fields v1 surfaced (channel, email, website
URL, status label, click/sale flags) so managers can scan assignments
across campaigns without drilling into each campaign.

# components.schemas.CampaignIntegration.description
Read-write serializer for CampaignIntegration.

`method`, `config`, `notes` and `health` are editable by managers; once a
manager touches it, `method_source` is forced to `manager_confirmed` so the
re-seeder respects their override.

# components.schemas.CampaignIntegrationHealthEnum.description
* `ok` - Active
* `stale` - Stale (no recent events)
* `inactive` - Inactive
* `broken` - Broken
* `unknown` - Unknown

# components.schemas.CampaignNetworkMappingNetworkEnum.description
* `impact` - Impact
* `awin` - Awin
* `partnerize` - Partnerize

# components.schemas.CampaignSummary.description
Compact campaign serializer for list views and embedding.

# components.schemas.CampaignTrackingPixel.properties.landing_value_format.description
How the captured value maps back to a CW affiliate. e.g. affiliate_id, click_id, prefixed.

# components.schemas.CampaignTrackingPixel.properties.merchant_spec.description
Raw spec from the merchant (URL, params, samples, who sent it).

# components.schemas.CampaignTrackingPixelHealthEnum.description
* `ok` - Receiving fires
* `stale` - No recent fires
* `never_fired` - Never fired
* `broken` - Last fire failed
* `unknown` - Unknown

# components.schemas.CampaignTrackingPixelStatusEnum.description
* `draft` - Draft
* `pending_merchant` - Pending merchant
* `active` - Active
* `disabled` - Disabled

# components.schemas.CommissionTypeEnum.description
* `CPS` - Cost Per Sale (%)
* `CPA` - Cost Per Action ($)
* `CPC` - Cost Per Click
* `hybrid` - Hybrid

# components.schemas.EventTypeEnum.description
* `sale` - Sale
* `lead` - Lead
* `default` - Default
* `signup` - Signup
* `install` - Install

# components.schemas.KindEnum.description
* `pixel_js` - Pixel JS
* `pixel_img` - Pixel image
* `s2s_postback` - S2S postback
* `api_pull` - API pull / scheduled

# components.schemas.MerchantNetworkIntegration.properties.merchant.description
Managers may set explicitly; merchants leave blank — the view + validate_merchant() locks it to their own row.

# components.schemas.MerchantNetworkIntegration.properties.account_id.description
Account/publisher/advertiser ID on the network.

# components.schemas.MerchantNetworkIntegration.properties.label.description
Friendly label so a merchant can keep multiple network accounts.

# components.schemas.MerchantNetworkIntegrationNetworkEnum.description
* `awin` - Awin
* `impact` - Impact
* `partnerize` - Partnerize
* `tradedoubler` - Tradedoubler
* `cj` - CJ
* `admitad` - Admitad/Mitgo
* `webgains` - Webgains
* `shareasale` - ShareASale

# components.schemas.MerchantNetworkIntegrationStatusEnum.description
* `pending` - Pending
* `active` - Active
* `error` - Error
* `paused` - Paused

# components.schemas.MethodEnum.description
* `pixel` - Pixel / cookie
* `s2s_postback` - S2S postback
* `api_import` - API import / pull
* `manual` - Manual upload / CSV
* `unknown` - Unknown

# components.schemas.MethodSourceEnum.description
* `inferred_from_v1` - Inferred from v1 transactions
* `manager_confirmed` - Manager confirmed
* `imported` - Imported
* `unknown` - Unknown

# components.schemas.NetworkCampaignDetail.properties.commission_details.description
Full payout terms / commission groups from network

# components.schemas.NetworkCreativeCreativeTypeEnum.description
* `banner` - Banner Image
* `text_link` - Text Link
* `coupon` - Coupon/Deal
* `deeplink` - Deep Link
* `html` - HTML Ad
* `product` - Product Feed Item
* `video` - Video

# components.schemas.NetworkIdeaAnalysisRun.properties.include_unapproved_programs.description
Superuser-only strategy mode: include active programs that are not approved/imported yet.

# components.schemas.NetworkIdeaAnalysisRunStatusEnum.description
* `queued` - Queued
* `in_progress` - In progress
* `done` - Done
* `failed` - Failed

# components.schemas.NetworkLaunchPlanStatusEnum.description
* `draft` - Draft
* `queued` - Queued
* `in_progress` - In progress
* `active` - Active
* `done` - Done
* `archived` - Archived

# components.schemas.OnboardingProcessStatusEnum.description
* `pending_agreement` - Pending Agreement
* `agreement_sent` - Agreement Sent
* `agreement_signed` - Agreement Signed
* `tracking_setup` - Tracking Setup
* `testing` - Testing
* `test_passed` - Test Passed
* `live` - Live
* `failed` - Failed

# components.schemas.OutreachMessageStatusEnum.description
* `draft` - Draft
* `scheduled` - Scheduled
* `sent` - Sent
* `opened` - Opened
* `replied` - Replied
* `bounced` - Bounced

# components.schemas.OwnerKindEnum.description
* `merchant` - Merchant
* `affiliate` - Affiliate
* `system` - System

# components.schemas.PatchedAffiliateNetworkIntegration.properties.affiliate.description
Managers may set explicitly; affiliates leave blank — the view locks it to their own row.

# components.schemas.PatchedAffiliateNetworkIntegration.properties.account_id.description
Public network identifier: Awin publisher_id / Impact sid / Partnerize publisher_id / Levanta creator_id.

# components.schemas.PatchedCampaignIntegration.description
Read-write serializer for CampaignIntegration.

`method`, `config`, `notes` and `health` are editable by managers; once a
manager touches it, `method_source` is forced to `manager_confirmed` so the
re-seeder respects their override.

# components.schemas.PatchedCampaignTrackingPixel.properties.landing_value_format.description
How the captured value maps back to a CW affiliate. e.g. affiliate_id, click_id, prefixed.

# components.schemas.PatchedCampaignTrackingPixel.properties.merchant_spec.description
Raw spec from the merchant (URL, params, samples, who sent it).

# components.schemas.PatchedMerchantNetworkIntegration.properties.merchant.description
Managers may set explicitly; merchants leave blank — the view + validate_merchant() locks it to their own row.

# components.schemas.PatchedMerchantNetworkIntegration.properties.account_id.description
Account/publisher/advertiser ID on the network.

# components.schemas.PatchedMerchantNetworkIntegration.properties.label.description
Friendly label so a merchant can keep multiple network accounts.

# components.schemas.PatchedUser.description
Read-only profile serializer for the current user.

# components.schemas.PatchedUser.properties.username.description
Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.

# components.schemas.PatchedUser.properties.is_superuser.description
Designates that this user has all permissions without explicitly assigning them.

# components.schemas.PatchedUser.properties.is_staff.description
Designates whether the user can log into this admin site.

# components.schemas.PatchedUser.properties.is_active.description
Designates whether this user should be treated as active. Unselect this instead of deleting accounts.

# components.schemas.PlanTypeEnum.description
* `network_project` - Network project
* `affiliate_pitch` - Affiliate pitch
* `merchant_activation` - Merchant activation
* `manager_workflow` - Manager workflow

# components.schemas.PriorityEnum.description
* `low` - Low
* `normal` - Normal
* `high` - High

# components.schemas.ProgramCatalog.description
Compact serializer used for list + detail of programs.

`cw_status` reflects whether CW has applied or been approved on the program.
`my_application_status` is the affiliate's own ApplicationRequest status if any.

# components.schemas.ProviderEnum.description
* `gemini` - Gemini
* `ollama` - Ollama
* `fallback` - Fallback

# components.schemas.RegionEnum.description
* `MENA` - MENA
* `EU` - EU
* `APAC` - APAC
* `LATAM` - LATAM
* `NA` - NA
* `GLOBAL` - GLOBAL

# components.schemas.SeverityEnum.description
* `low` - Low
* `medium` - Medium
* `high` - High
* `critical` - Critical

# components.schemas.SourceEnum.description
* `network_mining` - Network Mining
* `web_scrape` - Web Scrape
* `referral` - Referral
* `manual` - Manual
* `inbound` - Inbound

# components.schemas.StatusE51Enum.description
* `running` - Running
* `completed` - Completed
* `failed` - Failed

# components.schemas.StatusF4aEnum.description
* `new` - New
* `researching` - Researching
* `qualified` - Qualified
* `outreach` - Outreach
* `responded` - Responded
* `negotiating` - Negotiating
* `onboarding` - Onboarding
* `converted` - Converted
* `rejected` - Rejected
* `dormant` - Dormant

# components.schemas.TrackingMethodEnum.description
* `pixel` - Pixel
* `postback` - Postback
* `s2s` - Server-to-Server
* `api` - API
* `plugin` - Plugin

# components.schemas.User.description
Read-only profile serializer for the current user.

# components.schemas.User.properties.username.description
Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.

# components.schemas.User.properties.is_superuser.description
Designates that this user has all permissions without explicitly assigning them.

# components.schemas.User.properties.is_staff.description
Designates whether the user can log into this admin site.

# components.schemas.User.properties.is_active.description
Designates whether this user should be treated as active. Unselect this instead of deleting accounts.

# components.schemas.UserSummary.description
Compact user serializer for embedding in other objects.

# components.schemas.UserSummary.properties.username.description
Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.