Browse the documentation

Tickets, SSH keys and account

Tickets

GET /tickets

Permissions: tickets:read

ParameterTypeRequiredValues
limitintegerno, default 201 to 100
cursorstringnooffset cursor
statusstringnoOPEN, IN_PROGRESS, WAITING_CUSTOMER, WAITING_SUPPORT, RESOLVED, CLOSED

Sorted on the last update, not on the creation date.

FieldTypeNotes
ticketNumberstringthe identifier every ticket route takes
subjectstring
statusstringthe values above
prioritystringLOW, MEDIUM, HIGH, URGENT
categorystringGENERAL, TECHNICAL, BILLING, ACCOUNT
serviceCodestring or nullthe service concerned
createdAt, updatedAtintegerepoch milliseconds
lastMessageAtinteger or nullepoch milliseconds
messageCountinteger
unreadbooleansupport wrote something you have not read

GET /tickets/{ticketNumber}

Permissions: tickets:read

This call marks the ticket as read.

Carries the summary fields, without unread and messageCount, and adds:

FieldTypeNotes
descriptionstringthe first message, repeated
closedAtinteger or nullepoch milliseconds
messages[]arraythe conversation, in order
messages[] fieldTypeNotes
idinteger
senderstringCUSTOMER, SUPPORT, SYSTEM
contentstring
attachmentsintegerthe count of attachments. They download from the dashboard
createdAtintegerepoch milliseconds

POST /tickets

Permissions: tickets:write

FieldTypeRequiredValuesWhere it comes from
subjectstringyes200 characters at most-
messagestringyes10 000 characters at most-
categorystring or nullno, default GENERALGENERAL, TECHNICAL, BILLING, ACCOUNT-
prioritystring or nullno, default MEDIUMLOW, MEDIUM, HIGH, URGENT-
serviceCodestring or nullno-GET /servicescode

A value outside its enum answers 400 VALIDATION_ERROR:category or 400 VALIDATION_ERROR:priority, never the default.

curl -X POST -H "Authorization: Bearer $FRESHPERF_KEY" \
     -H "Content-Type: application/json" \
     -d '{"subject":"Disk full","message":"The disk has been full since this morning.","category":"TECHNICAL","priority":"HIGH","serviceCode":"SRV-TJUAQ1-1951"}' \
     https://api.freshperf.fr/v1/tickets

Answers 201 with the whole ticket, messages[] included.

ErrorStatusWhen
VALIDATION_ERROR:subject400empty, or beyond 200 characters
VALIDATION_ERROR:message400empty, or beyond 10 000 characters
VALIDATION_ERROR:category, VALIDATION_ERROR:priority400value outside its enum
SUBJECT_TOO_SHORT400subject too short for support
SERVICE_NOT_FOUND404serviceCode unknown, or outside the key's reach

POST /tickets/{ticketNumber}/messages

Permissions: tickets:write

FieldTypeRequiredValues
messagestringyes10 000 characters at most

Answers 201 with the message created. Replying to a closed ticket reopens it.

POST /tickets/{ticketNumber}/close

Permissions: tickets:write

No body. Answers 200 with the ticket summary, status at CLOSED.

SSH keys

The account's SSH keys are offered when ordering a VPS. A removed key stays installed on already-provisioned servers until they are reinstalled.

GET /ssh-keys and GET /ssh-keys/{id}

Permissions: account.ssh_keys:read

The whole list, unpaginated.

FieldTypeNotes
idintegerpass it back to delete
labelstring
keyTypestring or nulle.g. ssh-ed25519
fingerprintstring or nullSHA-256 in hex
commentstring or nullthe end-of-line comment
publicKeystring or nullthe full line. Present on the single read and on creation, null in the list
createdAtintegerepoch milliseconds
lastUsedAtinteger or nullepoch milliseconds

POST /ssh-keys

Permissions: account.ssh_keys:write

FieldTypeRequiredValues
labelstringyes-
publicKeystringyesan OpenSSH public key line
curl -X POST -H "Authorization: Bearer $FRESHPERF_KEY" \
     -H "Content-Type: application/json" \
     -d '{"label":"laptop","publicKey":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... admin@laptop"}' \
     https://api.freshperf.fr/v1/ssh-keys

Answers 201 with the key, publicKey included.

ErrorStatusWhen
SSH_KEY_FORMAT_INVALID400not a public key line
DUPLICATE_KEY:<id>400the same key is already on the account. The suffix gives its id

DELETE /ssh-keys/{id}

Permissions: account.ssh_keys:write

{ "data": { "deleted": true } }

An unknown id answers 404 SSH_KEY_NOT_FOUND.

Account

GET /me

Permissions: account:read

The account and the calling key.

account fieldTypeNotes
idinteger
emailstring
firstName, lastNamestring or null
companybooleanthe account is registered as a company
companyNamestring or null
countrystring or nullISO 3166-1 alpha-2
createdAtintegerepoch milliseconds
emailVerified, twoFactorEnabledboolean
key fieldTypeNotes
idinteger
labelstring
keyPrefixstringfpk_ + 8 characters
scopesarray of stringthe permissions it carries
allServicesboolean
serviceCodesarray of stringempty when allServices is true
ipAllowlistarray of stringempty when any address is accepted
expiresAtinteger or nullepoch milliseconds
spendingCapCentsinteger or nullnull when there is no cap
spendingRemainingCentsinteger or nullwhat is left in the 30-day window

GET /me/key

No permission required. Any valid key may ask what it is.

Returns the key block alone. Useful at start-up, to check a key still carries what your integration expects.

GET /account/notifications

Permissions: account.notifications:read

ParameterTypeRequiredValues
pageintegerno, default 11 or more. 0 answers 400 VALIDATION_ERROR:page
limitintegerno, default 201 to 50
unreadOnlystringnotrue to list unread only. Any other value means false

The envelope is not the one other lists use: no pagination block.

{ "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": { "en-us": "The key \"backup-cron\" was created on your account." } }
  ]
} }
FieldTypeNotes
totalintegerthe total for the filter asked: with unreadOnly=true it is the unread count
unreadintegeralways the unread count
items[].title, items[].messageobject locale → text, or null
items[].linkstring or nulla path in the dashboard

GET /account/access

Permissions: account.access:read

Who has delegated access to the account. Read-only: invitations are managed in the dashboard.

FieldTypeNotes
idinteger
statusstringPENDING, ACCEPTED, DECLINED, REVOKED, EXPIRED
invitedEmailstringthe address invited
granteeNamestring or nullset once the invitation is accepted
accountPermissionsarray of stringACCOUNT_TICKETS_VIEW, ACCOUNT_TICKETS_MANAGE
services[]arrayserviceCode plus permissions
services[].permissionsarray of stringSERVICE_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
createdAtintegerepoch milliseconds
acceptedAtinteger or nullepoch milliseconds

Revoked invitations are not listed.

    Tickets, SSH keys and account | FreshPerf