{% extends 'base.html.twig' %} {% block title %}API Documentation - E-Ticket{% endblock %} {% block description %}Documentation de l'API E-Ticket pour les organisateurs et l'application scanner.{% endblock %} {% block body %}
Documentation complete de l'API REST pour les organisateurs. Gestion des evenements, commandes, billets et scan.
Format
JSON (application/json)
Authentification
ETicket-Email + ETicket-JWT
Environnement
Base URL
https://ticket.e-cosplay.fr/api/sandbox
Environnement de test. Les donnees ne sont pas modifiees.
L'authentification (/api/auth/login) est commune aux deux environnements (vos vrais identifiants).
Donnees Sandbox
La sandbox retourne des donnees fictives identiques pour tous les utilisateurs :
References de scan disponibles :
Toutes les routes (sauf /api/auth/login) necessitent deux headers :
| Header | Description | Exemple |
|---|---|---|
| ETicket-Email | Email de l'organisateur | orga@example.com |
| ETicket-JWT | Token JWT (obtenu via /api/auth/login) | eyJhbGciOiJIUzI1NiIs... |
Reponse standard
{
"success": true,
"data": { ... },
"error": null
}
Reponse erreur
{
"success": false,
"data": null,
"error": "Message d'erreur explicite"
}
{{ section.description }}
{% endif %} {% for endpoint in section.endpoints %}{{ endpoint.path }}
{% else %}
/api/sandbox{{ endpoint.path|replace({'/api': ''}) }}
{% endif %}
{{ endpoint.description }}
{% if endpoint.headers|length > 0 %}Headers requis
Parametres
| Nom | Type | Requis | Description |
|---|---|---|---|
| {{ name }} | {{ param.type }} | {% if param.required %} oui {% else %} non{% if param.default is defined %} ({{ param.default }}){% endif %} {% endif %} | {{ param.description }} |
Body (JSON)
{
{% for name, field in endpoint.request %}
"{{ name }}": {{ field.example is defined ? '"' ~ field.example ~ '"' : '"..."' }}{{ not loop.last ? ',' : '' }} // {{ field.type }}{% if field.required %} (requis){% endif %}
{% endfor %}
}
Reponse (200)
{
{% for name, field in endpoint.response %}
"{{ name }}": {{ field.example }} // {{ field.type }}{{ not loop.last ? ',' : '' }}
{% endfor %}
}
{{ endpoint.extra.title }}
| {{ code }} | {{ desc }} |
Codes de reponse
L'API est limitee a 60 requetes par minute par cle API. En cas de depassement, un code 429 est retourne.
Headers de rate limit
| X-RateLimit-Limit | Nombre max de requetes par fenetre |
| X-RateLimit-Remaining | Requetes restantes dans la fenetre courante |
| Retry-After | Secondes avant la prochaine fenetre (si 429) |
E-Ticket applique une politique Content-Security-Policy stricte. Voici les origines autorisees par directive :
| Directive | Origines autorisees |
|---|---|
| script-src | 'self' static.cloudflareinsights.com challenges.cloudflare.com cdn.jsdelivr.net js.stripe.com |
| connect-src | 'self' cloudflareinsights.com static.cloudflareinsights.com challenges.cloudflare.com nominatim.openstreetmap.org cdn.jsdelivr.net api.stripe.com |
| style-src | 'self' fonts.googleapis.com cdnjs.cloudflare.com cdn.jsdelivr.net 'unsafe-inline' |
| img-src | 'self' data: *.tile.openstreetmap.org *.basemaps.cartocdn.com cdn.jsdelivr.net |
| font-src | 'self' cdnjs.cloudflare.com fonts.googleapis.com fonts.gstatic.com |
| frame-src | 'self' stripe.com *.stripe.com js.stripe.com cloudflare.com *.cloudflareinsights.com challenges.cloudflare.com |
| form-action | 'self' auth.esy-web.dev *.stripe.com checkout.stripe.com |
| object-src | 'none' |
| worker-src | 'self' blob: |
Les scripts inline ne sont pas autorises. Tous les scripts doivent etre servis depuis une origine autorisee ou utiliser un nonce CSP.