Evyoo POS API v1

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#

http
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 champ id d'un élément de liste.
  • Toutes les ressources se lisent avec GET. Toute autre méthode répond 405 avec l'en-tête Allow: GET.

L'authentification#

Chaque requête (sauf /status et /auth/token) porte un jeton :

http
Authorization: Bearer evy_at_votre_jeton

Voir S'authentifier.

La forme des réponses#

Une liste :

json
{
  "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) :

json
{
  "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ètreDéfautRègle
page1Entier de 1 à 10 000. Une page au-delà des données est vide : ce n'est pas une erreur.
per_page25Entier 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 :

http
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ÉcritureEffet
Entiercustomer_id=58Égalité.
Textecurrency=USDÉgalité.
Listestatus=open ou status=open,holdUn ou plusieurs libellés de la liste. all, quand il existe, ne filtre rien.
Recherchesearch=papier« Contient », littéral, de 2 à 100 caractères, dans plusieurs champs.
Date de débutdate_from=2026-01-01À partir de ce jour, inclus.
Date de findate_to=2026-01-31Jusqu'à ce jour inclus, heures comprises.
Modifié depuisupdated_since=2026-03-01T08:00:00Modifié 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.

json
{
  "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#

SujetRègle
Noms des champsEn anglais, en minuscules, avec des soulignés (customer_name).
NombresDe vrais nombres, jamais des textes : 1250.0.
Dates et heuresISO 8601 sans fuseau : 2026-03-15T14:30:00. C'est l'heure du serveur de l'entreprise. Une date vide est null.
Valeur absentenull.
Statuts et typesUn libellé lisible (open, void, inventory), jamais le code interne de la base.
Un champ à permissionAbsent de la réponse (pas null) si votre clé n'a pas la permission.
MonnaiesUSD 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=hold les demande, status=all demande 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 :

RestrictionEffet
À certaines succursalesVous 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 prixVous 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.

PermissionCe qu'elle ouvre
products:readLes produits, leurs prix et leur stock.
customers:readLes clients.
vendors:readLes fournisseurs.
quotes:readLes devis et leurs lignes.
sales-orders:readLes commandes de vente, leurs lignes et leurs paiements.
invoices:readLes factures, leurs lignes et leurs paiements.
credit-memos:readLes avoirs et leurs lignes.
payments:readLes paiements reçus des clients.
purchase-orders:readLes bons de commande fournisseur.
receivings:readLes réceptions de marchandises et les retours fournisseur.
transfers:readLes transferts de stock entre succursales.
adjustments:readLes ajustements de quantité et de coût.
reference:readLes succursales, départements, sous-départements, listes de prix et types de client.
costs:readComplément : ajoute les champs de coût.
customers:financialComplé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êteSens
X-Request-IdL'identifiant de la requête. Citez-le au support : il retrouve la ligne exacte du journal.
X-RateLimit-LimitLe nombre de requêtes permises par minute pour votre clé.
X-RateLimit-RemainingCe qu'il vous reste dans la minute en cours.
X-RateLimit-ResetDans 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-storeLes 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.