AppsFlyer impression links need an app ID and media source.
The single-platform impression endpoint places the app ID in its path and the media source in pid. The pack checks published attribution parameters, length limits and view-through lookback forms.
A complete server-to-server capture can compare its user-agent header with the link value. Account ownership and attribution history require additional context.
Apply the contracts within their published source scope.
A complete server-to-server capture can compare its user-agent header with the link value. Account ownership and attribution history require additional context.
What this pack matches
Rules
Codes are stable. A finding in CI, MCP, or the playground lands on the same id.
| Field | Required | What it checks | Rule ids | Source |
|---|---|---|---|---|
app_id |
required | The published single-platform impression URL carries app-id. Android package name versus iOS store ownership needs account/platform context. | vendor.appsflyer-impression.param.app_id.missingvendor.appsflyer-impression.param.app_id.empty |
docs |
pid |
required | Required media-source identifier. The published link table limits its decoded value to150 characters. Reserved partner agreement requires account context. Maximum decoded characters: 150. Fix: Set pid to the media source name from the OneLink. | vendor.appsflyer-impression.param.pid.missingvendor.appsflyer-impression.param.pid.emptyvendor.appsflyer-impression.param.pid.invalid |
docs |
c |
optional | Optional campaign name. AppsFlyer replaces names longer than100 characters with c_name_exceeded_max_length; the limit is a warning because this is accepted input with altered reporting. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.c.emptyvendor.appsflyer-impression.param.c.invalid |
docs |
af_viewthrough_lookback |
optional | View-through ID matching uses 1 to 24 hours. OneLink also documents the equivalent 1d form. | vendor.appsflyer-impression.param.af_viewthrough_lookback.emptyvendor.appsflyer-impression.param.af_viewthrough_lookback.invalid |
docs |
af_prt |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 50. | vendor.appsflyer-impression.param.af_prt.invalid |
docs |
af_siteid |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 24. | vendor.appsflyer-impression.param.af_siteid.invalid |
docs |
af_c_id |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 24. | vendor.appsflyer-impression.param.af_c_id.invalid |
docs |
af_adset |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_adset.invalid |
docs |
af_adset_id |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 24. | vendor.appsflyer-impression.param.af_adset_id.invalid |
docs |
af_ad |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_ad.invalid |
docs |
af_ad_id |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 24. | vendor.appsflyer-impression.param.af_ad_id.invalid |
docs |
af_ad_type |
optional | Published naming conventions and24-character maximum. The raw-data dictionary also uses footer, so unlisted conventions are warnings. Maximum decoded characters: 24. | vendor.appsflyer-impression.param.af_ad_type.emptyvendor.appsflyer-impression.param.af_ad_type.invalid |
docs |
af_channel |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 20. | vendor.appsflyer-impression.param.af_channel.invalid |
docs |
af_engagement_destination |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 50. | vendor.appsflyer-impression.param.af_engagement_destination.invalid |
docs |
af_keywords |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_keywords.invalid |
docs |
af_cost_model |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 20. | vendor.appsflyer-impression.param.af_cost_model.invalid |
docs |
af_partner_account_id |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_partner_account_id.invalid |
docs |
af_og_title |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 40. | vendor.appsflyer-impression.param.af_og_title.invalid |
docs |
af_og_description |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 300. | vendor.appsflyer-impression.param.af_og_description.invalid |
docs |
advertising_id |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 40. | vendor.appsflyer-impression.param.advertising_id.invalid |
docs |
android_id |
optional | The published attribution link parameter table specifies this decoded character limit. Maximum decoded characters: 20. | vendor.appsflyer-impression.param.android_id.invalid |
docs |
idfa |
optional | The link specification requires an uppercase IDFA and a40-character maximum. Device ownership and platform selection require context. Maximum decoded characters: 40. | vendor.appsflyer-impression.param.idfa.emptyvendor.appsflyer-impression.param.idfa.invalid |
docs |
af_sub1 |
optional | Optional subscriber parameter with the published100-character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_sub1.invalid |
docs |
af_sub2 |
optional | Optional subscriber parameter with the published100-character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_sub2.invalid |
docs |
af_sub3 |
optional | Optional subscriber parameter with the published100-character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_sub3.invalid |
docs |
af_sub4 |
optional | Optional subscriber parameter with the published100-character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_sub4.invalid |
docs |
af_sub5 |
optional | Optional subscriber parameter with the published100-character limit. Maximum decoded characters: 100. | vendor.appsflyer-impression.param.af_sub5.invalid |
docs |
af_mp |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
clickid |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
af_sub_siteid |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
af_ua |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
af_os_version |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
af_model |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
deep_link_value |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
imei |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
oaid |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
fire_advertising_id |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
af_android_store_csl |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
af_ios_store_cpp |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
af_ref |
optional | Optional published attribution field. No closed value catalog or additional length is invented. | docs | |
deep_link_sub1 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub2 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub3 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub4 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub5 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub6 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub7 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub8 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub9 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
deep_link_sub10 |
optional | Optional app-defined deep-link metadata. The app selects the business semantics. | docs | |
af_force_deeplink |
optional | The documented URL flag uses literal true/false. Retargeting and redirect behavior depend on engagement context. | vendor.appsflyer-impression.param.af_force_deeplink.emptyvendor.appsflyer-impression.param.af_force_deeplink.invalid |
docs |
is_incentivized |
optional | The documented URL flag uses literal true/false. Retargeting and redirect behavior depend on engagement context. | vendor.appsflyer-impression.param.is_incentivized.emptyvendor.appsflyer-impression.param.is_incentivized.invalid |
docs |
af_param_forwarding |
optional | The documented URL flag uses literal true/false. Retargeting and redirect behavior depend on engagement context. | vendor.appsflyer-impression.param.af_param_forwarding.emptyvendor.appsflyer-impression.param.af_param_forwarding.invalid |
docs |
af_base_params_forward |
optional | The documented URL flag uses literal true/false. Retargeting and redirect behavior depend on engagement context. | vendor.appsflyer-impression.param.af_base_params_forward.emptyvendor.appsflyer-impression.param.af_base_params_forward.invalid |
docs |
redirect |
optional | The documented URL flag uses literal true/false. Retargeting and redirect behavior depend on engagement context. | vendor.appsflyer-impression.param.redirect.emptyvendor.appsflyer-impression.param.redirect.invalid |
docs |
is_retargeting |
optional | The documented URL flag uses literal true/false. Retargeting and redirect behavior depend on engagement context. | vendor.appsflyer-impression.param.is_retargeting.emptyvendor.appsflyer-impression.param.is_retargeting.invalid |
docs |
af_cost_currency |
optional | Optional current ISO4217 currency. USD is the vendor default, so cost values do not require an explicit currency. | vendor.appsflyer-impression.param.af_cost_currency.emptyvendor.appsflyer-impression.param.af_cost_currency.invalid |
docs |
af_cost_value |
optional | Only numerical digits and an optional decimal point are allowed; at most four fractional digits. | vendor.appsflyer-impression.param.af_cost_value.emptyvendor.appsflyer-impression.param.af_cost_value.invalid |
docs |
af_media_type |
optional | The published placement category is app or web. | vendor.appsflyer-impression.param.af_media_type.emptyvendor.appsflyer-impression.param.af_media_type.invalid |
docs |
af_ad_format |
optional | Published naming conventions are checked as a reporting advisory, without claiming this is a closed ingestion enum. | vendor.appsflyer-impression.param.af_ad_format.emptyvendor.appsflyer-impression.param.af_ad_format.invalid |
docs |
af_click_lookback |
optional | Published click window syntax. The vendor explicitly ignores this setting for impression URLs. | vendor.appsflyer-impression.param.af_click_lookback.emptyvendor.appsflyer-impression.param.af_click_lookback.invalid |
docs |
af_reengagement_window |
optional | The full parameter table permits1..90days,1..36hours or lifetime. Another OneLink page says hours up to23; preserve the broader documented branch and report the conflict. | vendor.appsflyer-impression.param.af_reengagement_window.emptyvendor.appsflyer-impression.param.af_reengagement_window.invalid |
docs |
af_ip |
optional | Optional device IP for S2S impressions. C2S applicability, X-Forwarded-For fallback and matching header require HTTP context. | vendor.appsflyer-impression.param.af_ip.emptyvendor.appsflyer-impression.param.af_ip.invalid |
docs |
af_video_total_length |
optional | Published numeric viewability field, in seconds or percentage. No source-unspecified duration equality or business floor is inferred. | vendor.appsflyer-impression.param.af_video_total_length.emptyvendor.appsflyer-impression.param.af_video_total_length.invalid |
docs |
af_video_played_length |
optional | Published numeric viewability field, in seconds or percentage. No source-unspecified duration equality or business floor is inferred. | vendor.appsflyer-impression.param.af_video_played_length.emptyvendor.appsflyer-impression.param.af_video_played_length.invalid |
docs |
af_playable_played_length |
optional | Published numeric viewability field, in seconds or percentage. No source-unspecified duration equality or business floor is inferred. | vendor.appsflyer-impression.param.af_playable_played_length.emptyvendor.appsflyer-impression.param.af_playable_played_length.invalid |
docs |
af_ad_time_viewed |
optional | Published numeric viewability field, in seconds or percentage. No source-unspecified duration equality or business floor is inferred. | vendor.appsflyer-impression.param.af_ad_time_viewed.emptyvendor.appsflyer-impression.param.af_ad_time_viewed.invalid |
docs |
af_ad_displayed_percent |
optional | Published numeric viewability field, in seconds or percentage. No source-unspecified duration equality or business floor is inferred. | vendor.appsflyer-impression.param.af_ad_displayed_percent.emptyvendor.appsflyer-impression.param.af_ad_displayed_percent.invalid |
docs |
af_audio_total_length |
optional | Published numeric viewability field, in seconds or percentage. No source-unspecified duration equality or business floor is inferred. | vendor.appsflyer-impression.param.af_audio_total_length.emptyvendor.appsflyer-impression.param.af_audio_total_length.invalid |
docs |
af_audio_played_length |
optional | Published numeric viewability field, in seconds or percentage. No source-unspecified duration equality or business floor is inferred. | vendor.appsflyer-impression.param.af_audio_played_length.emptyvendor.appsflyer-impression.param.af_audio_played_length.invalid |
docs |
af_r |
optional | Redirect targets must be full publicly accessible HTTPS URLs. Fragment identifiers are unsupported; public reachability and account allowlisting require external context. | vendor.appsflyer-impression.param.af_r.emptyvendor.appsflyer-impression.param.af_r.invalid |
docs |
af_web_dp |
optional | Redirect targets must be full publicly accessible HTTPS URLs. Fragment identifiers are unsupported; public reachability and account allowlisting require external context. | vendor.appsflyer-impression.param.af_web_dp.emptyvendor.appsflyer-impression.param.af_web_dp.invalid |
docs |
af_android_url |
optional | Redirect targets must be full publicly accessible HTTPS URLs. Fragment identifiers are unsupported; public reachability and account allowlisting require external context. | vendor.appsflyer-impression.param.af_android_url.emptyvendor.appsflyer-impression.param.af_android_url.invalid |
docs |
af_ios_url |
optional | Redirect targets must be full publicly accessible HTTPS URLs. Fragment identifiers are unsupported; public reachability and account allowlisting require external context. | vendor.appsflyer-impression.param.af_ios_url.emptyvendor.appsflyer-impression.param.af_ios_url.invalid |
docs |
af_og_image |
optional | Optional Open Graph preview image URL. | vendor.appsflyer-impression.param.af_og_image.emptyvendor.appsflyer-impression.param.af_og_image.invalid |
docs |
af_dp |
optional | A valid URI scheme is recommended. The application determines its default activity/base path, so custom schemes remain supported. | vendor.appsflyer-impression.param.af_dp.emptyvendor.appsflyer-impression.param.af_dp.invalid |
docs |
idfv |
optional | The link specification requires uppercase IDFV; no undocumented length bound is added. | vendor.appsflyer-impression.param.idfv.emptyvendor.appsflyer-impression.param.idfv.invalid |
docs |
sha1_advertising_id |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.sha1_advertising_id.emptyvendor.appsflyer-impression.param.sha1_advertising_id.invalid |
docs |
sha1_android_id |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.sha1_android_id.emptyvendor.appsflyer-impression.param.sha1_android_id.invalid |
docs |
sha1_imei |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.sha1_imei.emptyvendor.appsflyer-impression.param.sha1_imei.invalid |
docs |
sha1_oaid |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.sha1_oaid.emptyvendor.appsflyer-impression.param.sha1_oaid.invalid |
docs |
sha1_idfa |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.sha1_idfa.emptyvendor.appsflyer-impression.param.sha1_idfa.invalid |
docs |
sha1_idfv |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.sha1_idfv.emptyvendor.appsflyer-impression.param.sha1_idfv.invalid |
docs |
sha1_mac |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.sha1_mac.emptyvendor.appsflyer-impression.param.sha1_mac.invalid |
docs |
md5_advertising_id |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.md5_advertising_id.emptyvendor.appsflyer-impression.param.md5_advertising_id.invalid |
docs |
md5_android_id |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.md5_android_id.emptyvendor.appsflyer-impression.param.md5_android_id.invalid |
docs |
md5_imei |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.md5_imei.emptyvendor.appsflyer-impression.param.md5_imei.invalid |
docs |
md5_oaid |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.md5_oaid.emptyvendor.appsflyer-impression.param.md5_oaid.invalid |
docs |
md5_idfa |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.md5_idfa.emptyvendor.appsflyer-impression.param.md5_idfa.invalid |
docs |
md5_idfv |
optional | Published hashed identifier. The digest must contain the exact hexadecimal width of its named algorithm. Original source normalization and network support are external. | vendor.appsflyer-impression.param.md5_idfv.emptyvendor.appsflyer-impression.param.md5_idfv.invalid |
docs |
sha1_el |
optional | Published SHA1 email identifier for desktop-to-mobile attribution. | vendor.appsflyer-impression.param.sha1_el.emptyvendor.appsflyer-impression.param.sha1_el.invalid |
docs |
mac |
optional | Published device MAC field. Source gives no normalization spelling, so no guessed separator format is enforced. | docs | |
af_os |
deprecated | Deprecated but still supported, so presence is an advisory rather than a rejection. | vendor.appsflyer-impression.param.af_os.deprecated |
docs |
af_ios_fallback |
deprecated | Deprecated but still supported, so presence is an advisory rather than a rejection. | vendor.appsflyer-impression.param.af_ios_fallback.deprecated |
docs |
https_required |
required | AppsFlyer accepts only HTTPS incoming engagement traffic. | vendor.appsflyer-impression.https_required |
docs |
url_length |
required | The complete attribution URL must not exceed2000 characters. | vendor.appsflyer-impression.url_length |
docs |
pid_legal_characters |
required | These PID characters prevent attribution and deep linking. | vendor.appsflyer-impression.pid_legal_characters |
docs |
campaign_edge_whitespace |
recommended | Campaign names should not begin or end with whitespace because reporting may disagree. | vendor.appsflyer-impression.campaign_edge_whitespace |
docs |
partner_site_id |
recommended | Ad-network links should carry the publisher site ID. Custom owned-media impression examples omit it. | vendor.appsflyer-impression.partner_site_id |
docs |
method |
required | Complete HTTP capture contract. Native JSON type: string. | vendor.appsflyer-impression.http.method.missingvendor.appsflyer-impression.http.method.emptyvendor.appsflyer-impression.http.method.invalid |
docs |
query.af_ua |
optional | Complete HTTP capture contract. Native JSON type: string. | vendor.appsflyer-impression.http.query.af_ua.invalid |
docs |
headers.user-agent |
optional | Complete HTTP capture contract. Native JSON type: string. | vendor.appsflyer-impression.http.headers.user-agent.invalid |
docs |
http.user_agent_header |
required | S2S af_ua is sent both as URL parameter and HTTP User-Agent header. Complete HTTP capture contract. | vendor.appsflyer-impression.http.user_agent_header |
docs |
http.user_agent_agreement |
required | AppsFlyer requires identical user-agent values in the S2S URL and header. Complete HTTP capture contract. | vendor.appsflyer-impression.http.user_agent_agreement |
docs |
Validate a payload
pixellint validate url "$ARTIFACT" --rulepack vendor/appsflyer-impression
Or paste it into the playground. Same engine, in the browser, nothing sent anywhere.
cargo install pixellint
·
npm install pixellint