API JSON
Pilotez CreationDePerso depuis un script ou un assistant IA : lecture du catalogue, création de monstres, d’objets, de campagnes, de quêtes et de personnages, avec exactement les mêmes règles que le site.
Authentification
Générez une clé personnelle depuis Mon espace → Clés API et envoyez-la dans l’en-tête Authorization de chaque appel :
curl -H "Authorization: Bearer cpk_…" https://www.creationdeperso.com/api/v1/me
La clé porte les droits de votre compte : un joueur lit le catalogue et gère ses personnages, un MJ forge en plus des monstres et des objets et rédige ses campagnes et quêtes.
Droits d’une clé
Chaque clé porte une liste de droits choisie à sa création (et modifiable ensuite) : des entrées <code>famille.action</code>, ou une famille entière <code>famille.*</code>. Un droit ne dépasse jamais les rôles du compte : une clé avec <code>monsters.create</code> sur un compte sans rôle MJ reste refusée. <code>GET /me</code> renvoie les droits de la clé.
| Famille | Entrées |
|---|---|
| Catalogue | catalog.read |
| Personnages | characters.read · characters.create · characters.delete |
| Objets forgés | items.read · items.create · items.update · items.delete · items.publish |
| Monstres | monsters.read · monsters.create · monsters.update · monsters.delete · monsters.publish |
| Campagnes | campaigns.read · campaigns.create · campaigns.update · campaigns.delete · campaigns.publish |
| Quêtes | quests.read · quests.create · quests.update · quests.delete · quests.publish · quests.activate |
Un appel hors des droits de la clé répond <code>403 insufficient_scope</code> avec le droit manquant dans <code>requiredScope</code>.
Conventions
- Les éléments de catalogue sont désignés par leur slug (<code>key</code>), jamais par un identifiant numérique. Seuls les personnages, campagnes et quêtes, et les ressources que vous créez, portent un <code>id</code>.
- Une liste est enveloppée dans <code>{ items, total }</code> (paginée : <code>{ items, page, perPage, total }</code>, <code>perPage</code> ≤ 100).
- L’en-tête <code>Accept-Language</code> (fr par défaut, en, de, es) choisit la langue des noms du catalogue et des messages d’erreur.
- Chaque compte dispose de 1 000 appels par heure (en-têtes <code>X-RateLimit-*</code>).
Toute erreur répond avec une enveloppe unique :
{
"error": {
"code": "validation_failed",
"message": "…",
"violations": [ { "path": "hitPoints", "message": "…" } ]
}
}
| Code | Signification |
|---|---|
401 unauthenticated | Clé absente, inconnue, révoquée ou expirée. |
403 forbidden | Le compte n’a pas le rôle requis (par exemple MJ pour la forge). |
403 insufficient_scope | La clé est valide mais n’a pas ce droit (voir « Droits d’une clé »). |
404 not_found | Ressource inconnue, ou qui ne vous appartient pas. |
409 conflict / insufficient_credits | L’état de la ressource refuse l’action (transition impossible, objet utilisé, crédits de forge insuffisants). |
422 validation_failed | Charge utile invalide : <code>violations</code> détaille chaque champ fautif. |
429 rate_limited | Quota horaire dépassé : réessayer après <code>Retry-After</code>. |
500 internal | Erreur interne : citez le requestId de la réponse pour que l’incident soit retrouvé dans le journal. |
Les longueurs maximales et les bornes de chaque champ (maxLength, minimum, maximum) sont déclarées dans le schéma OpenAPI : ce sont les règles du site, un dépassement répond 422. Un corps relu par GET peut être renvoyé tel quel en PUT, ses champs en lecture seule inclus.
Lecture du catalogue
Commencez par lire le catalogue pour connaître les slugs à envoyer. Les tables « homebrew » (armes, armures, équipement, attaques, monstres) sont filtrées à ce que votre compte peut voir : contenu intégré, contenu public validé et vos propres créations (champ <code>origin</code>).
| Point d’accès | Effet |
|---|---|
GET /api/v1/me | Le compte derrière la clé, ses rôles et son solde de crédits. |
GET /api/v1/catalog/species | Espèces et lignées (<code>requiresLineage</code> dit si une lignée est obligatoire). |
GET /api/v1/catalog/classes | Classes, sous-classes et budgets de niveau 1 (compétences, expertise, or, sorts, paquetage). |
GET /api/v1/catalog/backgrounds | Historiques 2024 : compétences offertes, options de bonus +2/+1, don d’origine. |
GET /api/v1/catalog/skills, …/feats | Compétences et dons. |
GET /api/v1/catalog/spells?class=&level= | Sorts, filtrables par classe et par niveau (0 = tours de magie). |
GET /api/v1/catalog/weapons, …/armors, …/equipment, …/specific-attacks | Armes, armures, équipement et attaques spécifiques visibles par votre compte. |
GET /api/v1/catalog/monsters | Bestiaire utilisable comme modèle ou adversaire de quête. |
GET /api/v1/catalog/worlds, …/places, …/badges | Mondes, lieux (hiérarchie via <code>parent</code>) et badges de récompense. |
GET /api/v1/catalog/rules | Vocabulaires fermés (caractéristiques, tailles, types de dégâts, propriétés, FP légaux, alignements) et tables de règles. |
Forge : objets et monstres (MJ)
Mêmes règles que la forge du site : chaque création débite son coût en crédits (rien n’est écrit si le solde est insuffisant), le contenu naît privé et passe par la modération pour devenir public, le facteur de puissance d’un monstre ne peut pas descendre sous l’estimation de ses statistiques. Les modifications et suppressions sont gratuites.
| Point d’accès | Effet |
|---|---|
POST /api/v1/items/{type} | Forger une arme, une armure, un équipement ou une attaque spécifique (<code>type</code> : <code>weapons</code>, <code>armors</code>, <code>equipment</code>, <code>specific-attacks</code>). |
GET / PUT / DELETE /api/v1/items/{type}/{id} | Lire, remplacer ou supprimer un de mes objets (409 s’il est utilisé par un inventaire ou un monstre). |
POST /api/v1/monsters | Forger un monstre : bloc de statistiques complet, compétences (<code>{clé: 1|2}</code>), attaques par slug d’arme ou d’attaque spécifique. |
POST /api/v1/monsters/estimate | Coût et FP estimé d’un bloc, sans rien créer. |
GET / PUT / DELETE /api/v1/monsters/{id} | Lire (les miens, intégrés ou publics), remplacer ou supprimer un monstre. |
POST …/{id}/request-publication | Demander la publication (privé → en attente de validation). |
curl -X POST -H "Authorization: Bearer cpk_…" -H "Content-Type: application/json" \
-d '{"name":"Gobelin des cendres","challengeRating":"1/4","armorClass":15,"hitPoints":7,
"abilities":{"str":8,"dex":14,"con":10,"int":10,"wis":8,"cha":8},
"skills":{"stealth":2},"attacks":[{"weapon":"scimitar"}]}' \
https://www.creationdeperso.com/api/v1/monsters
Campagnes et quêtes (MJ)
Le MJ est toujours le compte appelant. Les personnages sont désignés par leur <code>id</code> : un membre du groupe doit être public et réclamé, un PNJ lié doit être une de vos fiches, un invité doit être public, réclamé et hors du groupe. Une campagne ou une quête publique retouchée repasse en attente de validation.
| Point d’accès | Effet |
|---|---|
GET / POST /api/v1/campaigns | Lister mes campagnes, en créer une (<code>world</code> slug facultatif, <code>party</code> ids). |
GET / PUT / DELETE /api/v1/campaigns/{id} | Lire, remplacer ou supprimer une campagne (409 si d’autres tables l’ont adoptée). |
GET /api/v1/campaigns/{id}/quests | Les quêtes d’une campagne dans l’ordre de jeu. |
POST /api/v1/quests | Créer une quête : <code>campaignId</code>, lieu et badge par slug, PNJ, monstres (slug + nombre), invités. |
GET / PUT / DELETE /api/v1/quests/{id} | Lire, remplacer ou supprimer une quête (409 si d’autres tables l’ont jouée). |
POST /api/v1/quests/{id}/activate | Activer la quête sur une table : fige une version et ouvre (ou reprend) la partie. |
POST …/{id}/request-publication | Demander la publication (privé → en attente de validation). |
Personnages
La création suit exactement les règles du formulaire du site : les six scores sont une permutation du tirage émis par le serveur (obtenu par l’endpoint de tirage, renvoyé sous la forme du jeton <code>abilityRollToken</code>, valable cinq minutes et consommé une seule fois), la lignée est requise quand l’espèce en a, la répartition d’historique doit être légale, les compétences, dons, sorts et équipement restent dans les budgets de niveau 1. Une règle enfreinte répond 422 avec le chemin du champ en cause.
| Point d’accès | Effet |
|---|---|
POST /api/v1/characters/roll-abilities | Obtenir un tirage de caractéristiques émis par le serveur : un jeton, la graine et six scores à répartir. Deux tirages par création, un de plus tant que le dernier est sans espoir ; sinon le même tirage revient sous un jeton neuf, valable cinq minutes. |
POST /api/v1/characters | Créer un personnage de niveau 1 (espèce, lignée, classe, historique, scores, compétences, dons, équipement, sorts…). |
GET /api/v1/characters, …?scope=public | Mes personnages, ou la galerie publique. |
GET / DELETE /api/v1/characters/{id} | Lire une fiche visible (avec la feuille dérivée : CA, PV, jets, attaques, grimoire) ; supprimer une des miennes. |
Le document machine complet est servi en OpenAPI.