Quora conversions include checks for captured API requests.
Captured Quora CAPI requests receive advice for POST, a populated Bearer authorization header, JSON content type and body presence. These checks follow the pinned official server template and respect unavailable capture fields.
Empty user objects and events without click attribution remain permitted. Token validity, account ownership and complete receiver schema need external evidence. A bare pixel URL cannot establish its request body or headers.
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 |
|---|---|---|---|---|
account_id |
required | It is the Quora Ads account id. Quora documents it as required on the Conversion API request. Evidence: vendor template. Native JSON type: number. Fix: Set `account_id` to the Ads account id from Quora Ads Manager. | vendor.quora-conversions-api.body.account_id.missingvendor.quora-conversions-api.body.account_id.emptyvendor.quora-conversions-api.body.account_id.invalid |
docs |
conversion.event_name |
required | It is the conversion event name. Quora documents a fixed PixelCategory set on the Conversion API. Native JSON type: string. Fix: Use a documented name such as `Purchase` or `Generic`. | vendor.quora-conversions-api.body.conversion.event_name.missingvendor.quora-conversions-api.body.conversion.event_name.emptyvendor.quora-conversions-api.body.conversion.event_name.invalid |
docs |
conversion.click_id |
recommended | The official server-side template documents that events without qclid are accepted but cannot be attributed to an ad click. Native JSON type: string. Fix: Send `conversion.click_id` as the `qclid` from the landing-page URL or `quora_qclid` cookie. | vendor.quora-conversions-api.body.conversion.click_id.missingvendor.quora-conversions-api.body.conversion.click_id.emptyvendor.quora-conversions-api.body.conversion.click_id.invalid |
docs |
conversion.event_id |
optional | It identifies the event so Pixel and CAPI can deduplicate. Quora documents sharing the same `event_id` across both. Native JSON type: string. Fix: Send a stable `conversion.event_id` on both the pixel and the Conversion API call. | vendor.quora-conversions-api.body.conversion.event_id.emptyvendor.quora-conversions-api.body.conversion.event_id.invalid |
docs |
conversion.value |
optional | It is the conversion value. Quora's Conversion API tag sends it as a number. Evidence: vendor template. Native JSON type: number. Fix: Send a number such as `129.99`, with no currency symbol. | vendor.quora-conversions-api.body.conversion.value.invalid |
docs |
conversion.timestamp |
optional | It is the event time. Quora's Conversion API tag sends microseconds since epoch. Native JSON type: integer. Fix: Send an integer timestamp. The official tag uses microseconds. | vendor.quora-conversions-api.body.conversion.timestamp.emptyvendor.quora-conversions-api.body.conversion.timestamp.invalid |
docs |
device.user_agent |
optional | It is the device user agent. Quora's Conversion API tag sends it unhashed when the client provides it. Native JSON type: string. Fix: Send `device.user_agent`, or drop the empty pair. | vendor.quora-conversions-api.body.device.user_agent.emptyvendor.quora-conversions-api.body.device.user_agent.invalid |
docs |
device.referer |
optional | It is the page referrer. Quora's Conversion API tag uses the `referer` spelling. Native JSON type: string. Fix: Send `device.referer`, or drop the empty pair. | vendor.quora-conversions-api.body.device.referer.emptyvendor.quora-conversions-api.body.device.referer.invalid |
docs |
device.language |
optional | It is the device language. Quora's Conversion API tag sends it when the client provides it. Native JSON type: string. Fix: Send `device.language`, or drop the empty pair. | vendor.quora-conversions-api.body.device.language.emptyvendor.quora-conversions-api.body.device.language.invalid |
docs |
device.mobile_device_id |
optional | It is the mobile advertising id. Quora's Conversion API tag sends it when the client provides it. Native JSON type: string. Fix: Send `device.mobile_device_id`, or drop the empty pair. | vendor.quora-conversions-api.body.device.mobile_device_id.emptyvendor.quora-conversions-api.body.device.mobile_device_id.invalid |
docs |
root |
optional | Each event is a JSON object, rather than a scalar or list. Native JSON type: object. | vendor.quora-conversions-api.body.root.invalid |
docs |
conversion |
optional | The current official vendor reference documents this field. Evidence: vendor template. Native JSON type: object. | vendor.quora-conversions-api.body.conversion.invalid |
docs |
device |
optional | The current official vendor reference documents this field. Evidence: vendor template. Native JSON type: object. | vendor.quora-conversions-api.body.device.invalid |
docs |
user |
required | The official Quora server-side template identifies user as a required object and sends an empty object when no user data is mapped. Evidence: vendor template. Native JSON type: object. | vendor.quora-conversions-api.body.user.missingvendor.quora-conversions-api.body.user.invalid |
docs |
method |
required | The pinned official server template sends POST. This is transport advice, not a complete receiver method specification. Complete HTTP capture contract. Presence diagnostic severity: warning. Evidence: vendor template. | vendor.quora-conversions-api.http.method.missingvendor.quora-conversions-api.http.method.emptyvendor.quora-conversions-api.http.method.invalid |
docs |
headers.authorization |
recommended | The official template sends an opaque access token in Authorization: Bearer. Token contents, ownership and expiration remain external. Complete HTTP capture contract. Presence diagnostic severity: warning. Evidence: vendor template. Fix: Send Authorization: Bearer followed by your CAPI access token. Keep tokens out of browser code. | vendor.quora-conversions-api.http.headers.authorization.missingvendor.quora-conversions-api.http.headers.authorization.emptyvendor.quora-conversions-api.http.headers.authorization.invalid |
docs |
content_type |
recommended | The official server template serializes a JSON object and sets application/json. Complete HTTP capture contract. Presence diagnostic severity: warning. Evidence: vendor template. | vendor.quora-conversions-api.http.content_type.missingvendor.quora-conversions-api.http.content_type.emptyvendor.quora-conversions-api.http.content_type.invalid |
docs |
body |
required | The server template always includes a request body. Unavailable or unsupported captured bodies retain the engine capture-state rules. Complete HTTP capture contract. Presence diagnostic severity: warning. Evidence: vendor template. | vendor.quora-conversions-api.http.body.missing |
docs |
body_encoding |
required | Known decoded entities must be JSON for the reviewed producer. Unsupported compressed or multipart representations remain explicitly unvalidated. Complete HTTP capture contract. Applies when {"kind":"all","conditions":[{"kind":"not","condition":{"kind":"value_in","param":"body_encoding","values":["unsupported"]}},{"kind":"any","conditions":[{"kind":"value_in","param":"body_encoding","values":["none"]},{"kind":"value_in","param":"content_type","values":["application/json"]}]}]}. Presence diagnostic severity: warning. Evidence: vendor template. | vendor.quora-conversions-api.http.body_encoding.missingvendor.quora-conversions-api.http.body_encoding.emptyvendor.quora-conversions-api.http.body_encoding.invalid |
docs |
Validate a payload
pixellint validate request @request.json --rulepack vendor/quora-conversions-api
Try this failing payload in the playground. A Quora CAPI request without its authorization header.
{
"url": "https://api.quora.com/ads/v0/conversion",
"method": "POST",
"headers": {
"Content-Type": "application/json"
},
"body": "{\"account_id\": 123456, \"conversion\": {\"event_name\": \"Purchase\", \"click_id\": \"synthetic\"}, \"user\": {}}"
}
cargo install pixellint
·
npm install pixellint