Affise · AsyncAPI Specification
Affise Postbacks Webhooks
Version
View Spec
View on GitHub
Affiliate MarketingPerformance MarketingConversionsPublishersAnalyticsAttributionAsyncAPIWebhooksEvents
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.'