design-api — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited design-api (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Degree of freedom: MIXED. Resource model, error shape, and REST vs GraphQL [HIGH freedom]; pre-design docs/schema/grep [LOW freedom — run exactly].
Design clean, consistent, and developer-friendly APIs.
Survey:ordershasuser_id; noGET /users/:id/orders; clients useuseQuery. Model: order is a nested user resource, not a/getUserOrdersRPC. Contract:GET /users/:id/orders→{ data, meta }; shared{ error: { code, message, details } }. Check: plural kebab-case; list paginated; 401/404/422 only from the status table.
{ error: { code, message, details } }GET /resourcesdebug-fe-be-integration; product scope still fuzzy → design-prdBefore designing any API:
/api-docs, /docs, /swagger, /openapi.json)naming under docs/ and src/api/)Use Supabase MCP to understand existing data structure:
SELECT column_name, data_type, is_nullable
FROM information_schema.columns WHERE table_name = 'your_table';Also check enum values (enum_range) and foreign keys (information_schema.table_constraints): references/examples.md §Pre-design schema probes.
Use Grep to search for similar endpoints already implemented:
Grep: "router.get|router.post" to find existing route patterns
Grep: "useQuery|useMutation" to find existing frontend integrationsBefore designing, state:
"Pre-design check:
- Existing API docs reviewed: [YES/NO]
- Database schema verified: [tables/enums checked]
- Similar endpoints found: [list or none]
- Naming conventions confirmed: [YES/NO]"GET /resources # List
GET /resources/:id # Get one
POST /resources # Create
PUT /resources/:id # Replace
PATCH /resources/:id # Update
DELETE /resources/:id # Delete| Do | Don't |
|---|---|
/users | /getUsers, /user-list |
/users/:id | /user/:id, /users/get/:id |
/users/:id/orders | /getUserOrders |
| Plural nouns | Verbs, singular |
| kebab-case | camelCase, snake_case |
GET /users # List users
GET /users/123 # Get user 123
GET /users/123/orders # User's orders
GET /users/123/orders/456 # Specific order
POST /users/123/orders # Create order for user{ "data": { ... } } for one resource; { "data": [...], "meta": { total, page, perPage, totalPages } } for lists.{ "error": { "code", "message", "details" } }; code is machine-readable, details is a per-field list.{
"error": {
"code": "VALIDATION_ERROR",
"message": "Invalid input data",
"details": [
{ "field": "email", "message": "Invalid email format" }
]
}
}Request, single, and list bodies in full: references/examples.md §Request body through §List response.
| Code | When to Use |
|---|---|
200 OK | GET, PUT, PATCH success |
201 Created | POST created new resource |
204 No Content | DELETE success, no body |
| Code | When to Use |
|---|---|
400 Bad Request | Invalid request body |
401 Unauthorized | Not authenticated |
403 Forbidden | Authenticated but not allowed |
404 Not Found | Resource doesn't exist |
409 Conflict | Resource conflict (duplicate) |
422 Unprocessable | Validation failed |
429 Too Many | Rate limited |
| Code | When to Use |
|---|---|
500 Internal Error | Unexpected server error |
502 Bad Gateway | Upstream service failed |
503 Unavailable | Service temporarily down |
?role=admin&status=active, date bounds as ?createdAfter=2024-01-01.?sort=name; - prefix for descending; comma-separated for multiple (?sort=role,-name).?page=2&perPage=20 by default; ?cursor=abc123 for large or live lists; never an unbounded list.?fields=id,name,email; relations via ?include=orders,profile.Example URLs for each: references/examples.md §Query parameters.
Default: URL path (GET /v1/users, GET /v2/users). Header versioning (Accept: application/vnd.api+json;version=2) is the alternative: references/examples.md §Versioning.
Default: Authorization: Bearer <token>. API key via X-API-Key header (or ?apiKey=) is the alternative for server-to-server callers: references/examples.md §Authentication.
POST /users/bulk with { create: [...], update: [...], delete: [ids] }.POST /users/search with { query, filters, sort } when the criteria outgrow query strings.POST /orders/123/cancel, POST /users/123/verify-email, POST /payments/123/refund.Bodies for bulk and search: references/examples.md §Bulk operations, §Search.
Per endpoint: title, one-line purpose, **Endpoint:**, **Authentication:**, request-body table (field, type, required, description), response status with a JSON example, and the error list. Full template: references/examples.md §Documentation template.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.