API d'hébergementTout ce que fait le configurateur, via HTTP.

Des jetons Bearer avec les scopes de votre choix, une idempotence sur chaque écriture, une pagination par curseur, et un point de terminaison de statut qui ne demande aucune clé — parce que le moment où vous avez le plus besoin de l’interroger est peut-être celui où votre compte est justement en panne.

points de terminaison13

Démarrage rapide

Aucun SDK requis · Aucune surprise de versionnage · Aucune limite de débit que vous atteindrez

Démarrage rapide

Un serveur, à partir de rien, en deux appels.

Créez une clé dans l'espace client, choisissez ses portées, et elle s'affiche une seule fois. Il n'y a pas de clé maîtresse sur ce compte, et aucun moyen d'élargir une clé après coup — créez-en une nouvelle à la place.

1 — voyez ce que vous pouvez acheter

curl -s https://api.dediprivacy.com/v1/plans?family=vps \
  -H "Authorization: Bearer $DP_KEY"

2 — déployez-le

curl -s -X POST https://api.dediprivacy.com/v1/servers \
  -H "Authorization: Bearer $DP_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -H "Content-Type: application/json" \
  -d '{
        "plan":   "vps-4",
        "region": "ams",
        "image":  "debian-13",
        "cycle":  "12"
      }'

Le provisionnement puise sur le solde du compte. Un appel qui le mettrait à découvert échoue avec 402 et le manque exact plutôt que de construire une machine à moitié — il n'existe pas d'état partiellement provisionné à nettoyer, et aucune facture n'arrive plus tard.

Conventions

Les parties identiques à chaque appel, décidées une fois pour toutes pour ne jamais avoir à les rechercher deux fois.

URL de base
https://api.dediprivacy.com/v1 TLS uniquement, HTTP/2, et aucun port non chiffré depuis lequel rediriger. Une requête en clair est refusée plutôt que mise à niveau, car une mise à niveau signifie que la requête a déjà traversé le réseau une fois.
Authentification
Jeton bearer, par clé Les clés sont créées dans l’espace client avec les portées de votre choix, affichées une seule fois, et stockées sous forme hachée. Il n’y a ni clé maîtresse ni authentification par mot de passe sur cette API.
Type de contenu
application/json Sur les requêtes et les réponses. Les horaires sont au format RFC 3339 en UTC, l'argent est un nombre entier de centimes, et aucun format ne dépend de la locale, nulle part.
Idempotence
Idempotency-Key sur chaque POST Une clé répétée renvoie la réponse d'origine plutôt que de provisionner deux fois. Les clés sont mémorisées pendant 24 heures, plus longtemps que ne devrait durer toute boucle de nouvelle tentative.
Limite de débit
600 requêtes par minute Par clé, renvoyé dans X-RateLimit-Remaining. Les appels de provisionnement sont limités séparément à 60 par heure ; demandez si cela vous gêne réellement.
Pagination
Curseur, pas numéro de page Un next_cursor dans chaque réponse de liste. La pagination par offset saute silencieusement des lignes quand l'ensemble sous-jacent change, et nous préférons ne pas vous livrer ce bug.

Identifiants

Lu depuis le même catalogue qui alimente les listes de prix publiques et le configurateur. Une région ajoutée au parc apparaît ici sans que personne n'édite cette page.

région

  • kefReykjavík
  • otpBucarest
  • sofSofia
  • kivChișinău
  • zrhZurich
  • amsAmsterdam
  • ptyPanama
  • sinSingapour

famille

  • vpsVPS cloud
  • rdpWindows RDP
  • dédiéServeurs dédiés
  • gpuCalcul GPU
  • private-cloudCloud privé
  • web-hostingHébergement web
  • stockageStockage objet et bloc
  • colocationColocation
  • personnaliséConfiguration personnalisée

cycle

  • 11 mois
  • 33 moiss, −5 %
  • 1212 moiss, −20 %
  • 2424 moiss, −35 %

Points de terminaison

Catalogue

Tout ce qui peut être commandé, avec des prix en direct. Aucune authentification requise — ce sont les mêmes chiffres qui alimentent les grilles tarifaires publiques.

GET /regions Lister les régions

Chaque région avec son identifiant, sa ville, son pays et son état opérationnel actuel.

Réponse

{
  "data": [
    { "id": "ams", "city": "Amsterdam", "country": "Netherlands",
      "status": "operational", "uplink_gbit": 600 }
  ]
}
GET /plans Lister les forfaits

Filtrez par famille avec ?family=vps. Les prix sont mensuels, en centimes, avant toute remise de cycle.

Réponse

{
  "data": [
    { "id": "vps-4", "family": "vps", "cores": 4, "ram_gb": 8,
      "disk_gb": 160, "price_cents": 1100, "regions": ["ams","kef"] }
  ],
  "next_cursor": null
}
GET /images Lister les images

Images système disponibles par famille, avec la situation de licence de chacune.

Réponse

{
  "data": [
    { "id": "debian-13", "name": "Debian 13", "licence": "incluse" },
    { "id": "win-2025", "name": "Windows Server 2025", "licence": "incluse" }
  ]
}

Points de terminaison

Serveurs

Créer, inspecter et contrôler des machines. Le provisionnement prélève sur le solde du compte ; une requête qui le mettrait à découvert échoue avec un 402 et le manque exact, plutôt que de construire quelque chose à moitié.

POST /servers Déployer un serveur

Retourne immédiatement avec le statut « provisioning ». Interrogez la ressource ou utilisez un webhook.

Requête

{
  "plan": "vps-4",
  "region": "ams",
  "image": "debian-13",
  "cycle": "12",
  "label": "edge-01",
  "ssh_keys": ["ssh-ed25519 AAAA..."]
}

Réponse

{
  "id": "srv_8Kq2",
  "status": "provisioning",
  "region": "ams",
  "ipv4": null,
  "charged_cents": 10560,
  "renews_at": "2027-07-28T00:00:00Z"
}
GET /servers Lister les serveurs

Tout sur le compte, du plus récent au plus ancien.

Réponse

{
  "data": [
    { "id": "srv_8Kq2", "label": "edge-01", "status": "active",
      "region": "ams", "ipv4": "203.0.113.10",
      "ipv6": "2001:db8:1234:5678::2" }
  ],
  "next_cursor": null
}
GET /servers/{id} Récupérer un serveur

Détail complet, y compris la configuration, les adresses et le prochain renouvellement.

Réponse

{
  "id": "srv_8Kq2",
  "status": "active",
  "plan": "vps-4",
  "image": "debian-13",
  "cycle": "12",
  "renews_at": "2027-07-28T00:00:00Z"
}
POST /servers/{id}/actions Agir sur un serveur

Un seul point d'entrée, un champ d'action : reboot, shutdown, start, rebuild, resize, rdns.

Requête

{
  "action": "rebuild",
  "image": "ubuntu-26-04"
}

Réponse

{
  "id": "act_3Xf9",
  "action": "rebuild",
  "status": "running"
}
DELETE /servers/{id} Annuler un serveur

Va jusqu'au terme déjà payé. Passez ?immediate=true pour le détruire maintenant et arrêter de payer dès aujourd'hui.

Réponse

{
  "id": "srv_8Kq2",
  "status": "cancelled",
  "ends_at": "2027-07-28T00:00:00Z"
}

Points de terminaison

Facturation

Un seul solde finance tout. Il n'existe pas d'objet facture car il n'y a rien à relancer — un service puise sur le solde à sa date de renouvellement.

GET /balance Récupérer le solde

Solde actuel, montant engagé pour les renouvellements, et durée restante au rythme de consommation actuel.

Réponse

{
  "balance_cents": 48250,
  "committed_cents": 12400,
  "runway_days": 117
}
POST /topups Ouvrir un rechargement

Renvoie une adresse de paiement pour l'actif choisi. Tout bonus est appliqué au moment où le paiement se confirme.

Requête

{
  "amount_cents": 100000,
  "asset": "XMR"
}

Réponse

{
  "id": "top_5Wc1",
  "asset": "XMR",
  "address": "4A...",
  "amount": "3.417",
  "bonus_cents": 30000,
  "expires_at": "2026-07-28T18:00:00Z"
}
GET /ledger Lister les écritures du registre

Chaque crédit et débit, avec le service auquel il se rapporte. C'est l'intégralité de ce que nous détenons sur vos paiements.

Réponse

{
  "data": [
    { "at": "2026-07-28T16:04:00Z", "cents": -1100,
      "kind": "renewal", "ref": "srv_8Kq2" }
  ]
}

Points de terminaison

État

Public et non authentifié, afin de pouvoir être interrogé par quelque chose qui ne détient pas votre clé — et pour qu'il réponde encore même si c'est votre compte qui est en panne.

GET /status État actuel

Les mêmes chiffres que la page de statut, calculés à partir du même registre d'incidents.

Réponse

{
  "state": "operational",
  "open_incidents": 0,
  "uptime_90d": 99.9971,
  "regions": { "ams": "operational", "kef": "operational" }
}
GET /incidents Lister les incidents

Le registre lui-même, filtrable par région et par date.

Réponse

{
  "data": [
    { "id": "inc_71", "region": "otp", "severity": "partial",
      "started_at": "2026-06-07T02:14:00Z",
      "unreachable_seconds": 1080 }
  ]
}

Erreurs

Chaque panne porte un identifiant stable code et un message écrit pour une personne. Faites correspondre le code ; le message peut évoluer.

400 invalid_request Le corps de la requête n'a pas pu être analysé, ou un champ est du mauvais type. Le message nomme le champ concerné.
401 non authentifié Aucune clé, une clé malformée, ou une clé révoquée.
403 scope_missing La clé est valide mais n’a pas été créée avec la portée requise pour cet appel. Les portées sont choisies par clé et ne peuvent pas être élargies après coup.
402 insufficient_funds Le solde ne suffirait pas. La réponse porte required_cents et balance_cents, de sorte que vous puissiez agir sans second appel.
404 not_found Aucune ressource de ce type sur ce compte. Délibérément identique à la réponse donnée pour une ressource sur le compte de quelqu'un d'autre.
409 conflit La ressource est occupée — généralement une action déjà en cours sur ce serveur.
422 indisponible Valide, mais actuellement impossible : le forfait est en rupture de stock dans cette région, ou l'image n'est pas proposée pour cette famille.
429 rate_limited Retry-After est défini, et il est exact plutôt qu'une constante.
5xx server_error Le nôtre. Sans risque à réessayer avec la même Idempotency-Key — c'est précisément à cela qu'elle sert.

A 404 pour une ressource sur le compte de quelqu’un d’autre est identique, octet pour octet, à celle pour une ressource qui n’a jamais existé. C’est délibéré : des réponses différenciables transforment une API en oracle pour recenser l’infrastructure d’autrui.