Développeurs

API REST

Une API JSON versionnée. Tout ce que l'interface fait passe par ces mêmes routes, donc rien ne vous est caché.

Authentification

Jeton personnel pour vos scripts, clé de service pour vos serveurs. Les deux se créent dans Administration puis Développeurs, avec des portées par ressource.

curl https://acme.open-helpdesk.com/api/v1/tickets \
  -H "Authorization: Bearer $OHD_TOKEN"

Ressources

GET/api/v1/ticketsListe filtrable par statut, priorité, assigné, étiquette, date.
POST/api/v1/ticketsCrée un ticket avec son premier message.
GET/api/v1/tickets/:idTicket complet avec messages, notes et historique.
PATCH/api/v1/tickets/:idModifie statut, priorité, assigné, étiquettes, champs.
POST/api/v1/tickets/:id/messagesAjoute une réponse publique ou une note interne.
GET/api/v1/contactsRecherche de contacts par email, nom ou entreprise.
GET/api/v1/articlesArticles publiés, filtrables par catégorie et locale.
POST/api/v1/exportsDemande un export CSV ou NDJSON, récupéré par lien signé.

Pagination

Pagination par curseur, 50 éléments par défaut, 200 au maximum. Le curseur suivant est renvoyé dans le corps, pas dans un en-tête.

{
  "data": [ /* ... */ ],
  "next_cursor": "eyJpZCI6NDgyMX0",
  "has_more": true
}

Limites de débit

600 requêtes par minute et par clé. En cas de dépassement, réponse 429 avec l'en-tête Retry-After. Les exports comptent pour une requête, quel que soit le volume renvoyé.

Webhooks

Chaque livraison porte un en-tête X-OHD-Signature contenant un HMAC SHA-256 du corps brut. Vérifiez-le avant de traiter la charge utile, et répondez en moins de 5 secondes.

{
  "event": "ticket.updated",
  "occurred_at": "2026-08-21T09:14:22Z",
  "workspace": "acme",
  "data": { "id": 4821, "status": "pending", "assignee": "lea@acme.fr" }
}

Erreurs

{
  "error": {
    "code": "validation_failed",
    "message": "Le champ requester.email est invalide.",
    "field": "requester.email"
  }
}