Tickets, clés SSH et compte
Tickets
GET /tickets
Permissions : tickets:read
| Paramètre | Type | Requis | Valeurs |
|---|---|---|---|
limit | entier | non, défaut 20 | 1 à 100 |
cursor | string | non | curseur à décalage |
status | string | non | OPEN, IN_PROGRESS, WAITING_CUSTOMER, WAITING_SUPPORT, RESOLVED, CLOSED |
Trié sur la dernière mise à jour, pas sur la date de création.
| Champ | Type | Notes |
|---|---|---|
ticketNumber | string | identifiant de toutes les routes de ticket |
subject | string | |
status | string | voir les valeurs ci-dessus |
priority | string | LOW, MEDIUM, HIGH, URGENT |
category | string | GENERAL, TECHNICAL, BILLING, ACCOUNT |
serviceCode | string ou null | le service concerné |
createdAt, updatedAt | entier | millisecondes epoch |
lastMessageAt | entier ou null | millisecondes epoch |
messageCount | entier | |
unread | booléen | le support a écrit quelque chose que vous n'avez pas lu |
GET /tickets/{ticketNumber}
Permissions : tickets:read
Cet appel marque le ticket comme lu.
Reprend les champs du résumé, sans unread ni messageCount, et ajoute :
| Champ | Type | Notes |
|---|---|---|
description | string | le premier message, repris tel quel |
closedAt | entier ou null | millisecondes epoch |
messages[] | tableau | la conversation, dans l'ordre |
Champ de messages[] | Type | Notes |
|---|---|---|
id | entier | |
sender | string | CUSTOMER, SUPPORT, SYSTEM |
content | string | |
attachments | entier | le nombre de pièces jointes. Elles se téléchargent depuis le tableau de bord |
createdAt | entier | millisecondes epoch |
POST /tickets
Permissions : tickets:write
| Champ | Type | Requis | Valeurs | D'où il vient |
|---|---|---|---|---|
subject | string | oui | 200 caractères au plus | - |
message | string | oui | 10 000 caractères au plus | - |
category | string ou null | non, défaut GENERAL | GENERAL, TECHNICAL, BILLING, ACCOUNT | - |
priority | string ou null | non, défaut MEDIUM | LOW, MEDIUM, HIGH, URGENT | - |
serviceCode | string ou null | non | - | GET /services → code |
Une valeur hors énumération répond 400 VALIDATION_ERROR:category ou 400 VALIDATION_ERROR:priority, jamais la valeur par défaut.
curl -X POST -H "Authorization: Bearer $FRESHPERF_KEY" \ -H "Content-Type: application/json" \ -d '{"subject":"Disque plein","message":"Le disque est plein depuis ce matin.","category":"TECHNICAL","priority":"HIGH","serviceCode":"SRV-TJUAQ1-1951"}' \ https://api.freshperf.fr/v1/tickets
Répond 201 avec le ticket complet, messages[] compris.
| Erreur | Statut | Quand |
|---|---|---|
VALIDATION_ERROR:subject | 400 | vide, ou au-delà de 200 caractères |
VALIDATION_ERROR:message | 400 | vide, ou au-delà de 10 000 caractères |
VALIDATION_ERROR:category, VALIDATION_ERROR:priority | 400 | valeur hors énumération |
SUBJECT_TOO_SHORT | 400 | sujet trop court pour le support |
SERVICE_NOT_FOUND | 404 | serviceCode inconnu, ou hors de la portée de la clé |
POST /tickets/{ticketNumber}/messages
Permissions : tickets:write
| Champ | Type | Requis | Valeurs |
|---|---|---|---|
message | string | oui | 10 000 caractères au plus |
Répond 201 avec le message créé. Répondre à un ticket fermé le rouvre.
POST /tickets/{ticketNumber}/close
Permissions : tickets:write
Sans corps. Répond 200 avec le résumé du ticket, status à CLOSED.
Clés SSH
Les clés SSH du compte sont proposées au moment de commander un VPS. Une clé retirée reste installée sur les serveurs déjà provisionnés jusqu'à leur réinstallation.
GET /ssh-keys et GET /ssh-keys/{id}
Permissions : account.ssh_keys:read
Liste complète, sans pagination.
| Champ | Type | Notes |
|---|---|---|
id | entier | à repasser dans la suppression |
label | string | |
keyType | string ou null | ex. ssh-ed25519 |
fingerprint | string ou null | SHA-256 en hexadécimal |
comment | string ou null | le commentaire de fin de ligne |
publicKey | string ou null | la ligne complète. Présente sur la lecture unitaire et sur la création, null dans la liste |
createdAt | entier | millisecondes epoch |
lastUsedAt | entier ou null | millisecondes epoch |
POST /ssh-keys
Permissions : account.ssh_keys:write
| Champ | Type | Requis | Valeurs |
|---|---|---|---|
label | string | oui | - |
publicKey | string | oui | une ligne de clé publique OpenSSH |
curl -X POST -H "Authorization: Bearer $FRESHPERF_KEY" \ -H "Content-Type: application/json" \ -d '{"label":"portable","publicKey":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... admin@laptop"}' \ https://api.freshperf.fr/v1/ssh-keys
Répond 201 avec la clé, publicKey compris.
| Erreur | Statut | Quand |
|---|---|---|
SSH_KEY_FORMAT_INVALID | 400 | ce n'est pas une ligne de clé publique |
DUPLICATE_KEY:<id> | 400 | la même clé est déjà sur le compte. Le suffixe donne son id |
DELETE /ssh-keys/{id}
Permissions : account.ssh_keys:write
{ "data": { "deleted": true } }
Un id inconnu répond 404 SSH_KEY_NOT_FOUND.
Compte
GET /me
Permissions : account:read
Le compte et la clé qui appelle.
Champ de account | Type | Notes |
|---|---|---|
id | entier | |
email | string | |
firstName, lastName | string ou null | |
company | booléen | le compte est enregistré comme société |
companyName | string ou null | |
country | string ou null | ISO 3166-1 alpha-2 |
createdAt | entier | millisecondes epoch |
emailVerified, twoFactorEnabled | booléen |
Champ de key | Type | Notes |
|---|---|---|
id | entier | |
label | string | |
keyPrefix | string | fpk_ + 8 caractères |
scopes | tableau de string | les permissions portées |
allServices | booléen | |
serviceCodes | tableau de string | vide quand allServices vaut true |
ipAllowlist | tableau de string | vide quand toute adresse est acceptée |
expiresAt | entier ou null | millisecondes epoch |
spendingCapCents | entier ou null | null sans plafond |
spendingRemainingCents | entier ou null | ce qu'il reste sur la fenêtre de 30 jours |
GET /me/key
Aucune permission requise. Toute clé valable peut demander ce qu'elle est.
Rend le seul bloc key ci-dessus. Utile pour vérifier au démarrage qu'une clé porte encore ce que votre intégration attend.
GET /account/notifications
Permissions : account.notifications:read
| Paramètre | Type | Requis | Valeurs |
|---|---|---|---|
page | entier | non, défaut 1 | 1 ou plus. 0 répond 400 VALIDATION_ERROR:page |
limit | entier | non, défaut 20 | 1 à 50 |
unreadOnly | string | non | true pour ne lister que les non lues. Toute autre valeur vaut false |
L'enveloppe n'est pas celle des autres listes : pas de bloc pagination.
{ "data": { "total": 27, "unread": 4, "items": [ { "id": 167, "type": "api_key_created", "kind": "security", "read": false, "link": "/dashboard/api-keys", "createdAt": 1787906983422, "title": { "fr-fr": "Clé d'API créée", "en-us": "API key created" }, "message": { "fr-fr": "La clé « backup-cron » a été créée sur votre compte." } } ] } }
| Champ | Type | Notes |
|---|---|---|
total | entier | le total du filtre demandé : avec unreadOnly=true, c'est le nombre de non lues |
unread | entier | toujours le nombre de non lues |
items[].title, items[].message | objet locale → texte, ou null | |
items[].link | string ou null | chemin dans le tableau de bord |
GET /account/access
Permissions : account.access:read
Qui a un accès délégué au compte. Lecture seule : les invitations se gèrent dans le tableau de bord.
| Champ | Type | Notes |
|---|---|---|
id | entier | |
status | string | PENDING, ACCEPTED, DECLINED, REVOKED, EXPIRED |
invitedEmail | string | l'adresse invitée |
granteeName | string ou null | renseigné une fois l'invitation acceptée |
accountPermissions | tableau de string | ACCOUNT_TICKETS_VIEW, ACCOUNT_TICKETS_MANAGE |
services[] | tableau | serviceCode plus permissions |
services[].permissions | tableau de string | SERVICE_POWER, SERVICE_CONSOLE, SERVICE_FILES, SERVICE_BACKUPS, SERVICE_DATABASES, SERVICE_ALLOCATIONS, SERVICE_SCHEDULES, SERVICE_STARTUP, SERVICE_VERSIONS, SERVICE_CONTENT, SERVICE_SUBDOMAINS, SERVICE_REINSTALL, SERVICE_FIREWALL, SERVICE_RDNS, SERVICE_SFTP |
createdAt | entier | millisecondes epoch |
acceptedAt | entier ou null | millisecondes epoch |
Les invitations révoquées ne sont pas listées.