Affise · AsyncAPI Specification
Affise Postbacks Webhooks
Version
View Spec
View on GitHub
Affiliate MarketingPerformance MarketingConversionsPublishersAnalyticsAttributionAsyncAPIEvents
AsyncAPI Specification
generated: '2026-08-13'
method: searched
source: https://help-center.affise.com/en/articles/6466563-postback-integration-s2s-admins
sources:
- https://help-center.affise.com/en/articles/6466563-postback-integration-s2s-admins
- https://help-center.affise.com/en/articles/6483741-affiliate-postback-url-macros
- https://help-center.affise.com/en/articles/6483859-affiliate-postback-sending-logic
- https://help-center.affise.com/en/articles/6535165-http-codes-in-affiliates-postbacks
- https://help-center.affise.com/en/articles/7241212-postback-and-conversion-processing-on-affise
- openapi/affise-openapi.yml
spec_type: Webhooks
asyncapi_published: false
note: >-
Affise publishes NO AsyncAPI document, but it has a substantial, fully documented event
surface built on server-to-server postbacks — and it runs in BOTH directions. Inbound,
an advertiser fires a postback URL to notify Affise of a conversion. Outbound, Affise
fires the affiliate's postback URL to notify them of that same conversion. The outbound
leg is a webhook by every functional definition: a provider-initiated HTTP callback to
a subscriber-registered URL, with a documented payload vocabulary, documented delivery
semantics, documented retry behaviour, and CRUD API operations for managing the
subscriptions. It is modelled as URL-template macros in a GET query string rather than
as a signed JSON POST body, which is why it is captured as a webhook catalog rather
than as an AsyncAPI channel set. NEVER fabricated: every macro, status value, retry
rule and operation below is quoted from the provider's own reference.
transport:
style: url-template-macros
method: GET
payload_format: query-string
body: none
note: >-
The subscriber registers a URL containing Affise macros in braces
(e.g. https://partner.example/pb?cid={sub1}&payout={sum}&status={status}); Affise
substitutes values at fire time. There is no JSON body and no content-type negotiation.
security:
signature: none
hmac: none
shared_secret: none
ip_allowlist: not documented
replay_protection: none
note: >-
The most consequential gap on this surface. Outbound postbacks carry no signature or
shared secret, so a receiving affiliate cannot cryptographically verify that a
conversion notification came from Affise. Anyone who learns a postback URL shape can
forge one. Inbound advertiser postbacks are likewise authenticated only by possession
of the generated URL.
delivery:
ordering: not guaranteed
processing: asynchronous
acknowledgement: 'Affise responds to an inbound postback with the `status 1` envelope on RECEIPT'
at_least_once: true
note: >-
Inbound requests are queued rather than processed synchronously — "Upon receiving a
request, Affise server responds with status 1 response" and validation happens
afterwards. A 200 therefore means ACCEPTED, not APPLIED: a conversion can still be
rejected after Affise has already answered success.
retries:
attempts: 5
backoff: 'incremental, +2 seconds between attempts'
triggers: 'any 4xx or 5xx response from the affiliate endpoint (e.g. 404, 500)'
docs: https://help-center.affise.com/en/articles/6535165-http-codes-in-affiliates-postbacks
dead_letter: 'none — delivery outcomes are visible in the Affiliates postbacks statistics slice (Http code column)'
events:
- name: conversion
direction: outbound
description: >-
Fired to an affiliate's postback URL when a conversion is recorded or its status
changes. This is the only event type; everything else is a variation of it, selected
by conversion status, integration type and goal.
filters:
conversion_status:
- value: 1
name: Approved
- value: 2
name: Pending
- value: 3
name: Declined
- value: 5
name: Approved and put on Hold
integration_type: [all, default, 'Probabilistic Attribution']
goal: 'all offer goal values, or specific goals (local postbacks only)'
scopes:
- name: global postback
description: Configured per affiliate; fires for any offer.
- name: local postback
description: Configured per affiliate per offer; can additionally filter on goal value.
- name: consider global postback
description: >-
Fallback flag — when a conversion does not match the local postback's status,
integration type or goal, the system re-checks the global postback configuration.
docs: https://help-center.affise.com/en/articles/6483859-affiliate-postback-sending-logic
- name: advertiser conversion notification
direction: inbound
description: >-
The advertiser's server calls an Affise-generated postback URL to report that a user
completed the action. Configured per offer under Offers > offer > Postbacks.
docs: https://help-center.affise.com/en/articles/6474604-set-up-s2s-integration-with-advertisers
- name: cross-postback
direction: outbound
description: Forwards conversion data between Affise instances or to an external network.
docs: https://help-center.affise.com/en/articles/6593779-cross-postback-link
payload_vocabulary:
description: Affiliate postback URL macros — the full documented field set.
docs: https://help-center.affise.com/en/articles/6483741-affiliate-postback-url-macros
fields:
- {macro: '{status}', description: 'Conversion status: 1 Approved, 2 Pending, 3 Declined, 5 Approved and on Hold'}
- {macro: '{offerid}', description: Offer identifier in the system}
- {macro: '{offer_name}', description: Offer title}
- {macro: '{goal}', description: Goal}
- {macro: '{sum}', description: Conversion payout}
- {macro: '{currency}', description: Currency}
- {macro: '{order_sum}', description: "Conversion's price"}
- {macro: '{order_currency}', description: "Conversion's currency"}
- {macro: '{transactionid}', description: "Conversion identifier supplied by the advertiser — the de-duplication key"}
- {macro: '{date}', description: 'Conversion timestamp, y-m-d h:i:s'}
- {macro: '{date_only}', description: 'Conversion date, Y-m-d'}
- {macro: '{time}', description: 'Conversion time, H:i:s'}
- {macro: '{timestamp}', description: Unix timestamp of conversion creation}
- {macro: '{click_date}', description: 'Click timestamp, y-m-d h:i:s'}
- {macro: '{geo}', description: Country}
- {macro: '{city}', description: City}
- {macro: '{ip}', description: User IP address}
- {macro: '{uagent}', description: User agent}
- {macro: '{os}', description: OS family}
- {macro: '{os_id}', description: Additional OS macro}
- {macro: '{device_type}', description: 'One of mediahub, mobile, ereader, console, tv, tablet, desktop, smartwatch'}
- {macro: '{referrer}', description: Click referrer}
- {macro: '{fbclid}', description: Facebook click ID}
- {macro: '{promo_code}', description: Promo code}
- {macro: '{user_id}', description: ID of a user}
- {macro: '{comment}', description: Comment}
- {macro: '{rand}', description: 'Unique UUID per fire, e.g. 9cdf32d5-124e-4e06-b25b-4c92d3cec9dc'}
- {macro: '{ref_id}', description: Additional macro}
- {macro: '{sub1} - {sub8}', description: Sub accounts 1-8 — the click-id carrier}
- {macro: '{sub9} - {sub30}', description: Sub accounts 9-30, higher plan tiers only}
- {macro: '{ext1} - {ext3}', description: Additional pass-through macros}
- {macro: '{custom_field1} - {custom_field7}', description: 'Additional macros (also spelled {custom_field_1}-{custom_field_7})'}
caveat: >-
There is deliberately NO {clickid} macro on affiliate postbacks. Affise documents that
the click identifier must be round-tripped through {sub1}-{sub8}, which is a real
integration trap for anyone porting from another network.
management_api:
description: Postback and pixel subscriptions are managed through the REST API.
operations:
- 'GET /3.0/admin/postbacks — Affiliate postbacks list'
- 'POST /3.0/partner/postback — Add partner postback'
- 'POST /3.0/partner/postback/{id} — Edit partner postback'
- 'DELETE /3.0/partner/postback/{id}/remove — Delete partner postback'
- 'DELETE /3.0/partner/postbacks/by-offers — Bulk delete by offer ids'
- 'DELETE /3.0/partner/postbacks/by-affiliates — Bulk delete by affiliate ids'
- 'GET /3.0/partner/pixels — Pixel list'
- 'POST /3.0/partner/pixel — Pixel add (operationId addPartnerPixel)'
- 'POST /3.0/partner/pixel/{id} — Pixel edit'
- 'DELETE /3.0/partner/pixel/{id}/remove — Pixel remove'
spec: openapi/affise-openapi.yml
observability:
operations:
- 'GET /3.0/stats/affiliatepostbacks — outbound delivery log with the affiliate server''s HTTP code'
- 'GET /3.0/stats/serverpostbacks — inbound advertiser postback log'
docs: https://help-center.affise.com/en/articles/6476530-affiliate-postbacks-in-statistics
alternative_integration:
- name: Pixel (C2S) integration
description: Client-side conversion tracking where an S2S postback is not possible.
docs: https://help-center.affise.com/en/articles/6471868-pixel-integration-c2s-admins
gaps:
- no_asyncapi: 'No AsyncAPI document is published for this event surface.'
- no_signature: 'No HMAC or signing key on outbound postbacks — receivers cannot verify origin.'
- no_json_payload: 'Query-string macros only; no structured event body or schema to validate against.'
- no_event_types: 'One event (conversion), differentiated by status codes rather than named event types.'
Work with this as data
Every AsyncAPI spec here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for asyncapi
4 MCP tools reach this
find_asyncapisBrowse and filter every AsyncAPI spec in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This AsyncAPI spec
curl "https://apis.io/api/v1/asyncapis/affise-postbacks-webhooks"
All asyncapi
curl "https://apis.io/api/v1/asyncapis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.