pixellint

Nextdoor CAPI events need event_name, seconds, and a match key

event_name is a documented lowercase event. action_source is the channel. event_time_epoch is Unix seconds, a 10-digit value. customer needs hashed email, hashed phone_number, or click_id. website events need action_source_url and a raw client_user_agent. purchase needs custom.order_value as a currency code then the amount, such as USD49.99. IP and user agent are not hashed.

What this pack matches

Hosts
ads.nextdoor.com
Paths
/v2/api/conversions/track
Vendor docs
developer.nextdoor.com/reference/conversions-track

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
event_name required It is the conversion event name. Nextdoor documents a fixed lowercase set. Native JSON type: string. Fix: Set `event_name` to a documented value such as `purchase` or `page_view`. vendor.nextdoor-conversions-api.body.event_name.missing
vendor.nextdoor-conversions-api.body.event_name.empty
vendor.nextdoor-conversions-api.body.event_name.invalid
docs
action_source required It names the channel the conversion happened on. Native JSON type: string. Fix: Set `action_source` to a documented channel such as `website`. vendor.nextdoor-conversions-api.body.action_source.missing
vendor.nextdoor-conversions-api.body.action_source.empty
vendor.nextdoor-conversions-api.body.action_source.invalid
docs
event_id required It identifies the event so Pixel and CAPI can deduplicate. Native JSON type: string. Fix: Set `event_id` to the same deterministic id the Pixel sent. vendor.nextdoor-conversions-api.body.event_id.missing
vendor.nextdoor-conversions-api.body.event_id.empty
vendor.nextdoor-conversions-api.body.event_id.invalid
docs
event_time_epoch optional Unix seconds, not milliseconds. The current Data Types page defines Integer as signed32-bit. No arbitrary10-digit minimum is imposed. Native JSON type: integer. Minimum numeric value: -2147483648. Maximum numeric value: 2147483647. Fix: Send `event_time_epoch` as a 10-digit Unix timestamp in seconds. vendor.nextdoor-conversions-api.body.event_time_epoch.invalid docs
data_source_id required It is the Pixel ID. Nextdoor documents `data_source_id` and deprecated `pixel_id`. Native JSON type: string. Fix: Set `data_source_id` to the Pixel ID from Nextdoor Ads. vendor.nextdoor-conversions-api.body.data_source_id.missing
vendor.nextdoor-conversions-api.body.data_source_id.empty
vendor.nextdoor-conversions-api.body.data_source_id.invalid
docs
customer required It holds matching identifiers. Nextdoor documents it as required. Native JSON type: object. Fix: Send a `customer` object with at least one of hashed `email`, hashed `phone_number`, or `click_id`. vendor.nextdoor-conversions-api.body.customer.missing
vendor.nextdoor-conversions-api.body.customer.invalid
docs
action_source_url optional It is the page URL. Nextdoor documents it as required for website events. Native JSON type: string. Fix: Set `action_source_url` to the absolute page URL. vendor.nextdoor-conversions-api.body.action_source_url.empty
vendor.nextdoor-conversions-api.body.action_source_url.invalid
docs
customer.email optional It is the SHA-256 digest of the email after trim and lowercase. Value diagnostic severity: warning. Native JSON type: string. Fix: Trim, lowercase, SHA-256, and send 64 lowercase hex characters. vendor.nextdoor-conversions-api.body.customer.email.empty
vendor.nextdoor-conversions-api.body.customer.email.invalid
docs
customer.phone_number optional It is the SHA-256 digest of the phone number. Value diagnostic severity: warning. Native JSON type: string. Fix: Hash the ten-digit phone and send 64 lowercase hex characters. vendor.nextdoor-conversions-api.body.customer.phone_number.empty
vendor.nextdoor-conversions-api.body.customer.phone_number.invalid
docs
customer.click_id optional It is the `ndclid` from the Nextdoor click URL. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.click_id.empty
vendor.nextdoor-conversions-api.body.customer.click_id.invalid
docs
customer.client_user_agent optional It is the raw browser user agent. Nextdoor documents it as required for website events, and not hashed. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.client_user_agent.empty
vendor.nextdoor-conversions-api.body.customer.client_user_agent.invalid
docs
customer.client_ip_address optional It is the browser IP, IPv4 or IPv6, sent unhashed. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.client_ip_address.empty
vendor.nextdoor-conversions-api.body.customer.client_ip_address.invalid
docs
customer.first_name optional It is the SHA-256 digest of the first name after lowercase. Value diagnostic severity: warning. Native JSON type: string. Fix: Lowercase, SHA-256, and send 64 lowercase hex characters. vendor.nextdoor-conversions-api.body.customer.first_name.empty
vendor.nextdoor-conversions-api.body.customer.first_name.invalid
docs
customer.last_name optional It is the SHA-256 digest of the last name after lowercase. Value diagnostic severity: warning. Native JSON type: string. Fix: Lowercase, SHA-256, and send 64 lowercase hex characters. vendor.nextdoor-conversions-api.body.customer.last_name.empty
vendor.nextdoor-conversions-api.body.customer.last_name.invalid
docs
customer.date_of_birth optional Data Types explicitly uses YYYYMMDD; older Track examples hash this field. Plain date calendar validity is checked separately. Value diagnostic severity: warning. Native JSON type: string. Fix: Format as YYYYMMDD, SHA-256, and send 64 lowercase hex characters. vendor.nextdoor-conversions-api.body.customer.date_of_birth.empty
vendor.nextdoor-conversions-api.body.customer.date_of_birth.invalid
docs
customer.street_address optional It is the SHA-256 digest of the street address. Value diagnostic severity: warning. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.street_address.empty
vendor.nextdoor-conversions-api.body.customer.street_address.invalid
docs
customer.city optional It is the SHA-256 digest of the city after lowercase with no spaces. Value diagnostic severity: warning. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.city.empty
vendor.nextdoor-conversions-api.body.customer.city.invalid
docs
customer.state optional Preserve hashed fields in the Track example and explicit plain two-letter fields in Data Types. Registered country policy requires separate source reconciliation. Value diagnostic severity: warning. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.state.empty
vendor.nextdoor-conversions-api.body.customer.state.invalid
docs
customer.zip_code optional Data Types describes a plain string postal code. Preserve hashed strings in the Track example without requiring every postal code to be a digest. Value diagnostic severity: warning. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.zip_code.empty
vendor.nextdoor-conversions-api.body.customer.zip_code.invalid
docs
customer.country optional Preserve hashed fields in the Track example and explicit plain two-letter fields in Data Types. Registered country policy requires separate source reconciliation. Value diagnostic severity: warning. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.country.empty
vendor.nextdoor-conversions-api.body.customer.country.invalid
docs
customer.gender optional Data Types explicitly permits f/m; preserve the older hashed branch. Value diagnostic severity: warning. Native JSON type: string. Fix: Hash `f`, `m`, or `n` with SHA-256 and send 64 lowercase hex characters. vendor.nextdoor-conversions-api.body.customer.gender.empty
vendor.nextdoor-conversions-api.body.customer.gender.invalid
docs
customer.external_id optional It is the advertiser's own user id, such as a loyalty id. Native JSON type: string. vendor.nextdoor-conversions-api.body.customer.external_id.empty
vendor.nextdoor-conversions-api.body.customer.external_id.invalid
docs
custom.order_id optional It is the order ID for the transaction. Nextdoor documents it as required for offline events. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom.order_id.empty
vendor.nextdoor-conversions-api.body.custom.order_id.invalid
docs
custom.order_value optional The Track API example sends an amount string such as 100. The Data Types reference also documents Money strings such as USD 10. Native JSON type: string. Fix: Send a decimal amount string, optionally prefixed with an ISO currency code, such as 100 or USD 10. vendor.nextdoor-conversions-api.body.custom.order_value.empty
vendor.nextdoor-conversions-api.body.custom.order_value.invalid
docs
custom.delivery_category optional It names how the purchase was fulfilled. Nextdoor documents `in_store`, `curbside`, and `home_delivery`. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom.delivery_category.empty
vendor.nextdoor-conversions-api.body.custom.delivery_category.invalid
docs
custom.product_context[].id optional It is the product id on a `product_context` row. Nextdoor documents `id` on each product object. Native JSON type: string. Fix: Set `custom.product_context[].id` to the SKU or catalog id, or drop the empty pair. vendor.nextdoor-conversions-api.body.custom.product_context[].id.empty
vendor.nextdoor-conversions-api.body.custom.product_context[].id.invalid
docs
custom.product_context[].content_name optional It is the product name on a `product_context` row. Nextdoor lists `content_name` with `id`, `quantity`, and `item_price`. Native JSON type: string. Fix: Set `custom.product_context[].content_name` to the product name, or drop the empty pair. vendor.nextdoor-conversions-api.body.custom.product_context[].content_name.empty
vendor.nextdoor-conversions-api.body.custom.product_context[].content_name.invalid
docs
custom.product_context[].quantity optional It is the quantity of that product. Nextdoor documents `quantity` as an integer on each product object. Native JSON type: integer. Minimum numeric value: -2147483648. Maximum numeric value: 2147483647. Fix: Send `custom.product_context[].quantity` as a whole number, such as `2`. vendor.nextdoor-conversions-api.body.custom.product_context[].quantity.invalid docs
custom.product_context[].item_price optional It is the unit price of that product. The conversions/track example uses a decimal such as `5.99`. It is not a replacement for `custom.order_value`. Native JSON type: number. Fix: Send `custom.product_context[].item_price` as a number, such as `5.99`. Put the order total in `custom.order_value`. vendor.nextdoor-conversions-api.body.custom.product_context[].item_price.empty
vendor.nextdoor-conversions-api.body.custom.product_context[].item_price.invalid
docs
app.app_id optional It is the App Store or Google Play app id. Nextdoor documents the `app` object as required for app events. Native JSON type: string. Fix: Set `app.app_id` to the store app id. vendor.nextdoor-conversions-api.body.app.app_id.empty
vendor.nextdoor-conversions-api.body.app.app_id.invalid
docs
app.platform optional It is the mobile platform. Nextdoor documents `iOS` and `Android`. Native JSON type: string. Fix: Set `app.platform` to `iOS` or `Android`. vendor.nextdoor-conversions-api.body.app.platform.empty
vendor.nextdoor-conversions-api.body.app.platform.invalid
docs
app.app_version optional It is the mobile app version string. Native JSON type: string. vendor.nextdoor-conversions-api.body.app.app_version.empty
vendor.nextdoor-conversions-api.body.app.app_version.invalid
docs
app.app_tracking_enabled optional It is the ATT opt-in flag. Nextdoor documents a boolean. Native JSON type: boolean. Fix: Send `app.app_tracking_enabled` as `true` or `false`. vendor.nextdoor-conversions-api.body.app.app_tracking_enabled.empty
vendor.nextdoor-conversions-api.body.app.app_tracking_enabled.invalid
docs
restricted_data_usage optional When set, Nextdoor documents `1` (or `true`) to keep the event for reporting only. Native JSON type: integer or boolean or null. Fix: Send `restricted_data_usage` as an integer, such as `1`. vendor.nextdoor-conversions-api.body.restricted_data_usage.invalid docs
restricted_data_usage_country optional It associates a country with Limited Data Use. Nextdoor documents `1` for the United States. Native JSON type: integer or null. Fix: Set `restricted_data_usage_country` to `1`. vendor.nextdoor-conversions-api.body.restricted_data_usage_country.empty
vendor.nextdoor-conversions-api.body.restricted_data_usage_country.invalid
docs
restricted_data_usage_state optional It associates a US state with Limited Data Use. Nextdoor documents codes `1000` (California) through `1018` (Rhode Island). Native JSON type: integer or null. Fix: Set `restricted_data_usage_state` to a documented code such as `1000` for California. vendor.nextdoor-conversions-api.body.restricted_data_usage_state.empty
vendor.nextdoor-conversions-api.body.restricted_data_usage_state.invalid
docs
delivery_optimization optional True means the event may be used for optimization. False means attribution only. Native JSON type: boolean. Fix: Send `delivery_optimization` as `true` or `false`. vendor.nextdoor-conversions-api.body.delivery_optimization.empty
vendor.nextdoor-conversions-api.body.delivery_optimization.invalid
docs
event_timezone optional It is an optional timezone for where the conversion took place. Native JSON type: string. vendor.nextdoor-conversions-api.body.event_timezone.empty
vendor.nextdoor-conversions-api.body.event_timezone.invalid
docs
partner_id optional It names the integration vendor or agency partner. Nextdoor documents it as reference, not attribution. Native JSON type: string. vendor.nextdoor-conversions-api.body.partner_id.empty
vendor.nextdoor-conversions-api.body.partner_id.invalid
docs
test_event optional It flags a test conversion. Nextdoor documents a string such as `TEST1234`. Native JSON type: string. vendor.nextdoor-conversions-api.body.test_event.empty
vendor.nextdoor-conversions-api.body.test_event.invalid
docs
root optional Each event is a JSON object, rather than a scalar or list. Native JSON type: object. vendor.nextdoor-conversions-api.body.root.invalid docs
custom optional The vendor documents the JSON shape or value type of this field. Native JSON type: object. vendor.nextdoor-conversions-api.body.custom.invalid docs
app optional The vendor documents the JSON shape or value type of this field. Native JSON type: object. vendor.nextdoor-conversions-api.body.app.invalid docs
event_time deprecated The current Nextdoor reference explicitly marks this legacy field deprecated. Native JSON type: string. vendor.nextdoor-conversions-api.body.event_time.deprecated
vendor.nextdoor-conversions-api.body.event_time.empty
vendor.nextdoor-conversions-api.body.event_time.invalid
docs
client_id deprecated The current Nextdoor reference explicitly marks this legacy field deprecated. Native JSON type: string. vendor.nextdoor-conversions-api.body.client_id.deprecated
vendor.nextdoor-conversions-api.body.client_id.invalid
docs
pixel_id deprecated The current Nextdoor reference explicitly marks this legacy field deprecated. Native JSON type: string. vendor.nextdoor-conversions-api.body.pixel_id.deprecated
vendor.nextdoor-conversions-api.body.pixel_id.invalid
docs
custom.product_context optional The vendor documents the JSON shape or value type of this field. Native JSON type: array. vendor.nextdoor-conversions-api.body.custom.product_context.invalid docs
custom.product_context[] optional The vendor documents the JSON shape or value type of this field. Native JSON type: object. vendor.nextdoor-conversions-api.body.custom.product_context[].invalid docs
custom_data.order_id optional It is the order ID for the transaction. Nextdoor documents it as required for offline events. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom_data.order_id.empty
vendor.nextdoor-conversions-api.body.custom_data.order_id.invalid
docs
custom_data.order_value optional The Track API example sends an amount string such as 100. The Data Types reference also documents Money strings such as USD 10. Native JSON type: string. Fix: Send a decimal amount string, optionally prefixed with an ISO currency code, such as 100 or USD 10. vendor.nextdoor-conversions-api.body.custom_data.order_value.empty
vendor.nextdoor-conversions-api.body.custom_data.order_value.invalid
docs
custom_data.delivery_category optional It names how the purchase was fulfilled. Nextdoor documents `in_store`, `curbside`, and `home_delivery`. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom_data.delivery_category.empty
vendor.nextdoor-conversions-api.body.custom_data.delivery_category.invalid
docs
custom_data.product_context[].id optional It is the product id on a `product_context` row. Nextdoor documents `id` on each product object. Native JSON type: string. Fix: Set `custom.product_context[].id` to the SKU or catalog id, or drop the empty pair. vendor.nextdoor-conversions-api.body.custom_data.product_context[].id.empty
vendor.nextdoor-conversions-api.body.custom_data.product_context[].id.invalid
docs
custom_data.product_context[].content_name optional It is the product name on a `product_context` row. Nextdoor lists `content_name` with `id`, `quantity`, and `item_price`. Native JSON type: string. Fix: Set `custom.product_context[].content_name` to the product name, or drop the empty pair. vendor.nextdoor-conversions-api.body.custom_data.product_context[].content_name.empty
vendor.nextdoor-conversions-api.body.custom_data.product_context[].content_name.invalid
docs
custom_data.product_context[].quantity optional It is the quantity of that product. Nextdoor documents `quantity` as an integer on each product object. Native JSON type: integer. Minimum numeric value: -2147483648. Maximum numeric value: 2147483647. Fix: Send `custom.product_context[].quantity` as a whole number, such as `2`. vendor.nextdoor-conversions-api.body.custom_data.product_context[].quantity.invalid docs
custom_data.product_context[].item_price optional It is the unit price of that product. The conversions/track example uses a decimal such as `5.99`. It is not a replacement for `custom.order_value`. Native JSON type: number. Fix: Send `custom.product_context[].item_price` as a number, such as `5.99`. Put the order total in `custom.order_value`. vendor.nextdoor-conversions-api.body.custom_data.product_context[].item_price.empty
vendor.nextdoor-conversions-api.body.custom_data.product_context[].item_price.invalid
docs
custom_data optional The vendor documents the JSON shape or value type of this field. Native JSON type: object. vendor.nextdoor-conversions-api.body.custom_data.invalid docs
custom_data.product_context optional The vendor documents the JSON shape or value type of this field. Native JSON type: array. vendor.nextdoor-conversions-api.body.custom_data.product_context.invalid docs
custom_data.product_context[] optional The vendor documents the JSON shape or value type of this field. Native JSON type: object. vendor.nextdoor-conversions-api.body.custom_data.product_context[].invalid docs
custom.app_id optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom.app_id.invalid docs
custom.app_tracking_enabled optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: boolean. vendor.nextdoor-conversions-api.body.custom.app_tracking_enabled.invalid docs
custom.platform optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom.platform.invalid docs
custom.app_version optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom.app_version.invalid docs
custom.currency optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom.currency.empty
vendor.nextdoor-conversions-api.body.custom.currency.invalid
docs
custom_data.app_id optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom_data.app_id.invalid docs
custom_data.app_tracking_enabled optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: boolean. vendor.nextdoor-conversions-api.body.custom_data.app_tracking_enabled.invalid docs
custom_data.platform optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom_data.platform.invalid docs
custom_data.app_version optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom_data.app_version.invalid docs
custom_data.currency optional Optional published custom-data field. The Track and Data Types object spellings are both preserved. Native JSON type: string. vendor.nextdoor-conversions-api.body.custom_data.currency.empty
vendor.nextdoor-conversions-api.body.custom_data.currency.invalid
docs
opt_out optional Native JSON type: boolean. vendor.nextdoor-conversions-api.body.opt_out.invalid docs
event_source_url optional Native JSON type: string. vendor.nextdoor-conversions-api.body.event_source_url.empty
vendor.nextdoor-conversions-api.body.event_source_url.invalid
docs
body.user_needs_an_identifier required `customer` carries none of the match keys Nextdoor requires. Send hashed `email`, hashed `phone_number`, or `click_id`. Fix: Add at least one of hashed email, hashed phone, or `ndclid`. vendor.nextdoor-conversions-api.body.user_needs_an_identifier docs
body.website_requires_url required The event is `action_source: website` but carries no `action_source_url`. Nextdoor documents the page URL as required for website events. Fix: Set `action_source_url` to the absolute page URL. vendor.nextdoor-conversions-api.body.website_requires_url docs
body.website_requires_user_agent required The event is `action_source: website` but carries no `customer.client_user_agent`. Nextdoor documents the user agent as required for website CAPI events. Fix: Send the raw browser user agent in `customer.client_user_agent`. vendor.nextdoor-conversions-api.body.website_requires_user_agent docs
body.purchase_requires_order_value required Purchase requires an order value in one of the two published custom-data object variants. Fix: Send the order total as a decimal amount string, such as 100 or USD 10. vendor.nextdoor-conversions-api.body.purchase_requires_order_value docs
body.app_requires_app_id required App events need an app ID in one of the published app/custom-data variants. Fix: Set `app.app_id` to the App Store or Google Play app id. vendor.nextdoor-conversions-api.body.app_requires_app_id docs
body.unhashed_email required `customer.email` carries what looks like a raw email address. Nextdoor documents SHA-256 after trim and lowercase. Fix: Trim, lowercase, hash with SHA-256, and send the 64-character hex digest. vendor.nextdoor-conversions-api.body.unhashed_email docs
body.hashed_plaintext_field required This field looks like a SHA-256 digest, but Nextdoor documents `client_ip_address` and `client_user_agent` as unhashed. Fix: Send the raw IP address or user agent. vendor.nextdoor-conversions-api.body.hashed_plaintext_field docs
body.event_timestamp_required required The API requires epoch seconds or the legacy ISO timestamp. The legacy event_time field remains deprecated. vendor.nextdoor-conversions-api.body.event_timestamp_required docs
body.dob_calendar required The plain birth-date branch must be a calendar-valid YYYYMMDD date. Hashed birth dates preserve their separate branch. vendor.nextdoor-conversions-api.body.dob_calendar docs
body.submission_delay_recommended recommended Nextdoor recommends submitting conversions promptly within one hour. This is a data-quality recommendation, not an undocumented rejection window. vendor.nextdoor-conversions-api.body.submission_delay_recommended docs
body.legacy_submission_delay_recommended recommended Nextdoor recommends submitting conversions within one hour. event_time remains a deprecated supported alternative. vendor.nextdoor-conversions-api.body.legacy_submission_delay_recommended docs

Validate a payload

pixellint validate json @payload.json --rulepack vendor/nextdoor-conversions-api

Try this failing payload in the playground. Nextdoor CAPI order_value without a currency code.

{"event_name":"purchase","event_id":"order-123","event_time_epoch":1710438591,"action_source":"physical_store","data_source_id":"5b0b9e9a-156a-11ee-be56-0242ac120002","customer":{"click_id":"92dea472-8b8b-456f-8b5b-b2a55147c3cc"},"custom":{"order_value":"100","order_id":"100"}}

cargo install pixellint · npm install pixellint