Logo Neyos

API Neyos

Une API REST sécurisée pour consulter vos balises, leur envoyer des commandes et gérer vos webhooks depuis vos propres applications.

L'API Neyos est une API REST qui vous permet de piloter votre parc depuis vos propres outils : consulter l'état de vos balises, leur envoyer des commandes à distance et gérer les webhooks qui alimentent vos systèmes en temps réel.

Base URLhttps://api.neyos-equipment.com/api/v1
FormatJSON (UTF-8)
AuthentificationAuthorization: Bearer ctk_xxxxx sur chaque requête
ProtocoleHTTPS uniquement
Toutes les ressources retournées sont automatiquement limitées à votre organisation. Toute tentative d'accès à une ressource appartenant à un autre client renvoie une erreur 404, jamais les données concernées.

Authentification

Chaque requête doit porter votre jeton client dans l'en-tête Authorization :

curl https://api.neyos-equipment.com/api/v1/trackers \
  -H "Authorization: Bearer ctk_xxxxxxxxxxxxxxxxxxxxxxx"

Un appel sans jeton, ou avec un jeton invalide, expiré ou révoqué, renvoie 401 Unauthorized.

Votre jeton ctk_… donne accès à l'ensemble de votre parc. Conservez-le côté serveur, dans un gestionnaire de secrets — jamais dans un code front-end, un dépôt Git ou une application mobile.

Conventions

Identifiants

Les balises sont référencées par leur serial, le numéro de série gravé sur le boîtier. Les autres ressources portent un identifiant préfixé :

PréfixeRessource
—Tracker — référencé par son serial
tac_TrackerAction (commande)
end_Webhook (endpoint)

Dates

Sur l'API, toutes les dates sont sérialisées en millisecondes Unix (number) ou null.

Les notifications webhook n'utilisent pas partout le même format : les événements tracker.* et message.created renvoient des dates ISO 8601, les événements tracker_action.* des millisecondes. Voir Format des dates.

Pagination

Les endpoints de liste acceptent les paramètres suivants :

ParamètreTypeDéfautDescription
pageinteger1Numéro de page
perPageinteger25Éléments par page (max 100)
sortstringvarieChamp de tri
orderasc | descvarieOrdre de tri
searchstring—Recherche textuelle (champs concernés selon l'endpoint)

Une réponse paginée a toujours la forme suivante :

{
  "meta": {
    "total": 142,
    "perPage": 25,
    "currentPage": 1,
    "lastPage": 6,
    "firstPage": 1
  },
  "data": [ ]
}

Modèles

Types de commandes

Deux types de commandes peuvent être créés via l'API publique :

typeDescriptionChamps requis
custom_commandsEnvoie une liste de commandes textuellescommands: string[]
power_offÉteint la balise—

D'autres types (load_config, send_config, time_sync…) sont générés par la plateforme et peuvent apparaître dans l'historique d'une balise ou dans vos webhooks, sans pouvoir être créés depuis l'API.

États d'une commande

statusSignification
waiting_config_loadedEn attente du chargement de la configuration de la balise
waitingEn file d'attente, pas encore transmise
pendingTransmise à la balise, en attente d'accusé
receivedAccusé partiel reçu
successExécutée avec succès
failedÉchec après plusieurs tentatives
canceledAnnulée avant exécution
mergedFusionnée avec une autre commande

Cycle de vie typique : waiting → pending → received → success ou failed.

Trackers

Lister les balises

GET /api/v1/trackers

Paramètres : page, perPage, sort (défaut serial), order, search (filtre sur serial et alias).

Filtres additionnels — plusieurs valeurs peuvent être séparées par une virgule :

ParamètreValeurs
connectedtrue | false
chargingtrue | false
sleeptrue | false
zoneTracktrue | false
curl "https://api.neyos-equipment.com/api/v1/trackers?perPage=10&connected=true&search=depot" \
  -H "Authorization: Bearer ctk_xxxxx"

Réponse 200 — objet paginé contenant un tableau de Tracker dans data.

Récupérer une balise

GET /api/v1/trackers/:serial

Réponse 200 — un objet Tracker. Erreur 404 — la balise n'existe pas ou n'appartient pas à votre organisation.

Modifier une balise

PATCH /api/v1/trackers/:serial

Seuls les champs alias et notes sont modifiables. Les deux sont optionnels et peuvent être remis à null.

{
  "alias": "Camion 12 - dépôt nord",
  "notes": "Affecté à la tournée Lyon-Grenoble"
}

Réponse 200 — la balise mise à jour.

Une modification via cet endpoint déclenche un événement webhook tracker.updated.

Historique des commandes d'une balise

GET /api/v1/trackers/:serial/actions

Paramètres : page, perPage, sort (défaut createdAt), order (défaut desc).

FiltreValeurs (multiples séparées par ,)
statuswaiting, pending, received, success, failed, canceled, merged
typecustom_commands, power_off, load_config, send_config, time_sync

Réponse 200 — objet paginé de TrackerAction.

Commandes

Envoyer une commande à une balise

POST /api/v1/trackers/:serial/actions
ChampTypeRequisDéfaut
type"custom_commands" | "power_off"oui—
commandsstring[]si type = custom_commands—
prioritynumber (1 à 100)non50
{
  "type": "custom_commands",
  "commands": ["gnss set --rate=5000", "modem set --network_1=0"],
  "priority": 50
}

Réponse 201 — la commande a été créée et mise en file :

{
  "status": "created",
  "data": { }
}

Réponse 200 — la balise est déjà dans l'état demandé, aucune commande n'a été créée :

{
  "status": "already_up_to_date",
  "message": "Tracker is already up to date"
}

Erreurs : 404 (balise inconnue), 422 (validation).

Une commande n'est pas exécutée immédiatement : elle est transmise à la prochaine connexion de la balise. Suivez son avancement via l'événement webhook tracker_action.updated ou en interrogeant GET /api/v1/actions/:id.

Envoyer des commandes à plusieurs balises

POST /api/v1/actions/_bulk
{
  "trackerActions": [
    { "serial": "AB123", "type": "power_off" },
    { "serial": "AB124", "type": "custom_commands", "commands": ["gnss set --rate=10000"] },
    { "serial": "AB125", "type": "custom_commands", "commands": ["modem set --apn=mybiz"], "priority": 20 }
  ]
}

Chaque entrée est traitée indépendamment : une erreur unitaire (balise hors organisation, commande invalide…) ne fait pas échouer les autres.

Réponse 201

{
  "total": 3,
  "created": 2,
  "failed": 1,
  "results": [
    { "index": 0, "status": "created", "id": "tac_xxx", "data": { } },
    { "index": 1, "status": "created", "id": "tac_yyy", "data": { } }
  ],
  "errors": [
    { "index": 2, "status": "error", "message": "Tracker not found", "input": { } }
  ]
}

Le champ index correspond à la position de l'entrée dans le tableau envoyé, ce qui permet de rattacher chaque résultat à sa demande d'origine.

Suivre une commande

GET /api/v1/actions/:id

Réponse 200 — un TrackerAction avec sa relation attempts : chaque tentative d'envoi contient sentAt, receivedAt et response.

Annuler une commande

PUT /api/v1/actions/:id/cancel

Une commande ne peut être annulée que tant qu'elle n'a pas été transmise à la balise, c'est-à-dire au statut waiting. Une commande déjà envoyée ne peut plus être rappelée.

Réponse 200

{ "status": "canceled" }

Webhooks

Les webhooks poussent en POST les événements de votre organisation vers l'URL de votre choix. Tous les webhooks activés rattachés à votre compte reçoivent chaque événement.

Pour la mise en place côté serveur, le détail des payloads et les exemples complets, voir la page Webhook.

Lister vos webhooks

GET /api/v1/webhooks

Paramètres : page, perPage, sort (défaut createdAt), order (défaut desc), search (filtre sur url).

Récupérer un webhook

GET /api/v1/webhooks/:id

Créer un webhook

POST /api/v1/webhooks
ChampTypeRequisDéfaut
urlstring (URL valide)oui—
descriptionstring | nullnonnull
enabledbooleannontrue
{
  "url": "https://app.mon-domaine.com/integrations/neyos",
  "description": "Webhook production",
  "enabled": true
}

Réponse 201 — le webhook créé, accompagné de son signingSecret :

{
  "id": "end_xxx",
  "url": "https://app.mon-domaine.com/integrations/neyos",
  "description": "Webhook production",
  "enabled": true,
  "signingSecret": "whsec_2aB3cD...",
  "createdAt": 1737031800000,
  "updatedAt": 1737031800000
}
Le signingSecret n'est retourné qu'une seule fois, à la création. Il n'apparaît dans aucune autre réponse. Stockez-le immédiatement dans votre gestionnaire de secrets : en cas de perte, la seule option est de supprimer le webhook et d'en recréer un.

Modifier un webhook

PUT /api/v1/webhooks/:id

Mêmes champs qu'à la création, tous optionnels : seuls les champs fournis sont modifiés. Réponse 200 — le webhook mis à jour.

Supprimer un webhook

DELETE /api/v1/webhooks/:id

Réponse 204 — pas de contenu.

Types d'événements émis

typeÉmis quand…Contenu de data
tracker.createdUne balise est rattachée à votre organisationTracker
tracker.updatedL'alias ou les notes d'une balise sont modifiésTracker
tracker.deletedUne balise est suppriméeTracker
tracker_action.createdUne commande est créée (via l'API ou la plateforme)TrackerAction
tracker_action.updatedUne commande change d'état (envoi, accusé, succès, échec…)TrackerAction
tracker_action.deletedUne commande est suppriméeTrackerAction
message.createdUne nouvelle trame est reçue d'une baliseMessage
tracker.updated n'est pas émis à chaque changement de position ou de batterie : il est volontairement limité aux modifications d'alias et de notes. Pour suivre l'activité terrain d'une balise, écoutez message.created.

Chaque notification a la même enveloppe :

{
  "type": "tracker.updated",
  "data": { }
}

Format des dates

Le format des dates dépend de l'événement — c'est le principal piège d'intégration :

ContexteFormat
Réponses de l'API RESTmillisecondes Unix
Événements tracker.* et message.createdISO 8601 (2026-09-01T10:28:03.000+00:00)
Événements tracker_action.*millisecondes Unix
Champ timestamp d'un élément (point, event)secondes Unix

Garanties de livraison

  • Les webhooks désactivés (enabled: false) ne reçoivent aucun appel.
  • Réponse attendue : un code 200. Toute autre réponse, ainsi qu'un timeout ou un hôte injoignable, est consignée comme un échec.
  • Les appels sont asynchrones, via une file de jobs : deux notifications proches dans le temps peuvent arriver dans le désordre. Fiez-vous aux horodatages du payload, pas à l'ordre de réception.
  • Un même événement peut être reçu plusieurs fois : utilisez l'en-tête X-Neyos-Event-Id comme clé d'idempotence.
  • Chaque notification est tracée côté Neyos (URL, corps envoyé, code HTTP, temps de réponse, statut), et le champ sentAt du webhook est mis à jour à chaque envoi.

Signature des notifications

Chaque appel webhook sortant est signé en HMAC-SHA256 à l'aide du signingSecret retourné à la création du webhook, et accompagné des en-têtes X-Neyos-Timestamp, X-Neyos-Signature et X-Neyos-Event-Id.

La formule de calcul, la procédure de vérification et des exemples Node.js / Python / PHP sont détaillés sur la page Webhook.

Codes d'erreur

CodeCas typiques
200Succès
201Ressource créée
204Succès sans contenu (suppression)
401Jeton manquant, invalide, expiré ou révoqué
403Action interdite
404Ressource introuvable ou appartenant à une autre organisation
422Erreur de validation (type invalide, url mal formée, commands vide…)
500Erreur interne

Les erreurs de validation 422 détaillent les champs en faute :

{
  "errors": [
    { "message": "The url field must be a valid URL", "rule": "url", "field": "url" }
  ]
}

Besoin d'un jeton d'accès ou d'aide sur votre intégration ?

Contactez notre équipe support pour obtenir vos identifiants API. contact@neyos.com