> 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/developers-guides/fr/integration-guides/insights-api.md).

# API Insights

## API Insights

Le **API Insights** donne accès à la base de données d’utilisation de The Wallet Crew. Interrogez les journaux, les événements et les métriques à l’aide de [Langage de requête Kusto (KQL)](https://learn.microsoft.com/en-us/azure/data-explorer/kusto/query/).

Cette API est conçue pour les équipes techniques qui extraient des données par programmation.

<details>

<summary><strong>Exemples concrets</strong></summary>

* Interrogez les tendances d’installation de Carte par jour après le lancement d’une campagne.
* Exportez l’activité des webhooks ou des scans dans un pipeline BI.
* Inspectez les journaux de la plateforme lors du débogage d’un problème d’intégration spécifique à un locataire.

</details>

### Authentification et autorisations

L’accès nécessite l’authentification standard de The Wallet Crew.

* Autorisation requise : **`Insights:Read`**
* Flux d’authentification : utilisez un jeton d’authentification The Wallet Crew existant (par exemple, obtenu via une connexion ou un service à service).
* Portée mono-locataire : vous ne pouvez interroger que les données de votre propre locataire.

Envoyez le jeton d’accès via le `Authorization` .

### Rétention et limites de débit

* **Journaux**: conservés **45 jours**
* **Événements**: conservés **indéfiniment**
* **Métriques**: conservés **indéfiniment**

**Limite de débit**: 60 appels API par minute. Pour demander des limites plus élevées, ouvrez un ticket d’assistance.

### Point de terminaison

Toutes les requêtes utilisent cette opération :

## Execute analytics query

> Runs a custom analytics query and returns results in tabular format.\
> \
> \## Authorization\
> Requires \`Insights.Read\` scope.\
> \
> \## Rate Limiting\
> Limited to 60 requests per interval to protect analytics infrastructure.\
> \
> \## Query Language\
> Typically uses Kusto Query Language (KQL) syntax:\
> \`\`\`kql\
> Passes\
> \| where timestamp > ago(7d)\
> \| summarize count() by passType\
> \| order by count\_ desc\
> \`\`\`\
> \
> \## Parameters\
> Supports parameterized queries for security and reusability:\
> \`\`\`json\
> {\
> &#x20; "query": "Events | where Name == name | take 100",\
> &#x20; "parameters": { "name": "Pass:Installed" }\
> }\
> \`\`\`\
> \## Use Cases\
> \- Custom dashboards\
> \- Business intelligence reports\
> \- Data exports\
> \- Trend analysis\
> \
> \## Performance\
> \- Query timeout: Configurable per tenant\
> \- Result limits: May be enforced\
> \- Caching: Not automatic - implement client-side if needed

````json
{"openapi":"3.1.1","info":{"title":"Neostore internal API","version":"v1"},"tags":[{"name":"Insights"}],"servers":[{"url":"https://app.neostore.cloud","description":"Production Server"},{"url":"https://app-qa.neostore.cloud","description":"Staging Server"}],"security":[{"admin-bearer":["ScopedAuthorizeRequirement"]},{"apiKey":["ScopedAuthorizeRequirement"]}],"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":{"QueryRequest":{"required":["query"],"type":"object","properties":{"query":{"type":"string"},"parameters":{"type":"object","additionalProperties":{"type":"string"}},"options":{"$ref":"#/components/schemas/QueryOptions"}},"additionalProperties":false},"QueryOptions":{"type":"object","additionalProperties":false},"QueryResponse":{"type":"object","properties":{"columns":{"type":"array","items":{"type":"string"}},"rows":{"type":"array","items":{"type":"array","items":{}}}},"additionalProperties":false},"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}/insights/query":{"post":{"tags":["Insights"],"summary":"Execute analytics query","description":"Runs a custom analytics query and returns results in tabular format.\n\n## Authorization\nRequires `Insights.Read` scope.\n\n## Rate Limiting\nLimited to 60 requests per interval to protect analytics infrastructure.\n\n## Query Language\nTypically uses Kusto Query Language (KQL) syntax:\n```kql\nPasses\n| where timestamp > ago(7d)\n| summarize count() by passType\n| order by count_ desc\n```\n\n## Parameters\nSupports parameterized queries for security and reusability:\n```json\n{\n  \"query\": \"Events | where Name == name | take 100\",\n  \"parameters\": { \"name\": \"Pass:Installed\" }\n}\n```\n## Use Cases\n- Custom dashboards\n- Business intelligence reports\n- Data exports\n- Trend analysis\n\n## Performance\n- Query timeout: Configurable per tenant\n- Result limits: May be enforced\n- Caching: Not automatic - implement client-side if needed","parameters":[{"name":"tenantId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"description":"The query text, parameters, and optional execution settings.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}},"text/json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}},"application/*+json":{"schema":{"$ref":"#/components/schemas/QueryRequest"}}}},"responses":{"200":{"description":"Query executed successfully","content":{"text/plain":{"schema":{"$ref":"#/components/schemas/QueryResponse"}},"application/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}},"text/json":{"schema":{"$ref":"#/components/schemas/QueryResponse"}}}},"400":{"description":"Invalid query syntax or parameters","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":"Not authorized","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"}]}}}},"500":{"description":"Internal server error while executing query"}}}}}}
````

* `{tenantId}` = votre identifiant de locataire
* Le corps de la requête doit contenir une `requête` chaîne en **KQL**

### Tables et schéma

La base de données Insights contient trois tables :

#### Journaux

| Colonne     | Type     |
| ----------- | -------- |
| eventId     | guid     |
| timestamp   | datetime |
| tenantId    | string   |
| eventType   | string   |
| operationId | string   |
| properties  | dynamic  |

Contient des erreurs et des traces liées à l’activité de la plateforme. Utile pour le débogage et la surveillance de l’état de santé.

#### Événements

| Colonne     | Type     |
| ----------- | -------- |
| eventId     | guid     |
| timestamp   | datetime |
| tenantId    | string   |
| eventType   | string   |
| operationId | string   |
| properties  | dynamic  |

Contient :

* Vues de page
* Requêtes API
* Événements métier personnalisés

#### Métriques

| Colonne    | Type     |
| ---------- | -------- |
| metricId   | guid     |
| tenantId   | string   |
| metricType | string   |
| value      | dynamic  |
| properties | dynamic  |
| timestamp  | datetime |

Représente **des instantanés de l’état du système**, pris toutes les heures.

### Requêtes courantes

#### Compter les nouveaux clients

```kql
Événements
| where eventType == "Customer:Upserted"
| summarize NewCustomers = count()
```

#### Compter les installations de Carte

```kql
Événements
| where eventType == "Carte:Installed"
| summarize CarteInstallations = count()
```

#### Compter les requêtes par jour

```kql
Événements
| where eventType == "Request"
| summarize RequestsPerDay = count() by bin(timestamp, 1d)
```

#### Compter les redirections par jour

```kql
Événements
| where eventType == "Redirect:Redirected"
| summarize RedirectsPerDay = count() by bin(timestamp, 1d)
```

#### Compter les vues de page par navigateur

```kql
Événements
| where eventType == "PageView"
| extend browser = tostring(properties.browser)
| summarize PageViews = count() by browser
```

### Types d’événements courants

Voici quelques-uns des `eventType` valeurs les plus courantes que vous souhaiterez peut-être interroger :

* **Cycle de vie du client**
  * `Customer:Upserted`
  * `Y2:Customer:Created`
  * `Y2:Customer:Updated`
* **Cycle de vie de la Carte**
  * `Carte:Created`
  * `Carte:Updated`
  * `Carte:Installed`
  * `Carte:Uninstalled`
* **Actions utilisateur**
  * `action:addToAppleWallet`
  * `action:addToGoogleWallet`
  * `action:loginWithGoogle`
  * `action:loginWithApple`
* **Suivi et analytique**
  * `Request`
  * `PageView`
  * `Redirect:Redirected`
  * `step:complete`
  * `step:changed`

### Dépannage

* **401 Non autorisé**
  * Assurez-vous que votre jeton est valide et inclut `Insights:Read`.
* **429 Trop de requêtes**
  * Vous avez dépassé la limite de débit (60 appels/minute). Mettez en œuvre des réessais avec temporisation exponentielle.
* **La requête prend trop de temps**
  * Simplifiez la requête ou réduisez la fenêtre temporelle.
  * Évitez les requêtes non bornées sur les grandes tables.

### FAQ

<details>

<summary>Puis-je exporter les résultats en CSV/JSON ?</summary>

Pas directement via l’API.

Consommez la réponse JSON et convertissez-la localement.

</details>

<details>

<summary>Puis-je interroger plusieurs locataires ?</summary>

Non.

L’accès est limité à votre seul locataire.

</details>

<details>

<summary>La base de données Insights contient-elle des données personnelles ?</summary>

Non.

Elle ne contient pas de données personnelles identifiables.

</details>

<details>

<summary>Puis-je configurer des alertes (seuils, déclencheurs) ?</summary>

Pas pour le moment.

</details>


---

# 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 dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.thewalletcrew.io/developers-guides/fr/integration-guides/insights-api.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
