Toutes les URLs ci-dessous sont relatives à la base https://votredomaine.com/api/v1.

Lister les tickets

GET /v1/support/tickets
Authorization: Bearer kh_live_xxxx
Pagination Laravel standard : 20 tickets par page (paramètres de requête page pris en charge par le framework).

Réponse

{
  "success": true,
  "data": [
    {
      "id": 1,
      "uuid": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
      "user_id": 1,
      "subject": "Question technique",
      "department": "technical",
      "status": "open",
      "priority": "normal",
      "messages_count": 2,
      "created_at": "2024-06-15T09:00:00.000000Z",
      "updated_at": "2024-06-15T10:30:00.000000Z"
    }
  ],
  "meta": {
    "total": 5,
    "per_page": 20,
    "current_page": 1
  }
}
Les statuts possibles pour un ticket : open, in_progress, resolved, closed. Permission : support:read

Créer un ticket

POST /v1/support/tickets
Content-Type: application/json
{
  "subject": "Erreur 500 sur mon site",
  "message": "Depuis ce matin, le site renvoie une erreur 500…",
  "department": "technical",
  "priority": "high",
  "service_id": "550e8400-e29b-41d4-a716-446655440000"
}
ChampTypeRequisDescription
subjectstringOuiSujet (max 255 caractères)
messagestringOuiPremier message (max 5000)
departmentstringOuitechnical, billing, sales, abuse, general
prioritystringNonlow, normal, high, urgent (défaut : normal)
service_idUUIDNonUUID d’un votre service ; sinon ignoré

Réponse (201)

{
  "success": true,
  "data": {
    "ticket_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
    "subject": "Erreur 500 sur mon site",
    "department": "technical",
    "priority": "high",
    "status": "open"
  }
}
Permission : support:write

Détail d’un ticket

GET /v1/support/tickets/{ticket_uuid}
Le corps JSON renvoie le modèle Ticket sérialisé, avec la relation messages (messages non internes uniquement, triés par date). Permission : support:read

Ajouter un message

POST /v1/support/tickets/{ticket_uuid}/messages
Content-Type: application/json
{
  "message": "Merci pour votre retour, j’ai appliqué la correction."
}
Impossible d’ajouter un message si le ticket est closed (erreur 422, code invalid_state). Réponse (201) : objet contenant au minimum id, message, created_at. Permission : support:write
L’API ne gère pas les pièces jointes sur ce endpoint (contrairement au formulaire web). Utilisez le portail client si vous devez joindre des fichiers.

Fermer un ticket

PATCH /v1/support/tickets/{ticket_uuid}/close
Permission : support:write
{
  "success": true,
  "data": {
    "ticket_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
    "status": "closed"
  }
}

Rouvrir un ticket

PATCH /v1/support/tickets/{ticket_uuid}/reopen
Rouvre un ticket à partir d’un statut closed ou resolved (repasse à open). Permission : support:write
{
  "success": true,
  "data": {
    "ticket_id": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
    "status": "open"
  }
}

Sandbox

Avec une clé kh_test_, les méthodes d’écriture (POST, PATCH, DELETE sur l’API) renvoient 403 Forbidden :
{
  "success": false,
  "error": {
    "code": "sandbox_read_only",
    "message": "Les tokens sandbox (kh_test_) sont en lecture seule. Utilisez un token live (kh_live_) pour les opérations d'écriture."
  }
}

Permissions

ActionScope
Liste, détailsupport:read
Création, message, fermer, rouvrirsupport:write