# Services

> Lister ses services, en lire un, suivre son état en direct.

Un **service**, c'est une ressource qui tourne chez nous : un serveur de jeu, une
application, une base de données, une instance. Toutes les routes de cette section
vivent sous `/api/resources` et demandent un jeton de portée
[`FULL`](/api/authentification#les-deux-portées).

## Lister

```http
GET /api/resources
```

```json
{
  "items": [
    {
      "id": "cmu648fgr0001it3v57ywrfvj",
      "name": "Serveur MC",
      "family": "GAME",
      "status": "ACTIVE",
      "canPower": true,
      "address": "51.210.44.12:25565",
      "product": { "slug": "minecraft", "name": "Minecraft", "shortName": "AGS" },
      "runtime": { "id": "cmr…", "slug": "paper-1-21", "name": "Paper 1.21" },
      "host": { "id": "cmr25fjrv…", "label": "Gravelines — France", "locationLabel": "Gravelines" },
      "dimensions": { "cpuCores": 4, "ramGb": 8, "storageGb": 80 },
      "monthlyMillicents": 12400,
      "hourlyLabel": "0,017 €/h",
      "isFree": false,
      "createdAt": "2026-09-15T11:54:02.000Z"
    }
  ]
}
```

La liste ne contient jamais les services supprimés.

### Les familles

`family` dit de quoi il s'agit, et commande ce que le service accepte.

| `family` | Gamme | Ce que c'est |
| --- | --- | --- |
| `GAME` | AGS | Un serveur de jeu sur notre daemon |
| `APP` | ACS | Une image Docker : la tienne, ou une du catalogue (les bases de données en sont) |
| `COMPUTE` | ACI | Une instance Linux en conteneur |
| `VIRTUAL_MACHINE` | AVM | Une machine virtuelle, ton propre noyau |
| `DEDICATED` | ABM | Une machine entière |
| `BUCKET` | AOS | Du stockage objet |

### Les états

`status` suit une machine à états unique, quelle que soit la famille.

| `status` | Ce qu'il veut dire |
| --- | --- |
| `PROVISIONING` | En cours de création |
| `AWAITING_ADMIN` | Une intervention humaine est requise de notre côté |
| `ACTIVE` | En service, facturé au tarif plein |
| `SUSPENDED` | Suspendu, facturé au seul stockage |
| `DELETING` | Suppression en cours |
| `DELETED` | Supprimé — n'apparaît plus dans les listes |
| `FAILED` | La création a échoué ; `failureReason` dit pourquoi |

## Lire un service

```http
GET /api/resources/{id}
```

```json
{
  "id": "cmu4d89050001itk8fqh41egq",
  "name": "demo-app",
  "family": "APP",
  "status": "ACTIVE",
  "projectId": "prj_0d3b6964bcbe4fd8518f",
  "product": { "slug": "applications", "name": "Applications", "shortName": "ACS" },
  "runtime": null,
  "host": { "id": "cmr25fjrv…", "label": "Gravelines — France", "locationLabel": "Gravelines" },
  "maintenance": null,
  "dimensions": { "cpuCores": 1, "ramGb": 1, "storageGb": 15 },
  "pricing": {
    "monthlyMillicents": 1100,
    "storageMonthlyMillicents": 120,
    "billedMonthlyMillicents": 1100,
    "monthlyCents": 110,
    "minBalanceCents": 4,
    "hourlyLabel": "0,002 €/h",
    "isFree": false,
    "freeExpiresAt": null
  },
  "dates": { "createdAt": "2026-09-16T17:19:24.821Z", "suspendedAt": null, "deletedAt": null },
  "failureReason": null,
  "panelUrl": null,
  "address": null,
  "capabilities": ["files", "logs", "backups", "powerSignals", "variables"]
}
```

<Note>
`billedMonthlyMillicents` est ce qui court **maintenant** : il vaut
`monthlyMillicents` quand le service est actif, et `storageMonthlyMillicents`
quand il est suspendu. C'est le seul des deux à regarder pour prévoir une dépense.
</Note>

### Les capacités

`capabilities` est la liste de ce que ce service-là accepte. Elle dépend de sa famille
**et** de son état : une console n'existe que sur un service actif.

| Capacité | Ouvre |
| --- | --- |
| `console` | [La console](/api/console) |
| `consoleCommands` | L'envoi de commandes à la console |
| `powerSignals` | [Marche et arrêt](/api/cycle-de-vie) |
| `suspension` | Suspendre et rétablir |
| `files` | [Le gestionnaire de fichiers](/api/fichiers) |
| `logs` | [Les journaux](/api/journaux) |
| `backups` | [Les sauvegardes](/api/sauvegardes) |
| `snapshots`, `snapshotRollback` | Les instantanés |
| `variables` | [Les variables](/api/variables) |
| `allocationLabels` | Les libellés de ports |

Appeler une route dont la capacité manque rend un `400` explicite plutôt qu'un
comportement silencieux :

```json
{
  "statusCode": 400,
  "message": "Cette ressource ne propose pas le gestionnaire de fichiers."
}
```

**Teste la capacité, pas la famille.** Elle bouge avec l'état du service, et elle est la
seule source à jour.

## L'état en direct

```http
GET /api/resources/metrics?ids=cmu4d89…,cmu648f…
```

```json
{
  "cmu4d89050001itk8fqh41egq": {
    "state": "running",
    "cpuAllocationPercent": 0.4,
    "ramBytes": 16887808,
    "storageBytes": 48361472,
    "uptimeSeconds": 39957,
    "netRxBytes": 3308,
    "netTxBytes": 126
  }
}
```

`state` vaut `running`, `stopped`, `starting`, `stopping`, `installing` ou `unknown`.
Un service que le nœud ne sait pas joindre rend `null` plutôt que de faire échouer
l'appel entier.

<Warning>
`state` n'est pas `status`. `status` est la vie administrative du service (créé,
suspendu, supprimé), `state` est ce que fait son conteneur à la seconde près. Un service
`ACTIVE` peut très bien être `stopped`.
</Warning>

Jusqu'à 50 identifiants par appel. Au-delà, découpe.
