{"info":{"_postman_id":"35666e2f-7d3b-4e06-8871-8eed9cf121ae","name":"Chirpy","description":"<html><head></head><body><h1 id=\"chirpy-api-documentation\">Chirpy API Documentation</h1>\n<h2 id=\"overview\">Overview</h2>\n<p>Chirpy is a social media API that allows users to create and manage short messages called \"chirps\". The API provides endpoints for user management, chirp operations, health monitoring, and administrative functions.</p>\n<h2 id=\"base-url\">Base URL</h2>\n<p>All API endpoints use the following base URL pattern:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>\n\n</code></pre><p>Set the <code>baseURL</code> variable in your Postman environment to point to your Chirpy server instance.</p>\n<h2 id=\"authentication\">Authentication</h2>\n<p>Authentication requirements vary by endpoint:</p>\n<ul>\n<li><p><strong>Public endpoints</strong>: No authentication required (health check, app root)</p>\n</li>\n<li><p><strong>User endpoints</strong>: Require user authentication token</p>\n</li>\n<li><p><strong>Admin endpoints</strong>: Require administrative privileges</p>\n</li>\n</ul>\n<p>Include authentication tokens in the <code>Authorization</code> header:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer &lt;your_token&gt;\n\n</code></pre><h2 id=\"api-endpoints\">API Endpoints</h2>\n<h3 id=\"app\">App</h3>\n<h4 id=\"get-app\">GET /app</h4>\n<p><strong>Root endpoint</strong> - Returns the application root page or status.</p>\n<p><strong>Endpoint</strong>: <code>/app</code></p>\n<p><strong>Method</strong>: <code>GET</code></p>\n<p><strong>Authentication</strong>: None required</p>\n<hr>\n<h3 id=\"users\">Users</h3>\n<p>User management endpoints for registration and authentication.</p>\n<h4 id=\"post-apiusers\">POST /api/users</h4>\n<p><strong>Create User</strong> - Register a new user account.</p>\n<p><strong>Endpoint</strong>: <code>/api/users</code></p>\n<p><strong>Method</strong>: <code>POST</code></p>\n<p><strong>Authentication</strong>: None required</p>\n<p><strong>Request Body</strong>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"user@example.com\",\n  \"password\": \"securepassword\"\n}\n\n</code></pre>\n<p><strong>Response</strong>: Returns the created user object with user ID and details.</p>\n<hr>\n<h4 id=\"post-apilogin\">POST /api/login</h4>\n<p><strong>Login User</strong> - Authenticate a user and receive an access token.</p>\n<p><strong>Endpoint</strong>: <code>/api/login</code></p>\n<p><strong>Method</strong>: <code>POST</code></p>\n<p><strong>Authentication</strong>: None required</p>\n<p><strong>Request Body</strong>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"user@example.com\",\n  \"password\": \"securepassword\"\n}\n\n</code></pre>\n<p><strong>Response</strong>: Returns authentication token and user information.</p>\n<hr>\n<h3 id=\"chirps\">Chirps</h3>\n<p>Endpoints for creating and retrieving chirps (short messages).</p>\n<h4 id=\"post-apichirps\">POST /api/chirps</h4>\n<p><strong>Create Chirp</strong> - Post a new chirp message.</p>\n<p><strong>Endpoint</strong>: <code>/api/chirps</code></p>\n<p><strong>Method</strong>: <code>POST</code></p>\n<p><strong>Authentication</strong>: Required (Bearer token)</p>\n<p><strong>Request Body</strong>:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"body\": \"This is my chirp message\"\n}\n\n</code></pre>\n<p><strong>Response</strong>: Returns the created chirp with ID, timestamp, and content.</p>\n<hr>\n<h4 id=\"get-apichirps\">GET /api/chirps</h4>\n<p><strong>Get All Chirps</strong> - Retrieve all chirps from all users.</p>\n<p><strong>Endpoint</strong>: <code>/api/chirps</code></p>\n<p><strong>Method</strong>: <code>GET</code></p>\n<p><strong>Authentication</strong>: None required</p>\n<p><strong>Query Parameters</strong>:</p>\n<ul>\n<li><code>sort</code> (optional): Sort order for chirps (e.g., <code>asc</code>, <code>desc</code>)</li>\n</ul>\n<p><strong>Response</strong>: Returns an array of chirp objects.</p>\n<hr>\n<h4 id=\"get-apichirpschirpid\">GET /api/chirps/:chirpID</h4>\n<p><strong>Get Chirp by ID</strong> - Retrieve a specific chirp by its ID.</p>\n<p><strong>Endpoint</strong>: <code>/api/chirps/:chirpID</code></p>\n<p><strong>Method</strong>: <code>GET</code></p>\n<p><strong>Authentication</strong>: None required</p>\n<p><strong>Path Parameters</strong>:</p>\n<ul>\n<li><code>chirpID</code> (required): The unique identifier of the chirp</li>\n</ul>\n<p><strong>Response</strong>: Returns the requested chirp object.</p>\n<hr>\n<h4 id=\"get-apiusersuseridchirps\">GET /api/users/:userID/chirps</h4>\n<p><strong>Get Chirps by User ID</strong> - Retrieve all chirps from a specific user.</p>\n<p><strong>Endpoint</strong>: <code>/api/users/{{userID}}/chirps</code></p>\n<p><strong>Method</strong>: <code>GET</code></p>\n<p><strong>Authentication</strong>: None required</p>\n<p><strong>Path Parameters</strong>:</p>\n<ul>\n<li><code>userID</code> (required): The unique identifier of the user</li>\n</ul>\n<p><strong>Response</strong>: Returns an array of chirps created by the specified user.</p>\n<hr>\n<h4 id=\"get-apimechirps\">GET /api/me/chirps</h4>\n<p><strong>Get My Chirps</strong> - Retrieve all chirps from the authenticated user.</p>\n<p><strong>Endpoint</strong>: <code>/api/me/chirps</code></p>\n<p><strong>Method</strong>: <code>GET</code></p>\n<p><strong>Authentication</strong>: Required (Bearer token)</p>\n<p><strong>Response</strong>: Returns an array of chirps created by the authenticated user.</p>\n<hr>\n<h3 id=\"health\">Health</h3>\n<h4 id=\"get-apihealthz\">GET /api/healthz</h4>\n<p><strong>Health Check</strong> - Check the health status of the API.</p>\n<p><strong>Endpoint</strong>: <code>/api/healthz</code></p>\n<p><strong>Method</strong>: <code>GET</code></p>\n<p><strong>Authentication</strong>: None required</p>\n<p><strong>Response</strong>: Returns the health status of the service (typically <code>200 OK</code>).</p>\n<hr>\n<h3 id=\"admin\">Admin</h3>\n<p>Administrative endpoints for monitoring and maintenance.</p>\n<h4 id=\"get-adminmetrics\">GET /admin/metrics</h4>\n<p><strong>Metrics</strong> - Retrieve application metrics and statistics.</p>\n<p><strong>Endpoint</strong>: <code>/admin/metrics</code></p>\n<p><strong>Method</strong>: <code>GET</code></p>\n<p><strong>Authentication</strong>: Required (Admin privileges)</p>\n<p><strong>Response</strong>: Returns metrics data including request counts, performance statistics, and system health.</p>\n<hr>\n<h4 id=\"post-adminreset\">POST /admin/reset</h4>\n<p><strong>Reset</strong> - Reset the application state (typically used in development/testing).</p>\n<p><strong>Endpoint</strong>: <code>/admin/reset</code></p>\n<p><strong>Method</strong>: <code>POST</code></p>\n<p><strong>Authentication</strong>: Required (Admin privileges)</p>\n<p><strong>Response</strong>: Confirms the reset operation.</p>\n<hr>\n<h2 id=\"error-handling\">Error Handling</h2>\n<p>The API uses standard HTTP status codes:</p>\n<ul>\n<li><p><strong>200 OK</strong>: Request succeeded</p>\n</li>\n<li><p><strong>201 Created</strong>: Resource created successfully</p>\n</li>\n<li><p><strong>400 Bad Request</strong>: Invalid request parameters or body</p>\n</li>\n<li><p><strong>401 Unauthorized</strong>: Authentication required or failed</p>\n</li>\n<li><p><strong>403 Forbidden</strong>: Insufficient permissions</p>\n</li>\n<li><p><strong>404 Not Found</strong>: Resource not found</p>\n</li>\n<li><p><strong>500 Internal Server Error</strong>: Server error</p>\n</li>\n</ul>\n<p>Error responses include a JSON body with details:</p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"error\": \"Error message describing what went wrong\"\n}\n\n</code></pre>\n<h2 id=\"rate-limiting\">Rate Limiting</h2>\n<p>Rate limiting policies may apply to prevent abuse. Check response headers for rate limit information:</p>\n<ul>\n<li><p><code>X-RateLimit-Limit</code>: Maximum requests allowed</p>\n</li>\n<li><p><code>X-RateLimit-Remaining</code>: Remaining requests in current window</p>\n</li>\n<li><p><code>X-RateLimit-Reset</code>: Time when the rate limit resets</p>\n</li>\n</ul>\n<h2 id=\"getting-started\">Getting Started</h2>\n<ol>\n<li><p><strong>Set up your environment</strong>: Create a Postman environment and set the <code>baseURL</code> variable to your Chirpy server URL</p>\n</li>\n<li><p><strong>Create a user</strong>: Use the <code>POST /api/users</code> endpoint to register</p>\n</li>\n<li><p><strong>Login</strong>: Use the <code>POST /api/login</code> endpoint to get your authentication token</p>\n</li>\n<li><p><strong>Save your token</strong>: Store the token in an environment variable for authenticated requests</p>\n</li>\n<li><p><strong>Start chirping</strong>: Use the authenticated endpoints to create and manage chirps</p>\n</li>\n</ol>\n<h2 id=\"support\">Support</h2>\n<p>For issues, questions, or feature requests, please contact the development team or refer to the project repository.</p>\n</body></html>","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","toc":[{"content":"Chirpy API Documentation","slug":"chirpy-api-documentation"}],"owner":"46941071","collectionId":"35666e2f-7d3b-4e06-8871-8eed9cf121ae","publishedId":"2sBXc8qizy","public":true,"customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"publishDate":"2026-02-08T19:15:13.000Z"},"item":[{"name":"api","item":[{"name":"Users","item":[{"name":"CreateUser","id":"63656af6-2a10-46e4-87f4-7adb13265026","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"password\": \"pass5\",\r\n  \"email\": \"lane05@example.com\"\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/users","description":"<h3 id=\"register-user\">Register User</h3>\n<p><strong>POST</strong> <code>/api/users</code></p>\n<p>Create a new user account.</p>\n<p><strong>Request Body:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"user@example.com\",\n  \"password\": \"securepassword\"\n}\n\n</code></pre>\n<p><strong>Response:</strong> <code>201 Created</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\",\n  \"email\": \"user@example.com\",\n  \"is_chirpy_red\": false\n}\n\n</code></pre>\n","urlObject":{"path":["api","users"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"63656af6-2a10-46e4-87f4-7adb13265026"},{"name":"LoginUser","id":"f7fc0f7d-30d7-45a0-8048-475a2fa99e9d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n  \"password\": \"pass1\",\r\n  \"email\": \"lane02@example.com\"\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/login","description":"<h3 id=\"login\">Login</h3>\n<p><strong>POST</strong> <code>/api/login</code></p>\n<p>Authenticate and receive access + refresh tokens.</p>\n<p><strong>Request Body:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"user@example.com\",\n  \"password\": \"securepassword\"\n}\n\n</code></pre>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\",\n  \"email\": \"user@example.com\",\n  \"is_chirpy_red\": false,\n  \"token\": \"jwt_access_token\",\n  \"refresh_token\": \"refresh_token_string\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","login"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"f7fc0f7d-30d7-45a0-8048-475a2fa99e9d"},{"name":"UpdateUserCred","id":"82b7d568-0b25-4c51-93be-4bb3b9afe178","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PUT","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI3NTk2Yzg2NC1hZjZiLTRlZmYtOGZiNi01MzJmYmFmM2NkMDkiLCJleHAiOjE3NzExNzQzNzEsImlhdCI6MTc3MTE3MDc3MX0.fxR4U-D5lhtKmTcG5ayhBxj4gfo2k_cB8dx1SKetd8E","type":"text"}],"body":{"mode":"raw","raw":"{\r\n  \"password\": \"pass5\",\r\n  \"email\": \"lane_05@example.com\"\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/users","description":"<h3 id=\"update-user\">Update User</h3>\n<p><strong>PUT</strong> <code>/api/users</code></p>\n<p>Update user email and/or password.</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Request Body:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"email\": \"newemail@example.com\",\n  \"password\": \"newpassword\"\n}\n\n</code></pre>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\",\n  \"email\": \"newemail@example.com\",\n  \"is_chirpy_red\": false\n}\n\n</code></pre>\n","urlObject":{"path":["api","users"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"82b7d568-0b25-4c51-93be-4bb3b9afe178"},{"name":"DeleteUser","id":"99615d71-eedf-490d-99c2-3880fa0a39f8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI3NTk2Yzg2NC1hZjZiLTRlZmYtOGZiNi01MzJmYmFmM2NkMDkiLCJleHAiOjE3NzExNzg1OTIsImlhdCI6MTc3MTE3NDk5Mn0.LLe6QVCkEXNQSXVyTz5UP7mZicq6bKgJV9wt9G91khg","type":"text"}],"url":"/api/users/:userID","description":"<h3 id=\"delete-user\">Delete User</h3>\n<p><strong>POST</strong> <code>/api/users/{userID}</code></p>\n<p>To delete a user.</p>\n<p><strong>Auth Required</strong>: Yes</p>\n<p><strong>Path Parameters:</strong></p>\n<ul>\n<li><code>userID</code> - User UUID to delete</li>\n</ul>\n<p><strong>Response:</strong> <code>204 No Content</code></p>\n","urlObject":{"path":["api","users",":userID"],"host":[""],"query":[],"variable":[{"type":"any","value":"7596c864-af6b-4eff-8fb6-532fbaf3cd09","key":"userID"}]}},"response":[],"_postman_id":"99615d71-eedf-490d-99c2-3880fa0a39f8"},{"name":"GetMyProfile","id":"6bb0a8e0-b47d-4ea7-ac1c-9a0b38433fea","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer ","type":"text"}],"url":"/api/users","description":"<h3 id=\"get-user-profile\">Get user profile</h3>\n<p><strong>GET</strong> <code>/api/users</code></p>\n<p>Get user profile.<br /><strong>Auth Required</strong>: Yes</p>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\",\n  \"email\": \"user@example.com\",\n  \"is_chirpy_red\": false\n}\n\n</code></pre>\n","urlObject":{"path":["api","users"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"6bb0a8e0-b47d-4ea7-ac1c-9a0b38433fea"},{"name":"GetUserByID","id":"8f834ba7-ba7b-4643-8645-40a9ee925058","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"urlObject":{"query":[],"variable":[]},"url":""},"response":[],"_postman_id":"8f834ba7-ba7b-4643-8645-40a9ee925058"}],"id":"944abf81-bb43-4998-a69e-8afb9c2f43be","_postman_id":"944abf81-bb43-4998-a69e-8afb9c2f43be","description":""},{"name":"Chirps","item":[{"name":"CreateChirp","id":"4e41f059-cddb-43b3-b9a2-dc49440bbeac","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI5YjBkYTQ5NC1kMjIzLTRiODktYWMxZi01ZGE2NjYxOWNmNmYiLCJleHAiOjE3NzA5MjQ2MTAsImlhdCI6MTc3MDkyMTAxMH0.7L2PAVKH2DDIEXsYiu-qeb455Ek1iQZcFFgJfmcmtnk","type":"text"}],"body":{"mode":"raw","raw":"{\r\n  \"body\": \"@b9af1149-ef14-44e4-a142-ac6f4e282761 fornax'ed them kids bro\"\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/chirps","description":"<h3 id=\"create-chirp\">Create Chirp</h3>\n<p><strong>POST</strong> <code>/api/chirps</code></p>\n<p>Post a new chirp (max 140 characters).</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Request Body:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"body\": \"This is my chirp!\"\n}\n</code></pre>\n<p><strong>Response:</strong> <code>201 Created</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\",\n  \"body\": \"This is my chirp!\",\n  \"user_id\": \"uuid\"\n}\n</code></pre>\n","urlObject":{"path":["api","chirps"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"4e41f059-cddb-43b3-b9a2-dc49440bbeac"},{"name":"GetAllChirps","id":"c11fe0d1-9398-4178-9c79-181efa03e360","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"/api/chirps","description":"<h3 id=\"get-all-chirps\">Get All Chirps</h3>\n<p><strong>GET</strong> <code>/api/chirps</code></p>\n<p>Retrieve all chirps (public).</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Query Parameters:</strong></p>\n<ul>\n<li><p><code>sort</code> - <code>asc</code> or <code>desc</code> (optional)</p>\n</li>\n<li><p><code>author_id</code> - Filter by user UUID (optional)</p>\n</li>\n</ul>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid\",\n    \"created_at\": \"timestamp\",\n    \"updated_at\": \"timestamp\",\n    \"body\": \"chirp text\",\n    \"user_id\": \"uuid\"\n  }\n]\n\n</code></pre>\n","urlObject":{"path":["api","chirps"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"c11fe0d1-9398-4178-9c79-181efa03e360"},{"name":"GetChirpsByChirpID","id":"0147430d-4bcc-46a6-9248-e1eddebc5cde","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"/api/chirps/:chirpID","description":"<h3 id=\"getchirpsbychirpid\"><strong>GetChirpsByChirpID</strong></h3>\n<p>Endpoint to retrieve a specific chirp by ID</p>\n<hr />\n<h3 id=\"specs\">Specs:</h3>\n<h4 id=\"1-authentication-required\">1. Authentication Required</h4>\n<p>Bearer token authentication required in the Authorization header.</p>\n<h4 id=\"2-path-parameter\">2. Path Parameter</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>:chirpID - The unique identifier of the chirp\n\n</code></pre><h4 id=\"3-response-format\">3. Response Format</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\",\n  \"body\": \"chirp text\",\n  \"user_id\": \"uuid\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","chirps",":chirpID"],"host":[""],"query":[],"variable":[{"type":"any","value":"0ba39bea-5d4d-4c48-b958-2c518a4b9259","key":"chirpID"}]}},"response":[],"_postman_id":"0147430d-4bcc-46a6-9248-e1eddebc5cde"},{"name":"GetChirpsByUserID","id":"7878f3a8-b652-4fb4-8b5c-2e7b1d0bec76","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"/api/users/:userID/chirps","description":"<h3 id=\"getchirpsbyuserid\"><strong>GetChirpsByUserID</strong></h3>\n<p>Endpoint to retrieve all chirps by a specific user</p>\n<hr />\n<h3 id=\"specs\">Specs:</h3>\n<h4 id=\"1-authentication-required\">1. Authentication Required</h4>\n<p>Bearer token authentication required in the Authorization header.</p>\n<h4 id=\"2-path-parameter\">2. Path Parameter</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>:userID - The unique identifier of the user\n\n</code></pre><h4 id=\"3-response-format\">3. Response Format</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid\",\n    \"created_at\": \"timestamp\",\n    \"updated_at\": \"timestamp\",\n    \"body\": \"chirp text\",\n    \"user_id\": \"uuid\"\n  }\n]\n\n</code></pre>\n","urlObject":{"path":["api","users",":userID","chirps"],"host":[""],"query":[],"variable":[{"type":"any","value":"","key":"userID"}]}},"response":[],"_postman_id":"7878f3a8-b652-4fb4-8b5c-2e7b1d0bec76"},{"name":"GetMyChirps","id":"99d7bd10-52ca-4df0-8d45-5b6fc81ab4f1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzA1NzY4ODYsImlhdCI6MTc3MDU3MzI4Nn0.OoP7N0x6dOvqow_L6Jx6qifE-8jHCYY_VW9UBCrgYJ4","type":"text"}],"body":{"mode":"raw","raw":"{\r\n  \"password\": \"pass1\",\r\n  \"email\": \"lane02@example.com\"\r\n}"},"url":"/api/me/chirps","description":"<h3 id=\"getmychirps\"><strong>GetMyChirps</strong></h3>\n<p>Endpoint to retrieve authenticated user's chirps</p>\n<hr />\n<h3 id=\"specs\">Specs:</h3>\n<h4 id=\"1-authentication-required\">1. Authentication Required</h4>\n<p>Bearer token authentication required in the Authorization header.</p>\n<h4 id=\"2-no-additional-parameters-required\">2. No Additional Parameters Required</h4>\n<p>This endpoint uses the authenticated user's token to retrieve their chirps.</p>\n<h4 id=\"3-response-format\">3. Response Format</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid\",\n    \"created_at\": \"timestamp\",\n    \"updated_at\": \"timestamp\",\n    \"body\": \"chirp text\",\n    \"user_id\": \"uuid\"\n  }\n]\n\n</code></pre>\n","urlObject":{"path":["api","me","chirps"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"99d7bd10-52ca-4df0-8d45-5b6fc81ab4f1"},{"name":"UpdateChirp","id":"a14a1858-b6bf-4acb-bb4b-7fd8fca73cc4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"PATCH","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzA2NTQ2MDYsImlhdCI6MTc3MDY1MTAwNn0.PeGk71gUtFE8AiYUGzio6htK1Rmbw0AyklW_zimgbDg","type":"text"}],"body":{"mode":"raw","raw":"{\r\n    \"body\": \"I'll try to love you <3\"\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/chirps/:chirpID","description":"<h3 id=\"updatechirp\"><strong>UpdateChirp</strong></h3>\n<p>Endpoint to update an existing chirp</p>\n<hr />\n<h3 id=\"specs\">Specs:</h3>\n<h4 id=\"1-authentication-required\">1. Authentication Required</h4>\n<p>Bearer token authentication required. <strong>Chirpy Red membership required</strong> to update chirps.</p>\n<h4 id=\"2-path-parameter-and-request-body\">2. Path Parameter and Request Body</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-bash\">Path: :chirpID - The unique identifier of the chirp to update\n</code></pre>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"body\": \"updated text\"\n}\n</code></pre>\n<h4 id=\"3-response-format\">3. Response Format</h4>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"id\": \"uuid\",\n  \"created_at\": \"timestamp\",\n  \"updated_at\": \"timestamp\",\n  \"body\": \"updated text\",\n  \"user_id\": \"uuid\"\n}\n</code></pre>\n","urlObject":{"path":["api","chirps",":chirpID"],"host":[""],"query":[],"variable":[{"type":"any","value":"0ba39bea-5d4d-4c48-b958-2c518a4b9259","key":"chirpID"}]}},"response":[],"_postman_id":"a14a1858-b6bf-4acb-bb4b-7fd8fca73cc4"},{"name":"DeleteChirp","id":"4e30b76e-ebfd-4054-a20f-498cd8f404dd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzA2NTQ2MDYsImlhdCI6MTc3MDY1MTAwNn0.PeGk71gUtFE8AiYUGzio6htK1Rmbw0AyklW_zimgbDg","type":"text"}],"url":"/api/chirps/:chirpID","description":"<h3 id=\"delete-chirp\">Delete Chirp</h3>\n<p><strong>DELETE</strong> <code>/api/chirps/{chirpID}</code></p>\n<p>Delete your own chirp.</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Path Parameters:</strong></p>\n<ul>\n<li><code>chirpID</code> - Chirp UUID</li>\n</ul>\n<p>**Response:<br />**<code>204 No Content</code></p>\n<p><code>403 Forbidden</code></p>\n","urlObject":{"path":["api","chirps",":chirpID"],"host":[""],"query":[],"variable":[{"type":"any","value":"0ba39bea-5d4d-4c48-b958-2c518a4b9259","key":"chirpID"}]}},"response":[],"_postman_id":"4e30b76e-ebfd-4054-a20f-498cd8f404dd"}],"id":"b45c9479-c044-4e38-981e-77348ac4d37c","description":"<p>Endpoints for Chirps</p>\n","_postman_id":"b45c9479-c044-4e38-981e-77348ac4d37c"},{"name":"Health","item":[{"name":"healthz","id":"77e7af1c-959b-460e-ab8e-60813917cd8b","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"url":"/api/healthz","description":"<h2 id=\"health\">Health</h2>\n<h3 id=\"health-check\">Health Check</h3>\n<p><strong>GET</strong> <code>/api/healthz</code></p>\n<p>Service health endpoint.</p>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"status\": \"ok\"\n}\n</code></pre>\n","urlObject":{"path":["api","healthz"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"77e7af1c-959b-460e-ab8e-60813917cd8b"}],"id":"262d6903-aa19-4f29-b4e4-6956fd162f4c","_postman_id":"262d6903-aa19-4f29-b4e4-6956fd162f4c","description":""},{"name":"Friends","item":[{"name":"SendFriendRequest","id":"4fef10d0-ecf7-43fa-8913-72938123a2a9","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI5YjBkYTQ5NC1kMjIzLTRiODktYWMxZi01ZGE2NjYxOWNmNmYiLCJleHAiOjE3NzA2Njc4OTUsImlhdCI6MTc3MDY2NDI5NX0.II0iogGx2194h32-c_si189RipO_MLjLJvJrUuL7HYA","type":"text"}],"body":{"mode":"raw","raw":"{\r\n    \"friend_id\": \"54aa5daf-6042-448a-8f80-b223f83bd1b7\"\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/friends/request","urlObject":{"path":["api","friends","request"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"4fef10d0-ecf7-43fa-8913-72938123a2a9"},{"name":"AcceptFriendRequest","id":"4064ea79-4b85-4df3-8c3c-6cb31fb1445f","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzA2NjcwODAsImlhdCI6MTc3MDY2MzQ4MH0.N0sUUoYSsPbR4pCtp8QsGa3AckjrBFBDg2AQEJICT8I","type":"text"}],"url":"/api/friends/:userID/accept","urlObject":{"path":["api","friends",":userID","accept"],"host":[""],"query":[],"variable":[{"type":"any","value":"9b0da494-d223-4b89-ac1f-5da66619cf6f","key":"userID"}]}},"response":[],"_postman_id":"4064ea79-4b85-4df3-8c3c-6cb31fb1445f"},{"name":"GetFriends","id":"2798036d-f898-497f-8bb5-c2e5954c821d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzA2NjcwODAsImlhdCI6MTc3MDY2MzQ4MH0.N0sUUoYSsPbR4pCtp8QsGa3AckjrBFBDg2AQEJICT8I","type":"text"}],"url":"/api/friends","urlObject":{"path":["api","friends"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"2798036d-f898-497f-8bb5-c2e5954c821d"},{"name":"GetPendingFriendRequests","id":"293da9ec-d3e5-46be-90cf-30dc0084b88d","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiJiOWFmMTE0OS1lZjE0LTQ0ZTQtYTE0Mi1hYzZmNGUyODI3NjEiLCJleHAiOjE3NzA2NjcwNDEsImlhdCI6MTc3MDY2MzQ0MX0.m37UoFfHz_ife6CGrlXnDG5G8YwzMF9O8XDteGSSNfQ","type":"text"}],"url":"/api/friends/requests","urlObject":{"path":["api","friends","requests"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"293da9ec-d3e5-46be-90cf-30dc0084b88d"},{"name":"GetSentFriendRequests","id":"defdaec8-551b-49bf-96c2-3972862fe2c1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzA2NjcwODAsImlhdCI6MTc3MDY2MzQ4MH0.N0sUUoYSsPbR4pCtp8QsGa3AckjrBFBDg2AQEJICT8I","type":"text"}],"url":"/api/friends/sent","urlObject":{"path":["api","friends","sent"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"defdaec8-551b-49bf-96c2-3972862fe2c1"},{"name":"RejectFriendRequest","id":"1702f147-88ce-4750-ad2b-8b49f4c4ab80","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiJiOWFmMTE0OS1lZjE0LTQ0ZTQtYTE0Mi1hYzZmNGUyODI3NjEiLCJleHAiOjE3NzA2NjcwNDEsImlhdCI6MTc3MDY2MzQ0MX0.m37UoFfHz_ife6CGrlXnDG5G8YwzMF9O8XDteGSSNfQ","type":"text"}],"url":"/api/friends/:userID/reject","urlObject":{"path":["api","friends",":userID","reject"],"host":[""],"query":[],"variable":[{"type":"any","value":"9b0da494-d223-4b89-ac1f-5da66619cf6f","key":"userID"}]}},"response":[],"_postman_id":"1702f147-88ce-4750-ad2b-8b49f4c4ab80"},{"name":"RemoveFriend","id":"aa1f36d7-5761-4e52-8b9e-4e55e9203d70","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzA2NjcwODAsImlhdCI6MTc3MDY2MzQ4MH0.N0sUUoYSsPbR4pCtp8QsGa3AckjrBFBDg2AQEJICT8I","type":"text"}],"url":"/api/friends/:userID","urlObject":{"path":["api","friends",":userID"],"host":[""],"query":[],"variable":[{"type":"any","value":"9b0da494-d223-4b89-ac1f-5da66619cf6f","key":"userID"}]}},"response":[],"_postman_id":"aa1f36d7-5761-4e52-8b9e-4e55e9203d70"}],"id":"ee07ab9e-4ce0-4dd4-9bb8-d5aabe7a1922","_postman_id":"ee07ab9e-4ce0-4dd4-9bb8-d5aabe7a1922","description":""},{"name":"Memeberships","item":[{"name":"UpdateUserMembership","id":"13bd6d71-d7fe-4491-86ae-62a138212f30","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"ApiKey f271c81ff7084ee5b99a5091b42d486e","type":"text"}],"body":{"mode":"raw","raw":"{\r\n  \"event\": \"user.upgraded\",\r\n  \"data\": {\r\n    \"user_id\": \"54aa5daf-6042-448a-8f80-b223f83bd1b7\"\r\n  }\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/polka/webhooks","description":"<h3 id=\"polka-webhook\">Polka Webhook</h3>\n<p><strong>POST</strong> <code>/api/polka/webhooks</code></p>\n<p>Webhook endpoint for payment provider to upgrade users to Chirpy Red.</p>\n<p><strong>Headers:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: ApiKey &lt;polka_api_key&gt;\n</code></pre><p><strong>Request Body:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"event\": \"user.upgraded\",\n  \"data\": {\n    \"user_id\": \"uuid\"\n  }\n}\n</code></pre>\n<p><strong>Response:</strong></p>\n<ul>\n<li><code>204 No Content</code> - Success or ignored event</li>\n<li><code>401 Unauthorized</code> - Invalid API key</li>\n<li><code>404 Not Found</code> - User not found</li>\n</ul>\n","urlObject":{"path":["api","polka","webhooks"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"13bd6d71-d7fe-4491-86ae-62a138212f30"}],"id":"684f0daa-60ed-470c-a6ef-1f9d9ddddd12","_postman_id":"684f0daa-60ed-470c-a6ef-1f9d9ddddd12","description":""},{"name":"Feed","item":[{"name":"GetFeed","id":"d239f856-9df7-4caa-8c7f-46f125d206e4","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzEyODE2NDEsImlhdCI6MTc3MTI3ODA0MX0.h2CKHm-VmIa_fomiBBLCIUr72fi7BDQ2QFDfDCg71JM","type":"text"}],"url":"/api/feed","description":"<h3 id=\"get-feed\">Get Feed</h3>\n<p><strong>GET</strong> <code>/api/feed</code></p>\n<p>Get chronological feed of chirps from users you follow.</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Query Parameters:</strong></p>\n<ul>\n<li><p><code>limit</code> - Number of chirps (default: 20)</p>\n</li>\n<li><p><code>offset</code> - Pagination offset (default: 0)</p>\n</li>\n</ul>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">[\n  {\n    \"id\": \"uuid\",\n    \"created_at\": \"timestamp\",\n    \"updated_at\": \"timestamp\",\n    \"body\": \"chirp text\",\n    \"user_id\": \"uuid\",\n    \"author_email\": \"author@example.com\"\n  }\n]\n\n</code></pre>\n<p><em>Sorted by most recent first</em></p>\n","urlObject":{"path":["api","feed"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"d239f856-9df7-4caa-8c7f-46f125d206e4"}],"id":"251e02df-c1fb-4028-bd78-2e22e7c17a47","_postman_id":"251e02df-c1fb-4028-bd78-2e22e7c17a47","description":""},{"name":"Follows","item":[{"name":"FollowUser","id":"e8e67145-49ed-4adc-9df3-284b962426c0","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzEyODE2NDEsImlhdCI6MTc3MTI3ODA0MX0.h2CKHm-VmIa_fomiBBLCIUr72fi7BDQ2QFDfDCg71JM","type":"text"}],"body":{"mode":"raw","raw":"{\r\n    \"followee_id\": \"b9af1149-ef14-44e4-a142-ac6f4e282761\"\r\n}","options":{"raw":{"language":"json"}}},"url":"/api/follow","description":"<h3 id=\"follow-user\">Follow User</h3>\n<p><strong>POST</strong> <code>/api/follow</code></p>\n<p>Follow another user to see their chirps in your feed.</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Request Body:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"followee_id\": \"uuid\"\n}\n\n</code></pre>\n<p><strong>Response:</strong> <code>204 No Content</code></p>\n<p><strong>Errors:</strong></p>\n<ul>\n<li><p><code>400</code> - Cannot follow yourself</p>\n</li>\n<li><p><code>500</code> - Server error</p>\n</li>\n</ul>\n","urlObject":{"path":["api","follow"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"e8e67145-49ed-4adc-9df3-284b962426c0"},{"name":"UnfollowUser","id":"280faf2c-3f05-4616-932f-5e2a5b7697df","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"DELETE","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiJiOWFmMTE0OS1lZjE0LTQ0ZTQtYTE0Mi1hYzZmNGUyODI3NjEiLCJleHAiOjE3NzA5MjQ1NTcsImlhdCI6MTc3MDkyMDk1N30.lNe6wzxcGMpj5GvrpqrQwFKXQq4hXhfumhj1oUuCtBE","type":"text"}],"url":"/api/follow/:userID","description":"<h3 id=\"unfollow-user\">Unfollow User</h3>\n<p><strong>DELETE</strong> <code>/api/follow/{userID}</code></p>\n<p>Stop following a user.</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Path Parameters:</strong></p>\n<ul>\n<li><code>userID</code> - User UUID to unfollow</li>\n</ul>\n<p><strong>Response:</strong> <code>204 No Content</code></p>\n","urlObject":{"path":["api","follow",":userID"],"host":[""],"query":[],"variable":[{"type":"any","value":"9b0da494-d223-4b89-ac1f-5da66619cf6f","key":"userID"}]}},"response":[],"_postman_id":"280faf2c-3f05-4616-932f-5e2a5b7697df"},{"name":"GetFollowers","id":"eb1880c4-0c4c-4b17-98ed-0211ae39302e","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI5YjBkYTQ5NC1kMjIzLTRiODktYWMxZi01ZGE2NjYxOWNmNmYiLCJleHAiOjE3NzA5MzI1MDEsImlhdCI6MTc3MDkyODkwMX0.9GOsHxsGWgUPNlIDcIvZJciuaKkE27JgrKNtUdJBuJY","type":"text"}],"url":"/api/followers","description":"<h3 id=\"get-followers\">Get Followers</h3>\n<p><strong>GET</strong> <code>/api/followers</code></p>\n<p>Get list of users who follow you.</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"followers\": [\n    {\n      \"id\": \"uuid\",\n      \"email\": \"user@example.com\",\n      \"is_chirpy_red\": false,\n      \"created_at\": \"timestamp\",\n      \"followed_at\": \"timestamp\",\n      \"total_followers\": 10\n    }\n  ],\n  \"total\": 10\n}\n\n</code></pre>\n","urlObject":{"path":["api","followers"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"eb1880c4-0c4c-4b17-98ed-0211ae39302e"},{"name":"GetFollowing","id":"b5a34a1b-217c-49af-9bf5-3adcbb6602f8","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[{"key":"Authorization","value":"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJjaGlycHkiLCJzdWIiOiI1NGFhNWRhZi02MDQyLTQ0OGEtOGY4MC1iMjIzZjgzYmQxYjciLCJleHAiOjE3NzE3ODQ4MTgsImlhdCI6MTc3MTc4MTIxOH0.w5fDDP5MagbUL6tVdudN6Ku6HlyGoGP45bicCMRFmqQ","type":"text"}],"url":"/api/following","description":"<h3 id=\"get-following\">Get Following</h3>\n<p><strong>GET</strong> <code>/api/following</code></p>\n<p>Get list of users you follow.</p>\n<p><strong>Auth Required:</strong> Yes</p>\n<p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"following\": [\n    {\n      \"id\": \"uuid\",\n      \"email\": \"user@example.com\",\n      \"is_chirpy_red\": false,\n      \"created_at\": \"timestamp\",\n      \"followed_at\": \"timestamp\",\n      \"total_following\": 15\n    }\n  ],\n  \"total\": 15\n}\n\n</code></pre>\n","urlObject":{"path":["api","following"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"b5a34a1b-217c-49af-9bf5-3adcbb6602f8"}],"id":"cd0fd802-366f-4c7d-8087-5fb168e27d5b","_postman_id":"cd0fd802-366f-4c7d-8087-5fb168e27d5b","description":""},{"name":"Auth","item":[{"name":"RefreshToken","id":"c0b0e5ed-e38c-47b4-ad23-51b58554301a","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer e4a9f3749f910ff7bf8078f78805f5d5550cfcea8089cf11c2c368caeb76edd0","type":"text"}],"url":"/api/refresh","description":"<h3 id=\"refresh-token\">Refresh Token</h3>\n<p><strong>POST</strong> <code>/api/refresh</code></p>\n<p>Get a new access token using refresh token.</p>\n<p><strong>Headers:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer &lt;refresh_token&gt;\n\n</code></pre><p><strong>Response:</strong> <code>200 OK</code></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code class=\"language-json\">{\n  \"token\": \"new_jwt_access_token\"\n}\n\n</code></pre>\n","urlObject":{"path":["api","refresh"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"c0b0e5ed-e38c-47b4-ad23-51b58554301a"},{"name":"RevokeToken","id":"6c6469bf-0202-4f46-b0a5-918cc03a78c1","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[{"key":"Authorization","value":"Bearer ","type":"text"}],"url":"/api/revoke","description":"<h3 id=\"revoke-token\">Revoke Token</h3>\n<p><strong>POST</strong> <code>/api/revoke</code></p>\n<p>Revoke a refresh token (logout).</p>\n<p><strong>Headers:</strong></p>\n<pre class=\"click-to-expand-wrapper is-snippet-wrapper\"><code>Authorization: Bearer &lt;refresh_token&gt;\n\n</code></pre><p><strong>Response:</strong> <code>204 No Content</code></p>\n","urlObject":{"path":["api","revoke"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"6c6469bf-0202-4f46-b0a5-918cc03a78c1"}],"id":"78ee7f5c-81c3-4f6a-86b2-38cfcff55d98","_postman_id":"78ee7f5c-81c3-4f6a-86b2-38cfcff55d98","description":""}],"id":"5cba20fa-3c99-448a-b59f-272ca651e856","_postman_id":"5cba20fa-3c99-448a-b59f-272ca651e856","description":""},{"name":"admin","item":[{"name":"metrics","id":"701273a1-0f3a-4506-b190-3749e98e5acd","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"{\r\n    \"body\": \"Hi Im Shubhodeep, Chirpin' via postman. Lets sharbert.\"\r\n}"},"url":"/admin/metrics","description":"<h3 id=\"get-metrics\">Get Metrics</h3>\n<p><strong>GET</strong> <code>/admin/metrics</code></p>\n<p>View server metrics (hit counter).</p>\n<p><strong>Response:</strong> <code>200 OK</code> (HTML page)</p>\n","urlObject":{"path":["admin","metrics"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"701273a1-0f3a-4506-b190-3749e98e5acd"},{"name":"reset","id":"a4800e92-1166-40c1-98c0-ceb9dd14dd75","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"POST","header":[],"body":{"mode":"raw","raw":"{\r\n    \"body\": \"Hi Im Shubhodeep, Chirpin' via postman. Lets sharbert.\"\r\n}"},"url":"/admin/reset","description":"<h3 id=\"reset-metrics\">Reset Metrics</h3>\n<p><strong>POST</strong> <code>/admin/reset</code></p>\n<p>Reset hit counter to zero.</p>\n<p><strong>Response:</strong> <code>200 OK</code> (HTML page)</p>\n","urlObject":{"path":["admin","reset"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"a4800e92-1166-40c1-98c0-ceb9dd14dd75"}],"id":"0407e171-3024-4c90-a175-141b2b8d5679","_postman_id":"0407e171-3024-4c90-a175-141b2b8d5679","description":""},{"name":"app","item":[{"name":"root","id":"158dd92e-bb49-4d3c-bc2b-3a5869c11d21","protocolProfileBehavior":{"disableBodyPruning":true},"request":{"method":"GET","header":[],"body":{"mode":"raw","raw":"{\r\n    \"body\": \"Hi Im Shubhodeep, Chirpin' via postman. Lets sharbert.\"\r\n}"},"url":"/app","urlObject":{"path":["app"],"host":[""],"query":[],"variable":[]}},"response":[],"_postman_id":"158dd92e-bb49-4d3c-bc2b-3a5869c11d21"}],"id":"24c064b9-a417-4218-baf7-c25eb8290598","_postman_id":"24c064b9-a417-4218-baf7-c25eb8290598","description":""}],"variable":[{"key":"baseURL","value":"","type":"default"}]}