api-platform-versioning

Guidance for adding API versioning to API Platform 4.3, a PHP framework for building APIs, so different client contracts can coexist.

In plain words
What is it for?
Use it to plan URI, header, output-DTO, or group-based versions, and to mark retired operations with deprecation and sunset information.
Why use it?
It helps manage breaking and non-breaking API changes without unexpectedly changing what existing clients receive.

Skill for Claude CodeCodex

Part of the gerard plugin — 25 skills, 25 commands, 7 agents, 1 hook shipped together

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/gerard-labs/superpowers-api-platform/api-platform-versioning
Any agent
npx skills add gerard-labs/superpowers-api-platform --skill api-platform-versioning
Clone the repo
git clone --depth 1 https://github.com/gerard-labs/superpowers-api-platform

Made for: Claude Code, Codex.

Or install gerard, the plugin that ships this one along with the rest of its 25 skills, 25 commands, 7 agents, 1 hook.

Per session 179 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 680 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 0 findings. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00179 $0.00680
Opus 5 $0.00089 $0.00340
Sonnet 5 $0.00036 $0.00136
Haiku 4.5 $0.00018 $0.00068

Measured 2d ago against content hash 1a5f4075e84f, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

api-platform-versioning scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Nothing flagged

None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.

skills/api-platform-versioning/SKILL.md · 47 lines

What it actually says

API Platform 4.3 — Versioning

Use when

  • Adding a new operation or resource that breaks the contract.
  • Carving out a /v2/ set of endpoints next to /v1/.
  • Marking an operation deprecated with a Sunset date.
  • Migrating older code that still uses openapiContext: ['deprecated' => true] (deprecated 4.x) to the modern attribute.

Default workflow

  1. Decide the strategy — URI versioning (breaking), Output DTOs per version (when payload shape diverges), header-based, or group additive (minor additions only).
  2. Implement the chosen strategy with explicit uriTemplate, dedicated DTOs / Provider, or new group.
  3. On retired operations: set deprecationReason, sunset, and openapi: new Model\Operation(deprecated: true).
  4. Add a KernelEvents::RESPONSE subscriber to emit Sunset / Deprecation / Link: …; rel="successor-version" headers.
  5. Document the diff at the top of each new DTO (changelog comment).

Guardrails

  • URI versioning for breaking changes. Clearest signal for clients.
  • Group additive only for additions — never to remove or rename.
  • Always announce a sunset date when retiring an operation.
  • Limit active versions — keep 2-3 at most. Beyond that, the maintenance burden explodes.
  • Test every active version — no silent regression on v1.

Progressive disclosure

  • SKILL.md lists strategies and rules.
  • reference.md carries full examples for each strategy, the openapi 4.x attribute (Rector migration script for openapiContext), Sunset / Deprecation / Link headers, the DTO changelog header, multi-version functional tests, and best practices.

Output contract

  • New resources / DTOs / Providers per version with explicit uriTemplate.
  • Deprecated operations carry deprecationReason, sunset, and openapi: new Model\Operation(deprecated: true).
  • A response subscriber emits Sunset headers.
  • Functional tests cover every active version.

References

  • reference.md
Files

What ships with it

1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 2d ago First seen · 47 lines · 0 tokens per session scan A 1a5f4075e84f

Subscribe to this mod's changes

api-platform-versioning is a skill published in the GitHub repository gerard-labs/superpowers-api-platform (2 stars, last pushed 3mo ago), licensed MIT. It adds 179 tokens to every session and 680 once invoked, about $0.0009 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.

Related

Other skills, from other repositories

server-setup

Initialize tRPC with initTRPC.create(), define routers with t.router(), create procedures with .query()/.mutation()/.subscription(), configure context with createContext(), export AppRouter type, merge routers with t.mergeRouters(), lazy-load routers with lazy().

trpc/trpc · 56 tokens

client-setup

Create a vanilla tRPC client with createTRPCClient (), configure link chain with httpBatchLink/httpLink, dynamic headers for auth, transformer on links (not client constructor). Infer types with inferRouterInputs and inferRouterOutputs. AbortController signal support. TRPCClientError typing.

trpc/trpc · 63 tokens

non-json-content-types

Handle FormData, file uploads, Blob, Uint8Array, and ReadableStream inputs in tRPC mutations. Use octetInputParser from @trpc/server/http for binary data. Route non-JSON requests with splitLink and isNonJsonSerializable() from @trpc/client. FormData and binary inputs only work with mutations (POST).

trpc/trpc · 75 tokens

caching

Set HTTP cache headers on tRPC query responses via responseMeta callback for CDN and browser caching. Configure Cache-Control, s-maxage, stale-while-revalidate. Handle caching with batching and authenticated requests. Avoid caching mutations, errors, and authenticated responses.

trpc/trpc · 54 tokens

portaljs-connect-ckan

Wire a scaffolded PortalJS portal to a CKAN backend over its API. Generates a tiny server-side fetch client (no runtime dependency) and feeds the /search catalog and /@namespace/slug showcases from CKAN instead of datasets.json. Use when connecting an existing portal to a live CKAN instance instead of a static…

datopian/portaljs · 74 tokens

horse-grpc

Guidelines and workflows for developing and maintaining gRPC services, HTTP/2 h2c transport, and Protobuf serialization within the Horse framework.

HashLoad/horse · 33 tokens