Communitygithub.com

Conception d'API REST

Conçoit des surfaces d'API REST – nommage des ressources, sémantique des méthodes HTTP et des codes de statut, formats d'erreur, pagination et filtrage – et produit un cahier des charges d'endpoint qu'un consommateur peut exploiter sans poser de questions. À utiliser lorsque quelqu'un demande "comment nommer cet endpoint", "quel code de statut renvoyer", "PUT ou PATCH", "comment paginer cette liste" ou qu'il examine une API avant sa mise en production. Ne pas utiliser pour planifier des rollouts de changements cassants et des fenêtres de dépréciation – utilisez plutôt api-versioning-strategist ; pour la conception de types et résolveurs GraphQL – utilisez graphql-schema ; pour générer des SDK clients à partir d'un cahier des charges existant – utilisez api-client-generator ; pour concevoir des endpoints webhook entrants – utilisez webhook-receiver-hardener.

Qu'est-ce que Conception d'API REST ?

Cette compétence guide la conception d'API REST cohérentes et évolutives, en suivant un processus structuré en six étapes. Elle commence par la collecte des prérequis (consommateurs, entités, taille des collections, ratios lecture/écriture, modèle d'authentification), puis passe au nommage des ressources (pluriels, imbrication limitée, absence de verbes dans les chemins). Ensuite, elle attribue les méthodes HTTP et codes de statut appropriés, définit un contrat d'erreur unifié, implémente une pagination par curseur pour les collections destinées à croître, et fixe des budgets de latence et de taille de réponse. L'objectif est de produire un cahier des charges d'endpoint qui élimine toute ambiguïté pour le consommateur, évitant ainsi les incohérences (mauvais codes de statut, pagination décalée, etc.) qui deviennent irréparables une fois intégrées. La compétence est conçue pour Claude Code et autres agents IA, et repose sur un fichier SKILL.md détaillant la procédure et les contre-exemples.

Compatible avec~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/SkillMedev/skills/tree/HEAD/skills/api-design

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait Conception d'API REST ?

Les API sont des produits : le modèle mental du consommateur, et non votre schéma de base de données, décide de la forme. L'erreur coûteuse que cette compétence évite est de livrer une surface incohérente – nommage mélangé, mauvais codes de statut, pagination par décalage sur une table croissante – que chaque consommateur durcit alors autour, rendant l'API effectivement irréparable une fois intégrée.

Procédure opérationnelle

Travaillez dans cet ordre. Les ressources viennent avant les méthodes car la sémantique des méthodes dépend de ce qu'est la ressource ; les contrats d'erreur et de pagination viennent avant la rédaction du cahier des charges car les adapter après coup casse les consommateurs.

Étape 1 : recueillir les prérequis

Collectez avant de concevoir. Étiquetez toute supposition comme une hypothèse.

  1. Les consommateurs : services internes, clients propriétaires ou développeurs externes. Les consommateurs externes élèvent la barre de cohérence – par défaut, considérez externe si inconnu.
  2. Les noms principaux du domaine et lesquels possèdent les autres (détermine l'imbrication).
  3. Tailles de collections attendues et croissance. Une liste pouvant dépasser environ 10 000 lignes exclut la pagination par décalage.
  4. Ratio lecture/écriture et attentes de latence par endpoint.
  5. Modèle d'authentification (affecte la correction des codes 401 vs 403).

Étape 2 : nommer les ressources

  • Noms au pluriel : /users, /orders, /products.
  • Imbriquez un niveau pour la possession : /users/{id}/orders. N'imbriquez pas à plus de deux niveaux – aplatissez avec des filtres à la place (/orders?user_id=... bat /users/{id}/orders/{oid}/items/{iid}).
  • Pas de verbes dans les chemins ; la méthode HTTP est le verbe. Pour les actions authentiques qui ne correspondent à aucun verbe CRUD (par exemple, envoyer une facture), modélisez une sous-ressource POST : POST /invoices/{id}/send-attempts.
  • Casse cohérente : kebab-case pour les segments de chemin multi-mots, snake_case pour les champs JSON – choisissez une fois, appliquez partout.

Étape 3 : attribuer les méthodes et codes de statut

  • GET : lecture, idempotent, pas de corps de requête. 200 avec corps.
  • POST : création. Renvoie 201 et un en-tête Location pointant vers la nouvelle ressource. Renvoie la représentation créée dans le corps pour que le client évite un GET ultérieur.
  • PUT : remplacement complet, idempotent. Les champs manquants signifient "effacer", pas "conserver".
  • PATCH : mise à jour partielle (JSON Merge Patch ou JSON Patch – indiquez lequel dans le cahier des charges).
  • DELETE : suppression, idempotent, renvoie 204. Supprimer une ressource déjà supprimée renvoie 204 ou 404 – choisissez et documentez-le.
  • Erreurs : 400 pour entrée malformée, 401 pour identifiants manquants/invalides, 403 pour identifiants valides sans autorisation, 404 pour ressources absentes (utilisez aussi 404 au lieu de 403 lorsque révéler l'existence est une fuite), 409 pour conflits d'état, 422 pour entrée bien formée mais sémantiquement invalide, 429 pour limites de débit (avec Retry-After), 500 pour erreurs serveur – n'exposez jamais de traces de pile ou d'identifiants internes.

Étape 4 : fixer le contrat d'erreur

Une forme pour chaque erreur, code lisible par machine en premier :

{
  "error": "validation_error",
  "message": "L'email est requis",
  "field": "email",
  "request_id": "req_abc123"
}

Le request_id doit être journalisé côté serveur pour que le support puisse corréler. Le message humain est destiné aux développeurs lisant les logs, jamais à l'affichage pour l'utilisateur final.

Étape 5 : fixer la pagination et le filtrage

  • Pagination par curseur pour toute collection qui croît : renvoie un curseur opaque et un indicateur has_more. La pagination par décalage n'est acceptable que pour les listes petites, limitées et destinées à l'administration – elle se dégrade linéairement et saute/duplique les lignes sous des écritures concurrentes.
  • Taille de page par défaut 25, maximum 100. Rejetez les tailles de page supérieures au maximum avec 400, ne réduisez pas silencieusement.
  • Filtrage et tri via paramètres de requête : ?status=active&sort=created_at:desc. Documentez les champs filtrables ; rejetez les paramètres de filtre inconnus avec 400 plutôt que de les ignorer (ignorer silencieusement cache des bugs clients).

Étape 6 : appliquer les budgets de performance et de charge utile

  • Budget de latence p95 : 300 ms pour les endpoints interactifs, 1 s pour les rapports/exports. Si une opération ne peut pas atteindre 1 s, rendez-la asynchrone : 202 Accepté plus une ressource de statut à interroger.
  • Budget de charge utile de réponse : maintenez les réponses typiques sous 100 Ko ; tout ce qui dépasse régulièrement 1 Mo nécessite une pagination, une sélection de champs (?fields=) ou un flux d'export dédié.
  • Changez les versions cassantes dans le chemin de l'URL (/v1/). Les changements additifs (nouveaux champs optionnels) ne nécessitent pas d'incrément de version. Confiez le calendrier de dépréciation lui-même à api-versioning-strategist.

Contraste travaillé

Mauvais :

POST /getUserOrders?userId=42&page=3
→ 200 { "data": [...], "error": null }

Verbe dans le chemin, sémantique GET sur un POST, pagination par décalage, 200 encapsulant un champ d'erreur obligeant les clients à analyser le corps pour savoir si l'appel a échoué.

Bon :

GET /users/42/orders?status=shipped&limit=25&cursor=eyJpZCI6OTh9
→ 200 { "orders": [...], "next_cursor": "eyJpZCI6MTIzfQ", "has_more": true }
→ 404 { "error": "not_found", "message": "L'utilisateur 42 n'existe pas", "request_id": "req_9f2" }

Chemin nominal, imbrication de possession, pagination par curseur, codes de statut portent le résultat.

Livrable

Produisez un cahier des charges d'endpoint contenant : la table des ressources (chemin, méthodes, codes de statut par méthode), la forme d'erreur partagée, le contrat de pagination (format du curseur, valeurs par défaut, maximum), la liste blanche de filtrage, et les budgets de latence et de charge utile par endpoint.

À NE PAS FAIRE

  • Ne reflétez pas le schéma de base de données dans l'API – les consommateurs se couplent à des internes que vous voudrez modifier.
  • Ne renvoyez pas 200 pour des échecs avec un corps d'erreur ; les clients et la surveillance se basent sur les codes de statut.
  • N'utilisez pas la pagination par décalage sur des collections non bornées – elle duplique et saute des lignes sous des écritures et se dégrade linéairement.
  • N'imbriquez pas les chemins à plus de deux niveaux ; une imbrication profonde code un seul chemin d'accès et interdit tous les autres.
  • N'ignorez pas silencieusement les paramètres de requête inconnus – un filtre mal typé qui renvoie des données non filtrées est un bug de classe fuite de données.

Niveau de qualité

  • Un consommateur pourrait implémenter un client à partir du cahier des charges sans poser une seule question.
  • Chaque endpoint indique ses codes de statut, y compris les cas d'erreur.
  • Tous les endpoints de collection partagent un contrat de pagination ; toutes les erreurs partagent une forme.
  • Des concepts identiques ont des noms identiques à travers tous les chemins et charges utiles.
  • Chaque endpoint a un budget de latence explicite et ceux >1 s sont asynchrones.

Individual skills in this repo

This repo contains 19 individual skills — each has its own dedicated page.

SkillMedev/skills

Produce an accurate, properly timed caption track (SRT or WebVTT) from a video's audio - transcribing or aligning to the voiceover script, timing cues to speech, and enforcing line-length and reading-speed rules so captions are readable and in sync. Use when someone says "generate captions", "make subtitles from the audio", "transcribe and caption this", "export an SRT or VTT", "the captions are out of sync", or "the subtitles flash by too fast to read". Do NOT use to burn-in, style, reframe, or position an existing caption track for a platform (9:16, brand styling, safe areas) - that is social-video-formatter; do NOT use to animate text word-by-word as a motion graphic - that is kinetic-typography; do NOT use to write the spoken script in the first place - that is narration-script.

SkillMedev/skills

Turns data and charts into a decision-driving narrative structured as headline finding, trend, implication, and recommended action - with finding-led chart titles, context for every number, annotation guidance, and honest flags on any conclusion the data cannot support. Use when someone says "turn these numbers into a story", "what's the takeaway from this data", "help me present these results to leadership", or has charts but no narrative. Do NOT use for compressing a long document into a one-pager - use executive-summary instead - or for running the analysis that produces the findings - use eda-playbook instead.

SkillMedev/skills

Use when a task needs live or historical money data - "convert USD to EUR", "current/past exchange rate", "FX rate on this date / over this range", or "current price of Bitcoin/Ethereum, market cap, 24h change". Frankfurter (ECB reference rates, no key) is the FX default; CoinGecko's free keyless tier covers crypto. Do NOT use for stock quotes or equities - no keyless stock API survives verification, say so instead of guessing; do NOT use for country economic indicators like GDP or inflation series - use government-open-data instead; if the request is a vague "I need live data", route through public-data-api-picker.

SkillMedev/skills

Builds a driver-based FP&A operating model linking business inputs to P&L, balance sheet, and cash flow outputs. Use when building an annual plan, preparing investor materials, running scenario analysis, or stress-testing the business.

SkillMedev/skills

Use when a task needs live geographic lookups - "geocode this address", "what's at these coordinates" (reverse geocoding), "lat/lon for this city", "which country/state is this ZIP or postal code in", or "country facts: capital, currency, population, flag". Nominatim (OpenStreetMap) is the geocoding default; Zippopotam for postal codes; APICountries for country facts. All keyless. Do NOT use for weather at a location - use weather-climate instead; do NOT use for country-level statistics over time (GDP, population trends) - use government-open-data instead; if the request is a vague "I need live data", route through public-data-api-picker.

SkillMedev/skills

Runs the full Getting Things Done loop - capture, clarify, organize, reflect, engage - building a trusted system of context lists, a projects list with defined next actions, and a weekly review habit. Use when someone says "I'm overwhelmed and things are slipping through the cracks", "set up GTD for me", "help me do a brain dump and organize it", or "my to-do list is a mess". Do NOT use for just running the weekly review ritual itself - use weekly-review instead - or for clearing an email backlog - use inbox-zero.

SkillMedev/skills

Processes any email backlog to zero using the 4Ds - Delete, Delegate, Defer, Do - with a mass-archive strategy for the obvious, a touch-each-email-once discipline, and a keep-it-clear system of batched processing windows, ruthless unsubscribing, filters, and a minimal folder setup. Use when someone says "I have 5,000 unread emails", "help me get to inbox zero", "email is eating my whole day", or treats their inbox as a to-do list. Do NOT use for drafting the reply emails themselves or prioritization rules for an ongoing support queue - use email-triage instead - or for protecting focus time around the email windows - use deep-work-planner instead.

SkillMedev/skills

Write landing-page copy section by section - hero, social proof, features-as-benefits, objections, CTA - leading with one promise and proving it down the page. Use when someone asks "write my landing page", "improve my hero headline", "what should the homepage say", "turn these features into benefits", or is shipping a new page for a launch or campaign. Do NOT use for testing and optimizing an existing page's conversion rate - use landing-page-cro instead; for the one-line claim itself use positioning-statement; for the full message ladder use messaging-hierarchy.

SkillMedev/skills

Improves an existing landing page's conversion rate through evidence-first CRO - audit heatmaps and recordings, write structured hypotheses, prioritize with ICE scoring, and run one-variable tests to statistical significance. Use when someone asks "why isn't my landing page converting", "audit this page before we scale spend", "which A/B test should we run first", or after a CVR drop or ahead of a paid-traffic push. Do NOT use for writing a new landing page from scratch - use landing-page-copy instead. Do NOT use for auditing the ad accounts sending the traffic - use paid-acquisition-audit instead. Do NOT use for reading the results of a finished experiment - use ab-test-analyzer instead.

SkillMedev/skills

Runs structured coaching sessions using values clarification and the GROW model, ending every session with one committed action, a deadline, and an if-then plan for the likely obstacle. Use when someone says "I feel stuck in my life", "help me figure out what I want", "hold me accountable to my goals", or "coach me through this decision". Do NOT use for building a stress toolkit - use stress-management instead - or a journaling practice - use journal-framework; for a standing goal-tracking system, use goals-accountability. Coaching, not therapy: signs of clinical distress route to a licensed professional.

SkillMedev/skills

Adapts English content for a target language and region - swapping idioms, setting the right formality register, replacing cultural references, converting dates, units, and currency - and delivers the localized text with a notes column explaining each adaptation and flagging what needs a native reviewer. Use when someone asks "localize this copy for the Japanese market", "adapt our marketing copy for the Mexican market", "make this translation sound native instead of literal", or a literal translation reads foreign, stiff, or risky. Do NOT use for auditing in-product UI text quality - use ux-writing-audit instead.

SkillMedev/skills

Turns a natural-language video brief into a complete, ready-to-preview Remotion composition - extracts duration, scenes, brand colors, aspect ratio, and real copy; plans the frame budget; and writes data-driven React/TypeScript using useCurrentFrame, interpolate, spring, AbsoluteFill, and Sequence, registered in Root.tsx. Use when someone says "build a 20-second product demo video", "animate a feature walkthrough", "write the Remotion code for this marketing clip", or wants a scene-by-scene composition they can scrub in Studio. Do NOT use for rendering, iterating, or batching the finished MP4 - use remotion-render instead - or for installing and scaffolding the project - use remotion-setup instead.

SkillMedev/skills

Scaffolds a new Remotion video project wired for Claude Code Agent Skills - Node check, create-video scaffold, skills install, folder conventions, Google Fonts, and a smoke-test render. Use whenever someone wants to start making videos with Remotion and Claude, even just "make product videos with Claude.

SkillMedev/skills

Classifies incident severity (SEV1-4) using impact, scope, and urgency signals and decides who to page. Use when an alert fires or a report comes in and a severity call must be made quickly.

SkillMedev/skills

Use the Skill Me catalog from inside any conversation - discover, install, and manage Claude skills through the Skill Me MCP, and load installed skills automatically each session.

SkillMedev/skills

Write one platform-native caption from a topic and brand voice, with a front-loaded hook, native length, and a single earned CTA. Use when the user gives a topic (and optionally brand voice or a described image/video) and asks for an Instagram, LinkedIn, X/Twitter, or TikTok caption. Do NOT use when the user wants a dedicated standalone LinkedIn post - use linkedin-post-writer instead; or a multi-post X thread - use tweet-thread-builder instead; or to adapt one existing piece of content into versions for several channels - use cross-platform-reformatter instead.

SkillMedev/skills

Reframe and export a finished video for social platforms - 9:16 ↔ 16:9 cropping, burned-in captions, a platform-native first frame, loop design, and per-platform specs (aspect, length, safe areas) for TikTok, Reels, Shorts, X, and LinkedIn. Use when someone says "make this vertical", "crop to 9:16", "format for TikTok/Reels/Shorts", "add captions/subtitles", "why is my video cut off on mobile", "resize for Instagram", or "export for social". Do NOT use when the question is about the storyboard or shot order before any video exists (use video-storyboard); the animation craft of how elements move (use motion-design-principles); animated word-by-word caption styling (use kinetic-typography); palette, contrast, or lighting (use motion-color-and-light); directing the product-demo content and screen choreography (use product-demo-director); or scoring, beat-syncing, or audio (use sound-and-music-sync) - this is the craft layer that decides WHAT to format for the feed, then hands a concrete spec to remotion-compo...

SkillMedev/skills

Writes and tunes PySpark jobs - join strategy and broadcast size limits, shuffle-partition sizing, skew diagnosis and salting, UDF avoidance, caching, and output file layout - with concrete size and skew thresholds. Use when someone asks "why is my Spark job slow", "should I broadcast this join", "one task takes forever while the rest finish", "my job OOMs during a join", or is writing a new PySpark ETL job. Do NOT use for Kafka topic, consumer-group, or streaming-pipeline design - use kafka-pipelines instead; do NOT use for single-machine dataframe work that fits in memory - use pandas-expert instead.

SkillMedev/skills

Builds clean, performant, accessible SwiftUI views with correct state ownership, scoped invalidation, and smooth list scrolling, and reviews existing SwiftUI code against a concrete frame-time and re-render budget. Use when someone asks "why does my SwiftUI list stutter", "should this be @State or @Observable", "my whole screen re-renders when one row changes", "how do I animate this transition", or wants a SwiftUI view built or refactored. Do NOT use for cross-platform React Native apps - use react-native-pro instead; do NOT use for Flutter widget trees - use flutter-widget-architect instead; do NOT use for Android Compose UIs - use jetpack-compose-builder instead.

Skills associés