---
title: "Track a conversion event"
method: POST
path: "/v1/conversions/events"
tags: ["conversions"]
---

# Track a conversion event

`POST /v1/conversions/events`

## Request body

- object
  - `action` 'PURCHASE' | 'STORE_PURCHASE' | 'TICKET_PURCHASE' | 'CHECK_IN' | 'ADD_TO_CART' | 'LINK_CLICK' | 'UPSELL_CLICK' | 'UPSELL_REMINDER_CLICK' | 'VIP_CLICK' | 'RSVP' | 'OPT_OUT' | 'DIRECT_MESSAGE' | 'CALL' | 'FOLLOW' | 'SOCIAL_ENGAGEMENT' | 'WAITLIST_SIGNUP' | 'SECONDARY_LISTING_CREATED' | 'ABANDONED_CART_CLICK' | 'TICKET_SALES_CLICK' | 'ABANDONED_CART_CREATED' | 'ABANDONED_CART_UPDATED' | 'FORM_SUBMISSION' | 'QUESTION_RESPONSE', required — The action represented by the conversion.
  - `consentGrantedAt` string, date-time — When marketing consent was granted, in ISO 8601 with an explicit UTC offset.
  - `createNeoRecord` boolean — Whether downstream processing should create the conversion event in Laylo data.
  - `metadata` object, required — Integration-defined event metadata. `uniqueId` is the idempotency key; `productId`, `currency`, `totalCost`, and `totalPrice` are recognized fields.
  - `name` string, required — A non-empty, human-readable event name.
  - `sessionId` string — Optional integration session identifier.
  - `source` string — Optional name of the integration source.
  - `timestamp` string, date-time, required — When the event occurred, in ISO 8601 with an explicit UTC offset.
  - `user` object, required — The event subject. Supply a valid email, E.164 phone number, or a non-anonymous fingerprint ID.
    - `email` string, email — Optional email address for the event subject.
    - `emailMarketingConsent` boolean — Whether the subject consented to email marketing.
    - `fingerprintId` string — Optional non-anonymous browser or device identifier.
    - `isAnonymous` boolean — Whether the subject is anonymous.
    - `marketingConsent` boolean — Deprecated consent flag that applies to both email and SMS marketing.
    - `phone` string — Optional E.164 phone number including the national code, for example +12025550100.
    - `smsMarketingConsent` boolean — Whether the subject consented to SMS marketing.

## Response `200`

Whether the event was accepted by the stream. The safe echo omits submitted contact fields.

- object
  - `status` 'success' | 'failure', required — Whether the event was accepted by the stream.
  - `tracked` object, required — The accepted event with contact fields omitted.
    - `action` 'PURCHASE' | 'STORE_PURCHASE' | 'TICKET_PURCHASE' | 'CHECK_IN' | 'ADD_TO_CART' | 'LINK_CLICK' | 'UPSELL_CLICK' | 'UPSELL_REMINDER_CLICK' | 'VIP_CLICK' | 'RSVP' | 'OPT_OUT' | 'DIRECT_MESSAGE' | 'CALL' | 'FOLLOW' | 'SOCIAL_ENGAGEMENT' | 'WAITLIST_SIGNUP' | 'SECONDARY_LISTING_CREATED' | 'ABANDONED_CART_CLICK' | 'TICKET_SALES_CLICK' | 'ABANDONED_CART_CREATED' | 'ABANDONED_CART_UPDATED' | 'FORM_SUBMISSION' | 'QUESTION_RESPONSE', required — The action represented by the conversion.
    - `consentGrantedAt` string, date-time — Optional marketing-consent time.
    - `createNeoRecord` boolean — Whether downstream creation is enabled.
    - `metadata` object, required — Accepted event metadata.
    - `name` string, required — Accepted event name.
    - `sessionId` string — Optional accepted session identifier.
    - `source` string — Optional accepted source.
    - `timestamp` string, date-time, required — Accepted event time.
    - `user` object, required — Safe summary of the event subject.
      - `emailMarketingConsent` boolean — Accepted email-marketing consent.
      - `fingerprintId` string — Optional accepted fingerprint identifier.
      - `hasEmail` boolean, required — Whether an email was accepted.
      - `hasPhone` boolean, required — Whether a phone number was accepted.
      - `isAnonymous` boolean — Whether the subject is anonymous.
      - `marketingConsent` boolean — Accepted legacy marketing consent.
      - `smsMarketingConsent` boolean — Accepted SMS-marketing consent.

## Other responses

- `400` — The request body is malformed.
- `401` — The integrator credential or customer API key is invalid.
- `403` — The customer account behind the API key has no paid Laylo plan.
- `404` — No route matches the requested path.
- `405` — The path exists, but the HTTP method is not supported.
- `429` — The per-integrator rate limit for this operation is exceeded.
- `500` — An unexpected server error occurred.

---

[API](https://skmtc.dev/laylo/apis/laylo-api.md) · [All operations](https://skmtc.dev/laylo/apis/laylo-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/laylo/laylo-api/revisions/000d81a01b74/schema)
