Conventions
Les règles de cette page valent pour tous les endpoints. Les pages de référence qui suivent (en anglais, comme les noms des champs) ne les répètent pas : elles donnent, pour chaque ressource, ses filtres, ses champs et des exemples.
L'adresse#
https://votre-entreprise.evyooht.com/api/v1/{ressource}
https://votre-entreprise.evyooht.com/api/v1/{ressource}/{id}- HTTPS uniquement. Une requête en
http://est refusée (403 https_required). - Le nom des ressources est au pluriel, en minuscules, avec des tirets :
credit-memos,sales-orders. {id}est un entier : le champidd'un élément de liste.- Toutes les ressources se lisent avec
GET. Toute autre méthode répond405avec l'en-têteAllow: GET.
L'authentification#
Chaque requête (sauf /status et /auth/token) porte un jeton :
Authorization: Bearer evy_at_votre_jetonVoir S'authentifier.
La forme des réponses#
Une liste :
{
"data": [
{ "id": 4149, "number": "I1-4149", "status": "regular", "total": 1250.0 }
],
"meta": { "page": 1, "per_page": 25, "total": 1391, "total_pages": 56 }
}Un élément (GET /invoices/4149) :
{
"data": {
"id": 4149,
"number": "I1-4149",
"status": "regular",
"total": 1250.0,
"lines": [],
"payments": []
}
}La liste ne contient pas les lignes ni les paiements ; le détail, si.
La pagination#
| Paramètre | Défaut | Règle |
|---|---|---|
page | 1 | Entier de 1 à 10 000. Une page au-delà des données est vide : ce n'est pas une erreur. |
per_page | 25 | Entier de 1 à 100. |
Voir Parcourir de longs résultats.
Le tri#
sort prend un ou plusieurs champs séparés par des virgules, - devant pour décroissant :
GET /invoices?sort=-date,total- Trois champs au plus.
- Seuls les champs listés dans la référence de la ressource sont triables.
- L'identifiant départage toujours les égalités, pour que deux pages consécutives ne répètent ni n'oublient rien.
- Un champ qui demande une permission que vous n'avez pas ne peut pas servir à trier.
Les filtres#
Les filtres propres à chaque ressource sont listés dans sa page de référence. Ils se combinent (« ET »). Il en existe sept types :
| Type | Écriture | Effet |
|---|---|---|
| Entier | customer_id=58 | Égalité. |
| Texte | currency=USD | Égalité. |
| Liste | status=open ou status=open,hold | Un ou plusieurs libellés de la liste. all, quand il existe, ne filtre rien. |
| Recherche | search=papier | « Contient », littéral, de 2 à 100 caractères, dans plusieurs champs. |
| Date de début | date_from=2026-01-01 | À partir de ce jour, inclus. |
| Date de fin | date_to=2026-01-31 | Jusqu'à ce jour inclus, heures comprises. |
| Modifié depuis | updated_since=2026-03-01T08:00:00 | Modifié depuis cette date ou cette date et cette heure. |
Les paramètres invalides sont refusés#
Un paramètre inconnu, une valeur hors liste, un entier mal formé, une date impossible (2026-02-30), une valeur vide : tout cela répond 400 invalid_parameter, avec toutes les fautes en une fois. Rien n'est ignoré en silence.
{
"error": {
"code": "invalid_parameter",
"message": "One or more query parameters are invalid.",
"request_id": "81c82f5c6e2eb5aa",
"details": [
{ "parameter": "per_page", "message": "An integer between 1 and 100 is expected." },
{ "parameter": "stauts", "message": "Unknown parameter." }
]
}
}Les formats#
| Sujet | Règle |
|---|---|
| Noms des champs | En anglais, en minuscules, avec des soulignés (customer_name). |
| Nombres | De vrais nombres, jamais des textes : 1250.0. |
| Dates et heures | ISO 8601 sans fuseau : 2026-03-15T14:30:00. C'est l'heure du serveur de l'entreprise. Une date vide est null. |
| Valeur absente | null. |
| Statuts et types | Un libellé lisible (open, void, inventory), jamais le code interne de la base. |
| Un champ à permission | Absent de la réponse (pas null) si votre clé n'a pas la permission. |
| Monnaies | USD ou HTG. Chaque document porte sa currency et son exchange_rate. |
Les règles métier#
- Documents annulés (
status = void) : ils gardent leur identité mais tous leurs montants sont à zéro, lignes et paiements compris. Les quantités restent. - Brouillons (
status = hold) : cachés par défaut ;status=holdles demande,status=alldemande tout. - Produits : seuls les produits actifs sont listés par défaut.
- Documents archivés : les anciennes factures et les anciens devis sont lus avec les récents, comme une seule collection. Le total, le tri et la pagination couvrent les deux.
- Totaux : le total d'un document fait foi. Une ligne donne des faits (quantité, unité, prix), pas un total calculé.
Les restrictions de votre clé#
En plus de ses permissions, une clé peut être limitée :
| Restriction | Effet |
|---|---|
| À certaines succursales | Vous ne voyez que les documents, le stock et les succursales de celles-ci. Un document d'une autre succursale répond 404, comme s'il n'existait pas. Un transfert est visible si l'une de ses deux succursales vous est ouverte. |
| À une liste de prix | Vous ne voyez qu'un prix par produit : celui de votre liste. |
Les permissions#
Une permission s'écrit ressource:read. Votre clé en porte une liste ; GET /resources vous dit celles qui s'appliquent à vous.
| Permission | Ce qu'elle ouvre |
|---|---|
products:read | Les produits, leurs prix et leur stock. |
customers:read | Les clients. |
vendors:read | Les fournisseurs. |
quotes:read | Les devis et leurs lignes. |
sales-orders:read | Les commandes de vente, leurs lignes et leurs paiements. |
invoices:read | Les factures, leurs lignes et leurs paiements. |
credit-memos:read | Les avoirs et leurs lignes. |
payments:read | Les paiements reçus des clients. |
purchase-orders:read | Les bons de commande fournisseur. |
receivings:read | Les réceptions de marchandises et les retours fournisseur. |
transfers:read | Les transferts de stock entre succursales. |
adjustments:read | Les ajustements de quantité et de coût. |
reference:read | Les succursales, départements, sous-départements, listes de prix et types de client. |
costs:read | Complément : ajoute les champs de coût. |
customers:financial | Complément : ajoute la limite de crédit et le solde des clients. |
Sans la permission d'une ressource, l'API répond 403 insufficient_scope. Sans un complément, les champs concernés sont simplement absents.
Les en-têtes de la réponse#
| En-tête | Sens |
|---|---|
X-Request-Id | L'identifiant de la requête. Citez-le au support : il retrouve la ligne exacte du journal. |
X-RateLimit-Limit | Le nombre de requêtes permises par minute pour votre clé. |
X-RateLimit-Remaining | Ce qu'il vous reste dans la minute en cours. |
X-RateLimit-Reset | Dans combien de secondes le compteur repart à zéro. |
X-Total-Count | (listes) Le nombre total d'éléments. |
Retry-After | (429, 503) Combien de secondes attendre avant de réessayer. |
Cache-Control: no-store | Les réponses ne se mettent pas en cache. |
Les ressources#
Chacune a sa page de référence, avec ses filtres, ses champs et ses exemples.
Les quatre endpoints qui ne sont pas des données : /status, /auth/token, /ping et /resources.