> For the complete documentation index, see [llms.txt](https://docs.thewalletcrew.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.thewalletcrew.io/api-reference/extensions/klaviyo.md).

# Klaviyo

## Get Klaviyo settings

> Returns the Klaviyo configuration of the tenant. The private API key is never returned;\
> \`hasPrivateApiKey\` tells whether one is stored.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Klaviyo"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.klaviyo.settings:read"]},{"apiKey":[]}],"components":{"securitySchemes":{"admin-bearer":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.neostore.cloud/authorize?audience=https://app.neostore.cloud/api/","scopes":{}}}},"apiKey":{"type":"apiKey","name":"X-API-KEY","in":"header"}},"schemas":{"KlaviyoConfigurationResponse":{"required":["enableSmsSupport","hasPrivateApiKey","siteId"],"type":"object","properties":{"siteId":{"minLength":1,"type":"string","description":"Klaviyo public API key, also called site ID, as last saved."},"listId":{"type":["null","string"],"description":"Klaviyo list the account's consents are synchronised to; `builtin` for Klaviyo's built-in consents\nwithout a list; null when the account's consents are not synchronised. See Neo.Extensions.Klaviyo.Controllers.SetKlaviyoRequest.ListId."},"enableSmsSupport":{"type":"boolean","description":"Whether the account's `consents_sms` consent is synchronised to Klaviyo, in addition to the email consent."},"hasPrivateApiKey":{"type":"boolean","description":"Whether a private API key is stored. When true, a save may omit `privateApiKey` to keep it."}},"additionalProperties":false,"description":"The stored Klaviyo connection of the tenant, without its private API key."},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"type":["null","integer"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}},"additionalProperties":{}},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":{}}}},"paths":{"/api/{tenantId}/admin/extensions/klaviyo":{"get":{"tags":["Klaviyo"],"summary":"Get Klaviyo settings","description":"Returns the Klaviyo configuration of the tenant. The private API key is never returned;\n`hasPrivateApiKey` tells whether one is stored.","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Configuration returned.","content":{"text/plain":{"schema":{"description":"The stored Klaviyo connection of the tenant, without its private API key.","$ref":"#/components/schemas/KlaviyoConfigurationResponse"}},"application/json":{"schema":{"description":"The stored Klaviyo connection of the tenant, without its private API key.","$ref":"#/components/schemas/KlaviyoConfigurationResponse"}},"text/json":{"schema":{"description":"The stored Klaviyo connection of the tenant, without its private API key.","$ref":"#/components/schemas/KlaviyoConfigurationResponse"}}}},"401":{"description":"The caller is not authenticated.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"The caller lacks the <c>tenant.klaviyo.settings:read</c> scope.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Klaviyo is not configured for this tenant.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"429":{"description":"Over 1200 requests per minute to this endpoint for the tenant (default limit); retry after <c>Retry-After</c>.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent when the limiter knows it.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}}}}}}
```

## Update Klaviyo settings

> Creates or replaces the Klaviyo configuration. Every field is written as sent: an omitted \`listId\`\
> clears the stored one and an omitted \`enableSmsSupport\` turns SMS synchronisation off.\
> Omit \`privateApiKey\` to keep the stored private API key.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Klaviyo"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.klaviyo.settings:write"]},{"apiKey":[]}],"components":{"securitySchemes":{"admin-bearer":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.neostore.cloud/authorize?audience=https://app.neostore.cloud/api/","scopes":{}}}},"apiKey":{"type":"apiKey","name":"X-API-KEY","in":"header"}},"schemas":{"SetKlaviyoRequest":{"required":["siteId"],"type":"object","properties":{"siteId":{"minLength":1,"type":"string","description":"Klaviyo public API key, also called site ID. Missing or empty is refused with a 400."},"listId":{"type":["null","string"],"description":"Klaviyo list the holder is subscribed to or unsubscribed from when the account's `consents_email`\n(and, with `enableSmsSupport`, `consents_sms`) consent is set."},"enableSmsSupport":{"type":"boolean","description":"When true, the account's `consents_sms` consent is also synchronised to Klaviyo for the holder's\nphone number; when false, only the email consent is. Default false.","default":false},"privateApiKey":{"type":["null","string"],"description":"Klaviyo private API key. Never returned.\nOmitted, null or blank keeps the stored key; refused with a 400 when no key is stored yet."}},"additionalProperties":false,"description":"The Klaviyo connection of the tenant. A save replaces the stored configuration as a whole."},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"type":["null","integer"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}},"additionalProperties":{}},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":{}}}},"paths":{"/api/{tenantId}/admin/extensions/klaviyo":{"put":{"tags":["Klaviyo"],"summary":"Update Klaviyo settings","description":"Creates or replaces the Klaviyo configuration. Every field is written as sent: an omitted `listId`\nclears the stored one and an omitted `enableSmsSupport` turns SMS synchronisation off.\nOmit `privateApiKey` to keep the stored private API key.","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The configuration to store.","content":{"application/json":{"schema":{"description":"The Klaviyo connection of the tenant. A save replaces the stored configuration as a whole.","$ref":"#/components/schemas/SetKlaviyoRequest"}},"text/json":{"schema":{"description":"The Klaviyo connection of the tenant. A save replaces the stored configuration as a whole.","$ref":"#/components/schemas/SetKlaviyoRequest"}},"application/*+json":{"schema":{"description":"The Klaviyo connection of the tenant. A save replaces the stored configuration as a whole.","$ref":"#/components/schemas/SetKlaviyoRequest"}}},"required":true},"responses":{"204":{"description":"Configuration saved."},"400":{"description":"The body or `siteId` is missing, or `privateApiKey` is omitted while no key is stored yet.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"401":{"description":"The caller is not authenticated.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"The caller lacks the <c>tenant.klaviyo.settings:write</c> scope.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"429":{"description":"Over 1200 requests per minute to this endpoint for the tenant (default limit); retry after <c>Retry-After</c>.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent when the limiter knows it.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}}}}}}
```

## Update pass from Klaviyo

> Target of a Klaviyo flow webhook action. Finds the pass by \`identifiers\` and accepts an update with\
> the given pass template, additional data and metadata option; the pass is then updated and refreshed on\
> the holder's devices shortly after the answer.\
> &#x20;           \
> Same changes as \`PATCH /api/{tenantId}/passes\` with \`options.bypassQueue\` false. The Klaviyo\
> listener must be enabled for the tenant.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Klaviyo"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.klaviyo.listener:write"]},{"apiKey":[]}],"components":{"securitySchemes":{"admin-bearer":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.neostore.cloud/authorize?audience=https://app.neostore.cloud/api/","scopes":{}}}},"apiKey":{"type":"apiKey","name":"X-API-KEY","in":"header"}},"schemas":{"PushUpdateData":{"required":["identifiers"],"type":"object","properties":{"identifiers":{"type":"object","additionalProperties":{"type":"string"},"description":"Identifies the one pass to update. Either `id` alone (the pass id), or one or more external\nidentifiers prefixed with `id.`, e.g. `{ \"id.customerId\": \"12345\" }`; a pass must match all of them."},"passType":{"type":["null","string"],"description":"Pass template to move the pass to. Must be declared for the tenant, or the request is refused with a 400.\nNull or omitted keeps the current pass template."},"additionalData":{"type":["null","object"],"additionalProperties":{},"description":"Values merged into the pass's additional data, which pass templates and scripts read.\nKeys not sent keep their current value. Null or omitted changes nothing."},"updateMetadata":{"type":"boolean","description":"When true, the update also re-reads the holder's data from the tenant's connected systems and\nrecomputes the stored pass metadata. Slower; leave false when the payload carries everything. Default false.","default":false}},"additionalProperties":false,"description":"The pass a Klaviyo webhook targets and the change to apply to it."},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"type":["null","integer"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}},"additionalProperties":{}},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":{}}}},"paths":{"/api/{tenantId}/webhooks/listeners/klaviyo/passes/pushUpdate":{"post":{"tags":["Klaviyo"],"summary":"Update pass from Klaviyo","description":"Target of a Klaviyo flow webhook action. Finds the pass by `identifiers` and accepts an update with\nthe given pass template, additional data and metadata option; the pass is then updated and refreshed on\nthe holder's devices shortly after the answer.\n            \nSame changes as `PATCH /api/{tenantId}/passes` with `options.bypassQueue` false. The Klaviyo\nlistener must be enabled for the tenant.","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The pass to update and the change to apply.","content":{"application/json":{"schema":{"description":"The pass a Klaviyo webhook targets and the change to apply to it.","$ref":"#/components/schemas/PushUpdateData"}},"text/json":{"schema":{"description":"The pass a Klaviyo webhook targets and the change to apply to it.","$ref":"#/components/schemas/PushUpdateData"}},"application/*+json":{"schema":{"description":"The pass a Klaviyo webhook targets and the change to apply to it.","$ref":"#/components/schemas/PushUpdateData"}}}},"responses":{"202":{"description":"Update accepted."},"400":{"description":"The body is invalid, `id` is combined with other identifiers, or `passType` is not declared for the tenant.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"401":{"description":"The caller is not authenticated.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"The caller lacks the `tenant.klaviyo.listener:write` scope, or the Klaviyo listener is not enabled for the tenant.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"No pass matches the identifiers.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"429":{"description":"Over 1200 requests per minute to this endpoint for the tenant (default limit); retry after <c>Retry-After</c>.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent when the limiter knows it.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}}}}}}
```

## Synchronize Klaviyo profile

> Accepts the request and answers at once, with no body; the synchronisation completes shortly after.\
> The holder is looked up by \`email\` and \`phone\_number\` in the tenant's customer systems, then\
> Klaviyo receives a profile-synchronized event and, for each pass matching one of the holder's\
> identifiers, a \`Wallet Installed\` event per platform (Apple, Google) the pass is installed on,\
> dated at its installation.\
> &#x20;           \
> The Klaviyo listener must be enabled for the tenant.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Klaviyo"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.klaviyo.listener:write"]},{"apiKey":[]}],"components":{"securitySchemes":{"admin-bearer":{"type":"oauth2","flows":{"implicit":{"authorizationUrl":"https://auth.neostore.cloud/authorize?audience=https://app.neostore.cloud/api/","scopes":{}}}},"apiKey":{"type":"apiKey","name":"X-API-KEY","in":"header"}},"schemas":{"Profile":{"type":"object","properties":{"email":{"type":["null","string"],"description":"Email address of the profile; looks up the holder in the tenant's customer systems."},"phone_number":{"type":["null","string"],"description":"Phone number of the profile; looks up the holder in the tenant's customer systems, alongside or\ninstead of `email`."}},"additionalProperties":false,"description":"The Klaviyo profile to synchronise, as a Klaviyo webhook sends it (snake_case names)."},"ProblemDetails":{"type":"object","properties":{"type":{"type":["null","string"]},"title":{"type":["null","string"]},"status":{"type":["null","integer"],"format":"int32"},"detail":{"type":["null","string"]},"instance":{"type":["null","string"]}},"additionalProperties":{}},"HttpValidationProblemDetails":{"type":"object","allOf":[{"$ref":"#/components/schemas/ProblemDetails"}],"properties":{"errors":{"type":"object","additionalProperties":{"type":"array","items":{"type":"string"}}}},"additionalProperties":{}}}},"paths":{"/api/{tenantId}/webhooks/listeners/klaviyo/profiles/sync":{"post":{"tags":["Klaviyo"],"summary":"Synchronize Klaviyo profile","description":"Accepts the request and answers at once, with no body; the synchronisation completes shortly after.\nThe holder is looked up by `email` and `phone_number` in the tenant's customer systems, then\nKlaviyo receives a profile-synchronized event and, for each pass matching one of the holder's\nidentifiers, a `Wallet Installed` event per platform (Apple, Google) the pass is installed on,\ndated at its installation.\n            \nThe Klaviyo listener must be enabled for the tenant.","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The Klaviyo profile to synchronise.","content":{"application/json":{"schema":{"description":"The Klaviyo profile to synchronise, as a Klaviyo webhook sends it (snake_case names).","$ref":"#/components/schemas/Profile"}},"text/json":{"schema":{"description":"The Klaviyo profile to synchronise, as a Klaviyo webhook sends it (snake_case names).","$ref":"#/components/schemas/Profile"}},"application/*+json":{"schema":{"description":"The Klaviyo profile to synchronise, as a Klaviyo webhook sends it (snake_case names).","$ref":"#/components/schemas/Profile"}}}},"responses":{"200":{"description":"Synchronisation accepted."},"400":{"description":"The body is missing or is not valid JSON.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"401":{"description":"The caller is not authenticated.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"403":{"description":"The caller lacks the `tenant.klaviyo.listener:write` scope, or the Klaviyo listener is not enabled for the tenant.","content":{"text/plain":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}},"text/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"429":{"description":"Over 6000 requests per minute to this endpoint for the tenant (default limit); retry after <c>Retry-After</c>.","headers":{"Retry-After":{"description":"Seconds to wait before retrying. Sent when the limiter knows it.","schema":{"type":"integer"}}},"content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}}}}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.thewalletcrew.io/api-reference/extensions/klaviyo.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
