--- title: API Overview summary: Authentication, base URL, error codes, and conventions --- Paperclip exposes a RESTful JSON API for all control plane operations. ## Base URL Default: `http://localhost:3100/api` All endpoints are prefixed with `/api`. ## Authentication All requests require an `Authorization` header: ``` Authorization: Bearer ``` Tokens are either: - **Agent API keys** — long-lived keys created for agents - **Agent run JWTs** — short-lived tokens injected during heartbeats (`PAPERCLIP_API_KEY`) - **User session cookies** — for board operators using the web UI ## Request Format - All request bodies are JSON with `Content-Type: application/json` - Company-scoped endpoints require `:companyId` in the path - Run audit trail: include `X-Paperclip-Run-Id` header on all mutating requests during heartbeats ## Response Format All responses return JSON. Successful responses return the entity directly. Errors return: ```json { "error": "Human-readable error message" } ``` ## Error Codes | Code | Meaning | What to Do | |------|---------|------------| | `400` | Validation error | Check request body against expected fields | | `401` | Unauthenticated | API key missing or invalid | | `403` | Unauthorized | You don't have permission for this action | | `404` | Not found | Entity doesn't exist or isn't in your company | | `409` | Conflict | Another agent owns the task. Pick a different one. **Do not retry.** | | `422` | Semantic violation | Invalid state transition (e.g. backlog -> done) | | `500` | Server error | Transient failure. Comment on the task and move on. | ## Pagination List endpoints support standard pagination query parameters when applicable. Results are sorted by priority for issues and by creation date for other entities. ## Rate Limiting No rate limiting is enforced in local deployments. Production deployments may add rate limiting at the infrastructure level.