Generate API Collection
Core principle: Every API surface (Rails app or engine) has a single API collection file that stays in sync with its endpoints.
Rules at a Glance
| Aspect |
Rule |
| When |
Create or update collection when creating or modifying any REST API endpoint (route + controller action) |
| Format |
Postman Collection JSON v2.1 (schema or info.schema references v2.1) |
| Location |
One file per app or engine — docs/api-collections/<app-or-engine-name>.json or spec/fixtures/api-collections/; if a collection folder already exists, update the existing file |
| Language |
All request names, descriptions, and variable names must be in English |
| Variables |
Use {{base_url}} for the base URL so the collection works across environments |
| Per request |
method, URL, headers, body, description, and test scripts (e.g. pm.response.to.have.status(200)) |
| Folders |
Group related endpoints into folders using nested item arrays |
| Exception |
GraphQL endpoints — use implement-graphql instead |
HARD-GATE
When you create or modify a REST API endpoint (new or changed route and controller action),
you MUST also create or update the corresponding API collection file so the
flow can be tested. Do not leave the collection missing or outdated.
Each request MUST include a description and at least one basic test script (e.g. status code check).
EXCEPTION: GraphQL endpoints — use implement-graphql instead.
Core Process
- Create or open the corresponding API collection JSON file.
- Group related endpoints into folders using nested
item arrays.
- Use
{{base_url}} for the base URL.
- Add method, URL, headers, body, description, and test scripts for each request.
- Validate the JSON is syntactically correct:
- Run
python -m json.tool collection.json or jq . collection.json — both print errors on invalid JSON.
- If invalid: fix the reported error, then re-run the command until it exits cleanly.
- Verify the collection can be imported into a compatible API client (e.g. Postman) without errors.
- Confirm all new or changed endpoints are represented and that
{{base_url}} is used consistently.
Collection Structure (Postman v2.1)
Ensure the collection includes the info block, folders (nested item arrays), and event scripts:
{
"info": {
"name": "Products API",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "Products",
"item": [
{
"name": "List products",
"request": {
"method": "GET",
"header": [],
"url": "{{base_url}}/api/v1/products",
"description": "Returns a list of all products in the catalog."
},
"event": [
{
"listen": "test",
"script": {
"exec": ["pm.test('Status code is 200', () => { pm.response.to.have.status(200); });"],
"type": "text/javascript"
}
}
]
}
]
}
],
"variable": [
{ "key": "base_url", "value": "http://localhost:3000" }
]
}
Common Mistakes
| Mistake |
Reality |
| Missing Content-Type or body for POST/PUT |
Include headers and example body so the request works out of the box |
| Skipping validation after generation |
Run jq . or python -m json.tool and fix any errors before committing (see HARD-GATE) |
Extended Resources
Load only when a concrete collection example is needed:
- EXAMPLES.md — Postman v2.1 multi-endpoint collection example.
Integration
| Skill |
When to chain |
| create-engine |
When the engine exposes HTTP endpoints |
| version-api |
When a new version requires a collection update |
1---2name: generate-api-collection3description: Use when creating or updating a REST API collection for Rails endpoints. Do not use for GraphQL. Trigger words: Postman, API collection, endpoint, API route, request collection.4license: MIT5---67# Generate API Collection89**Core principle:** Every API surface (Rails app or engine) has a single API collection file that stays in sync with its endpoints.1011## Rules at a Glance1213| Aspect | Rule |14|--------|------|15| When | Create or update collection when creating or modifying any REST API endpoint (route + controller action) |16| Format | Postman Collection JSON v2.1 (`schema` or `info.schema` references v2.1) |17| Location | One file per app or engine — `docs/api-collections/<app-or-engine-name>.json` or `spec/fixtures/api-collections/`; if a collection folder already exists, update the existing file |18| Language | All request names, descriptions, and variable names must be in **English** |19| Variables | Use `{{base_url}}` for the base URL so the collection works across environments |20| Per request | method, URL, headers, body, **description**, and **test scripts** (e.g. `pm.response.to.have.status(200)`) |21| Folders | Group related endpoints into folders using nested `item` arrays |22| Exception | GraphQL endpoints — use **implement-graphql** instead |2324## HARD-GATE2526```text27When you create or modify a REST API endpoint (new or changed route and controller action),28you MUST also create or update the corresponding API collection file so the29flow can be tested. Do not leave the collection missing or outdated.3031Each request MUST include a description and at least one basic test script (e.g. status code check).3233EXCEPTION: GraphQL endpoints — use implement-graphql instead.34```3536## Core Process37381. Create or open the corresponding API collection JSON file.392. Group related endpoints into folders using nested `item` arrays.403. Use `{{base_url}}` for the base URL.414. Add method, URL, headers, body, description, and test scripts for each request.425. Validate the JSON is syntactically correct:43 - Run `python -m json.tool collection.json` or `jq . collection.json` — both print errors on invalid JSON.44 - If invalid: fix the reported error, then re-run the command until it exits cleanly.456. Verify the collection can be imported into a compatible API client (e.g. Postman) without errors.467. Confirm all new or changed endpoints are represented and that `{{base_url}}` is used consistently.4748## Collection Structure (Postman v2.1)4950Ensure the collection includes the `info` block, folders (nested `item` arrays), and `event` scripts:5152```json53{54 "info": {55 "name": "Products API",56 "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"57 },58 "item": [59 {60 "name": "Products",61 "item": [62 {63 "name": "List products",64 "request": {65 "method": "GET",66 "header": [],67 "url": "{{base_url}}/api/v1/products",68 "description": "Returns a list of all products in the catalog."69 },70 "event": [71 {72 "listen": "test",73 "script": {74 "exec": ["pm.test('Status code is 200', () => { pm.response.to.have.status(200); });"],75 "type": "text/javascript"76 }77 }78 ]79 }80 ]81 }82 ],83 "variable": [84 { "key": "base_url", "value": "http://localhost:3000" }85 ]86}87```8889## Common Mistakes9091| Mistake | Reality |92|---------|----------|93| Missing Content-Type or body for POST/PUT | Include headers and example body so the request works out of the box |94| Skipping validation after generation | Run `jq .` or `python -m json.tool` and fix any errors before committing (see HARD-GATE) |9596## Extended Resources9798Load only when a concrete collection example is needed:99100- [EXAMPLES.md](./EXAMPLES.md) — Postman v2.1 multi-endpoint collection example.101102## Integration103104| Skill | When to chain |105|-------|---------------|106| **create-engine** | When the engine exposes HTTP endpoints |107| **version-api** | When a new version requires a collection update |