> 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/actito.md).

# Actito

## Get the Actito configuration

> Returns the current Actito configuration for this tenant.\
> The API key is never returned; the response contains \`hasApiKey\` instead.\
> Returns 404 when Actito is not configured.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Actito"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.actito.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":{"ActitoConfigurationResponse":{"required":["actitoExternalIdentifier","entity","hasApiKey","profileTableName","server","twcExternalIdentifier"],"type":"object","properties":{"server":{"type":"string","description":"Root URL of the Actito API domain the entity lives on.","format":"uri"},"entity":{"minLength":1,"type":"string","description":"Name of the Actito entity the integration works in."},"profileTableName":{"minLength":1,"type":"string","description":"Name of the Actito profile table the holders' profiles are read from."},"actitoExternalIdentifier":{"minLength":1,"type":"string","description":"Attribute of the profile table matched against the pass identifier Neo.Extensions.Actito.Controllers.ActitoConfigurationResponse.TwcExternalIdentifier."},"twcExternalIdentifier":{"minLength":1,"type":"string","description":"Name of the pass identifier matched against Neo.Extensions.Actito.Controllers.ActitoConfigurationResponse.ActitoExternalIdentifier."},"hasApiKey":{"type":"boolean","description":"Whether an API key is stored. When true, a PUT may omit `apiKey` to keep it."}},"additionalProperties":false,"description":"The tenant's Actito connection, without the 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/actito":{"get":{"tags":["Actito"],"summary":"Get the Actito configuration","description":"Returns the current Actito configuration for this tenant.\nThe API key is never returned; the response contains `hasApiKey` instead.\nReturns 404 when Actito is not configured.","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Configuration returned.","content":{"text/plain":{"schema":{"description":"The tenant's Actito connection, without the API key.","$ref":"#/components/schemas/ActitoConfigurationResponse"}},"application/json":{"schema":{"description":"The tenant's Actito connection, without the API key.","$ref":"#/components/schemas/ActitoConfigurationResponse"}},"text/json":{"schema":{"description":"The tenant's Actito connection, without the API key.","$ref":"#/components/schemas/ActitoConfigurationResponse"}}}},"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.actito.settings:read</c> scope.","content":{"application/problem+json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ProblemDetails"},{"$ref":"#/components/schemas/HttpValidationProblemDetails"}]}}}},"404":{"description":"Actito 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"}]}}}}}}}}}
```

## Set Actito configuration

> Creates or replaces the Actito configuration.\
> Omit \`apiKey\` to keep the saved API key.\
> Returns 400 if the API key is missing and none was saved before.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Actito"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.actito.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":{"SetActitoRequest":{"required":["actitoExternalIdentifier","entity","profileTableName","server","twcExternalIdentifier"],"type":"object","properties":{"server":{"type":"string","description":"Root URL of the Actito API domain the entity lives on, e.g. `https://api3.actito.com`.","format":"uri"},"entity":{"minLength":1,"type":"string","description":"Name of the Actito entity that holds the profile table, and in which the integration keeps its wallet\nand pass template tables, custom actions and webhook subscriptions."},"profileTableName":{"minLength":1,"type":"string","description":"Name of the Actito profile table the holders' profiles are read from."},"actitoExternalIdentifier":{"minLength":1,"type":"string","description":"Attribute of the profile table that carries the holder identifier shared with The Wallet Crew, e.g.\n`customerId`. Its value is matched against the pass identifier named by\nNeo.Extensions.Actito.Controllers.SetActitoRequest.TwcExternalIdentifier."},"twcExternalIdentifier":{"minLength":1,"type":"string","description":"Name of the pass identifier matched against Neo.Extensions.Actito.Controllers.SetActitoRequest.ActitoExternalIdentifier, e.g.\n`y2.customerId`. A pass without this identifier is never linked to an Actito profile."},"apiKey":{"type":["null","string"],"description":"API key generated in the \"Manage API users\" page of the Actito portal. Never returned."}},"additionalProperties":false,"description":"Connection to the tenant's Actito entity, and how an Actito profile is matched to the holder's passes."},"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/actito":{"put":{"tags":["Actito"],"summary":"Set Actito configuration","description":"Creates or replaces the Actito configuration.\nOmit `apiKey` to keep the saved API key.\nReturns 400 if the API key is missing and none was saved before.","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"description":"Connection to the tenant's Actito entity, and how an Actito profile is matched to the holder's passes.","$ref":"#/components/schemas/SetActitoRequest"}},"text/json":{"schema":{"description":"Connection to the tenant's Actito entity, and how an Actito profile is matched to the holder's passes.","$ref":"#/components/schemas/SetActitoRequest"}},"application/*+json":{"schema":{"description":"Connection to the tenant's Actito entity, and how an Actito profile is matched to the holder's passes.","$ref":"#/components/schemas/SetActitoRequest"}}},"required":true},"responses":{"204":{"description":"Configuration saved."},"400":{"description":"Request body is invalid or an API key is required but missing.","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.actito.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"}]}}}}}}}}}
```

## Write a value on a holder's passes from an Actito scenario

> Called by Actito when the integration's custom action runs. Finds every pass whose\
> \`twcExternalIdentifier\` identifier equals the profile's \`actitoExternalIdentifier\` attribute,\
> sets the \`actito\_{key}\` additional data to the action's value, saves each pass and pushes it to the\
> wallets, then posts to the action's \`notifyOK\` callback.\
> &#x20;           \
> A 4xx means the message cannot be processed as configured, so Actito stops retrying it; a 5xx is retried.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Actito"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.actito.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":{"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/actito/custom-actions/updatePass":{"post":{"tags":["Actito"],"summary":"Write a value on a holder's passes from an Actito scenario","description":"Called by Actito when the integration's custom action runs. Finds every pass whose\n`twcExternalIdentifier` identifier equals the profile's `actitoExternalIdentifier` attribute,\nsets the `actito_{key}` additional data to the action's value, saves each pass and pushes it to the\nwallets, then posts to the action's `notifyOK` callback.\n            \nA 4xx means the message cannot be processed as configured, so Actito stops retrying it; a 5xx is retried.","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The custom action message, read as a Neo.Extensions.Actito.ListenerController.CustomActionMessage.","content":{"application/json":{"schema":{}},"text/json":{"schema":{}},"application/*+json":{"schema":{}}}},"responses":{"200":{"description":"Passes updated and Actito notified; also when no pass matches the holder."},"400":{"description":"The message has no readable `data`, no `notifyOK` link, a pass template unknown to this tenant, or no string or number `profileAttributes.{actitoExternalIdentifier}` value.","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.actito.listener:write</c> scope, or the endpoint is not enabled for the tenant.","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"}]}}}}}}}}}
```

## Link a holder's passes to their Actito profile

> Called by Actito when a profile is created, or when its \`actitoExternalIdentifier\` attribute changes.\
> Reads the profile from the profile table, finds the passes whose \`twcExternalIdentifier\` identifier\
> equals that attribute, and records in the integration's wallet table in Actito the holder's most recently\
> created Apple pass installed on a device and most recently created Google pass, each linked to the\
> profile. No pass is changed.\
> &#x20;           \
> The same event type, operation and profile received again within 2 hours answers 208 and is not\
> processed again.

```json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Actito"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["tenant.actito.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":{"ProfileEventType":{"enum":["Create","Update"],"type":"string","description":"Profile table event Actito reports. The integration subscribes to both, the update one only for changes\nof the profile attribute named by `actitoExternalIdentifier`."},"ActitoWrapper_NewProfile":{"type":"object","properties":{"eventType":{"type":"string","description":"Event type as Actito names it."},"operation":{"type":"string","description":"Operation name as Actito names it. With the route's event type and the profile, identifies the event."},"data":{"description":"The profile the event is about.","$ref":"#/components/schemas/NewProfile"}},"additionalProperties":false,"description":"Envelope of an Actito profile webhook."},"NewProfile":{"type":"object","properties":{"profileId":{"type":"integer","description":"Actito identifier of the profile.","format":"int64"}},"additionalProperties":false,"description":"The profile a profile webhook is about."},"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/actito/profile/{eventType}":{"post":{"tags":["Actito"],"summary":"Link a holder's passes to their Actito profile","description":"Called by Actito when a profile is created, or when its `actitoExternalIdentifier` attribute changes.\nReads the profile from the profile table, finds the passes whose `twcExternalIdentifier` identifier\nequals that attribute, and records in the integration's wallet table in Actito the holder's most recently\ncreated Apple pass installed on a device and most recently created Google pass, each linked to the\nprofile. No pass is changed.\n            \nThe same event type, operation and profile received again within 2 hours answers 208 and is not\nprocessed again.","parameters":[{"name":"eventType","in":"path","description":"Profile event Actito reports, from the route: `create` or `update`.","required":true,"schema":{"description":"Profile table event Actito reports. The integration subscribes to both, the update one only for changes\nof the profile attribute named by `actitoExternalIdentifier`.","$ref":"#/components/schemas/ProfileEventType"}},{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The Actito event, carrying the profile identifier.","content":{"application/json":{"schema":{"description":"Envelope of an Actito profile webhook.","$ref":"#/components/schemas/ActitoWrapper_NewProfile"}},"text/json":{"schema":{"description":"Envelope of an Actito profile webhook.","$ref":"#/components/schemas/ActitoWrapper_NewProfile"}},"application/*+json":{"schema":{"description":"Envelope of an Actito profile webhook.","$ref":"#/components/schemas/ActitoWrapper_NewProfile"}}}},"responses":{"200":{"description":"Event processed; also when no pass matches the profile."},"208":{"description":"The same event was already received within the last 2 hours; nothing is done."},"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.actito.listener:write</c> scope, or the endpoint is not enabled for the tenant.","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"}]}}}}}}}}}
```


---

# 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/actito.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.
