{
  "info": {
    "name": "Runvello API",
    "description": "Single-file Runvello API package. Import this collection, set the secret api_token collection variable and the workspace base_url, then choose requests by required scope. No separate Postman environment is required. Collection requests identify required scopes and include success/error examples. Common errors are 400 malformed input, 401 invalid token, 403 plan or scope denial, 404 tenant-safe miss, 422 validation, 429 throttling, and 503 unavailable tenant schema. The OpenAPI 3.1 document is canonical.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
    "version": {
      "major": 1,
      "minor": 0,
      "patch": 0
    }
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_token}}",
        "type": "string"
      }
    ]
  },
  "variable": [
    {
      "key": "base_url",
      "value": "https://your-workspace.runvello.com",
      "type": "string",
      "description": "Workspace host that issued the API token."
    },
    {
      "key": "api_token",
      "value": "ldr_replace_with_token",
      "type": "secret",
      "description": "Least-privilege Runvello token. Store locally and never export a populated collection."
    },
    { "key": "client_id", "value": "1", "type": "string" },
    { "key": "person_id", "value": "1", "type": "string" },
    { "key": "lead_id", "value": "1", "type": "string" },
    { "key": "booking_id", "value": "1", "type": "string" },
    { "key": "booking_service_id", "value": "1", "type": "string" },
    { "key": "user_id", "value": "1", "type": "string" },
    { "key": "contract_id", "value": "1", "type": "string" },
    { "key": "invoice_id", "value": "1", "type": "string" },
    { "key": "email_campaign_id", "value": "1", "type": "string" }
  ],
  "event": [
    {
      "listen": "test",
      "script": {
        "type": "text/javascript",
        "exec": [
          "const documentedStatuses = [200, 201, 400, 401, 403, 404, 422, 429, 503];",
          "pm.test(\"Response uses a documented status\", function () {",
          "  pm.expect(documentedStatuses).to.include(pm.response.code);",
          "});",
          "pm.test(\"Response is JSON\", function () {",
          "  pm.expect(pm.response.headers.get(\"Content-Type\") || \"\").to.include(\"application/json\");",
          "  pm.expect(function () { pm.response.json(); }).not.to.throw();",
          "});"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "CRM",
      "item": [
        {
          "name": "List clients [clients:read]",
          "request": {
            "method": "GET",
            "description": "Requires clients:read. Paginated response: data plus meta. Filters: status, client_type, q.",
            "url": "{{base_url}}/api/v1/clients?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires clients:read. Paginated response: data plus meta. Filters: status, client_type, q.",
                "url": "{{base_url}}/api/v1/clients?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 12,\n      \"name\": \"Acme Studio\",\n      \"client_type\": \"company\",\n      \"status\": \"active\",\n      \"email\": \"hello@example.com\"\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires clients:read. Paginated response: data plus meta. Filters: status, client_type, q.",
                "url": "{{base_url}}/api/v1/clients?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Create client [clients:write]",
          "request": {
            "method": "POST",
            "description": "Requires clients:write. Client plan limits remain enforced.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client\": {\n    \"name\": \"Example Client\",\n    \"client_type\": \"company\",\n    \"email\": \"client@example.com\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/clients"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires clients:write. Client plan limits remain enforced.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client\": {\n    \"name\": \"Example Client\",\n    \"client_type\": \"company\",\n    \"email\": \"client@example.com\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/clients"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 12,\n  \"name\": \"Acme Studio\",\n  \"client_type\": \"company\",\n  \"status\": \"active\",\n  \"email\": \"hello@example.com\",\n  \"address\": {\n    \"city\": \"Chicago\",\n    \"state\": \"IL\",\n    \"country\": \"USA\"\n  },\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires clients:write. Client plan limits remain enforced.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client\": {\n    \"name\": \"Example Client\",\n    \"client_type\": \"company\",\n    \"email\": \"client@example.com\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/clients"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Get client [clients:read]",
          "request": {
            "method": "GET",
            "description": "Requires clients:read.",
            "url": "{{base_url}}/api/v1/clients/{{client_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires clients:read.",
                "url": "{{base_url}}/api/v1/clients/{{client_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 12,\n  \"name\": \"Acme Studio\",\n  \"client_type\": \"company\",\n  \"status\": \"active\",\n  \"email\": \"hello@example.com\",\n  \"address\": {\n    \"city\": \"Chicago\",\n    \"state\": \"IL\",\n    \"country\": \"USA\"\n  },\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires clients:read.",
                "url": "{{base_url}}/api/v1/clients/{{client_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Update client [clients:write]",
          "request": {
            "method": "PATCH",
            "description": "Requires clients:write. Only allowlisted profile fields are writable.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client\": {\n    \"status\": \"active\",\n    \"phone\": \"+1 555 0100\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/clients/{{client_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires clients:write. Only allowlisted profile fields are writable.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client\": {\n    \"status\": \"active\",\n    \"phone\": \"+1 555 0100\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/clients/{{client_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 12,\n  \"name\": \"Acme Studio\",\n  \"client_type\": \"company\",\n  \"status\": \"active\",\n  \"email\": \"hello@example.com\",\n  \"address\": {\n    \"city\": \"Chicago\",\n    \"state\": \"IL\",\n    \"country\": \"USA\"\n  },\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires clients:write. Only allowlisted profile fields are writable.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client\": {\n    \"status\": \"active\",\n    \"phone\": \"+1 555 0100\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/clients/{{client_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "List client people [people:read]",
          "request": {
            "method": "GET",
            "description": "Requires people:read. Supports page, per_page, and q.",
            "url": "{{base_url}}/api/v1/clients/{{client_id}}/people?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires people:read. Supports page, per_page, and q.",
                "url": "{{base_url}}/api/v1/clients/{{client_id}}/people?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 21,\n      \"client_id\": 12,\n      \"full_name\": \"Taylor Jordan\",\n      \"email\": \"taylor@example.com\"\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires people:read. Supports page, per_page, and q.",
                "url": "{{base_url}}/api/v1/clients/{{client_id}}/people?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Create client person [people:write]",
          "request": {
            "method": "POST",
            "description": "Requires people:write. The person is always bound to the client in this workspace.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"person\": {\n    \"full_name\": \"Taylor Jordan\",\n    \"email\": \"taylor@example.com\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/clients/{{client_id}}/people"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires people:write. The person is always bound to the client in this workspace.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"person\": {\n    \"full_name\": \"Taylor Jordan\",\n    \"email\": \"taylor@example.com\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/clients/{{client_id}}/people"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 21,\n  \"client_id\": 12,\n  \"client_name\": \"Acme Studio\",\n  \"full_name\": \"Taylor Jordan\",\n  \"email\": \"taylor@example.com\",\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires people:write. The person is always bound to the client in this workspace.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"person\": {\n    \"full_name\": \"Taylor Jordan\",\n    \"email\": \"taylor@example.com\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/clients/{{client_id}}/people"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "List people [people:read]",
          "request": {
            "method": "GET",
            "description": "Requires people:read. Paginated; supports q and client_id.",
            "url": "{{base_url}}/api/v1/people?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires people:read. Paginated; supports q and client_id.",
                "url": "{{base_url}}/api/v1/people?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 21,\n      \"client_id\": 12,\n      \"full_name\": \"Taylor Jordan\",\n      \"email\": \"taylor@example.com\"\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires people:read. Paginated; supports q and client_id.",
                "url": "{{base_url}}/api/v1/people?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Get person [people:read]",
          "request": {
            "method": "GET",
            "description": "Requires people:read.",
            "url": "{{base_url}}/api/v1/people/{{person_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires people:read.",
                "url": "{{base_url}}/api/v1/people/{{person_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 21,\n  \"client_id\": 12,\n  \"client_name\": \"Acme Studio\",\n  \"full_name\": \"Taylor Jordan\",\n  \"email\": \"taylor@example.com\",\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires people:read.",
                "url": "{{base_url}}/api/v1/people/{{person_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Update person [people:write]",
          "request": {
            "method": "PATCH",
            "description": "Requires people:write. Client ownership cannot be changed.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"person\": {\n    \"full_name\": \"Taylor J.\",\n    \"phone_number\": \"+1 555 0101\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/people/{{person_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires people:write. Client ownership cannot be changed.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"person\": {\n    \"full_name\": \"Taylor J.\",\n    \"phone_number\": \"+1 555 0101\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/people/{{person_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 21,\n  \"client_id\": 12,\n  \"client_name\": \"Acme Studio\",\n  \"full_name\": \"Taylor Jordan\",\n  \"email\": \"taylor@example.com\",\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires people:write. Client ownership cannot be changed.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"person\": {\n    \"full_name\": \"Taylor J.\",\n    \"phone_number\": \"+1 555 0101\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/people/{{person_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "List leads [leads:read]",
          "request": {
            "method": "GET",
            "description": "Requires leads:read. Paginated; supports stage, lead_intent, conversion_target, and q.",
            "url": "{{base_url}}/api/v1/leads?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires leads:read. Paginated; supports stage, lead_intent, conversion_target, and q.",
                "url": "{{base_url}}/api/v1/leads?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 31,\n      \"full_name\": \"Morgan Lee\",\n      \"email\": \"morgan@example.com\",\n      \"stage\": \"new\",\n      \"lead_intent\": \"service_customer\",\n      \"conversion_target\": \"tenant_client\"\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires leads:read. Paginated; supports stage, lead_intent, conversion_target, and q.",
                "url": "{{base_url}}/api/v1/leads?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Create lead [leads:write]",
          "request": {
            "method": "POST",
            "description": "Requires leads:write.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"lead\": {\n    \"full_name\": \"Morgan Lee\",\n    \"email\": \"morgan@example.com\",\n    \"stage\": \"new\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/leads"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires leads:write.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"lead\": {\n    \"full_name\": \"Morgan Lee\",\n    \"email\": \"morgan@example.com\",\n    \"stage\": \"new\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/leads"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 31,\n  \"full_name\": \"Morgan Lee\",\n  \"email\": \"morgan@example.com\",\n  \"stage\": \"qualified\",\n  \"lead_intent\": \"service_customer\",\n  \"conversion_target\": \"tenant_client\",\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires leads:write.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"lead\": {\n    \"full_name\": \"Morgan Lee\",\n    \"email\": \"morgan@example.com\",\n    \"stage\": \"new\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/leads"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Get lead [leads:read]",
          "request": {
            "method": "GET",
            "description": "Requires leads:read.",
            "url": "{{base_url}}/api/v1/leads/{{lead_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires leads:read.",
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 31,\n  \"full_name\": \"Morgan Lee\",\n  \"email\": \"morgan@example.com\",\n  \"stage\": \"qualified\",\n  \"lead_intent\": \"service_customer\",\n  \"conversion_target\": \"tenant_client\",\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires leads:read.",
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Update lead [leads:write]",
          "request": {
            "method": "PATCH",
            "description": "Requires leads:write.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"lead\": {\n    \"stage\": \"qualified\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/leads/{{lead_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires leads:write.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"lead\": {\n    \"stage\": \"qualified\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 31,\n  \"full_name\": \"Morgan Lee\",\n  \"email\": \"morgan@example.com\",\n  \"stage\": \"qualified\",\n  \"lead_intent\": \"service_customer\",\n  \"conversion_target\": \"tenant_client\",\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires leads:write.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"lead\": {\n    \"stage\": \"qualified\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Preview lead conversion [leads:convert]",
          "request": {
            "method": "GET",
            "description": "Requires leads:convert.",
            "url": "{{base_url}}/api/v1/leads/{{lead_id}}/convert-preview"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires leads:convert.",
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}/convert-preview"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"lead_id\": 31,\n  \"conversion_target\": \"tenant_client\",\n  \"invite_possible\": true,\n  \"warnings\": [],\n  \"client\": {\n    \"name\": \"Morgan Lee\",\n    \"client_type\": \"individual\"\n  },\n  \"person\": {\n    \"full_name\": \"Morgan Lee\",\n    \"email\": \"morgan@example.com\"\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires leads:convert.",
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}/convert-preview"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Convert lead [leads:convert]",
          "request": {
            "method": "POST",
            "description": "Requires leads:convert. Client limits remain enforced.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"conversion\": {\n    \"conversion_target\": \"tenant_client\",\n    \"client_name\": \"Morgan Lee\",\n    \"client_type\": \"individual\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/leads/{{lead_id}}/convert"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires leads:convert. Client limits remain enforced.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"conversion\": {\n    \"conversion_target\": \"tenant_client\",\n    \"client_name\": \"Morgan Lee\",\n    \"client_type\": \"individual\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}/convert"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"conversion_target\": \"tenant_client\",\n  \"client\": {\n    \"id\": 12,\n    \"name\": \"Morgan Lee\",\n    \"client_type\": \"individual\"\n  },\n  \"person\": {\n    \"id\": 21,\n    \"full_name\": \"Morgan Lee\",\n    \"email\": \"morgan@example.com\"\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires leads:convert. Client limits remain enforced.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"conversion\": {\n    \"conversion_target\": \"tenant_client\",\n    \"client_name\": \"Morgan Lee\",\n    \"client_type\": \"individual\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/leads/{{lead_id}}/convert"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Scheduling",
      "item": [
        {
          "name": "List bookings [bookings:read]",
          "request": {
            "method": "GET",
            "description": "Requires bookings:read. Paginated; supports status, payment_status, client_id, and booking_service_id.",
            "url": "{{base_url}}/api/v1/bookings?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires bookings:read. Paginated; supports status, payment_status, client_id, and booking_service_id.",
                "url": "{{base_url}}/api/v1/bookings?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 41,\n      \"status\": \"confirmed\",\n      \"starts_at\": \"2026-08-01T15:00:00Z\",\n      \"ends_at\": \"2026-08-01T15:30:00Z\",\n      \"booking_service_id\": 4,\n      \"user_id\": 7\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires bookings:read. Paginated; supports status, payment_status, client_id, and booking_service_id.",
                "url": "{{base_url}}/api/v1/bookings?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Create booking [bookings:write]",
          "request": {
            "method": "POST",
            "description": "Requires bookings:write. Relationship IDs must belong to this workspace and availability is validated.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"booking\": {\n    \"booking_service_id\": {{booking_service_id}},\n    \"client_id\": {{client_id}},\n    \"user_id\": {{user_id}},\n    \"starts_at\": \"2026-08-01T15:00:00Z\",\n    \"status\": \"requested\",\n    \"time_zone\": \"America/Chicago\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/bookings"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires bookings:write. Relationship IDs must belong to this workspace and availability is validated.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"booking\": {\n    \"booking_service_id\": {{booking_service_id}},\n    \"client_id\": {{client_id}},\n    \"user_id\": {{user_id}},\n    \"starts_at\": \"2026-08-01T15:00:00Z\",\n    \"status\": \"requested\",\n    \"time_zone\": \"America/Chicago\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/bookings"
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 41,\n  \"status\": \"confirmed\",\n  \"payment_status\": \"not_required\",\n  \"starts_at\": \"2026-08-01T15:00:00Z\",\n  \"ends_at\": \"2026-08-01T15:30:00Z\",\n  \"booking_service_id\": 4,\n  \"user_id\": 7,\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "POST",
                "description": "Requires bookings:write. Relationship IDs must belong to this workspace and availability is validated.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"booking\": {\n    \"booking_service_id\": {{booking_service_id}},\n    \"client_id\": {{client_id}},\n    \"user_id\": {{user_id}},\n    \"starts_at\": \"2026-08-01T15:00:00Z\",\n    \"status\": \"requested\",\n    \"time_zone\": \"America/Chicago\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/bookings"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Get booking [bookings:read]",
          "request": {
            "method": "GET",
            "description": "Requires bookings:read.",
            "url": "{{base_url}}/api/v1/bookings/{{booking_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires bookings:read.",
                "url": "{{base_url}}/api/v1/bookings/{{booking_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 41,\n  \"status\": \"confirmed\",\n  \"payment_status\": \"not_required\",\n  \"starts_at\": \"2026-08-01T15:00:00Z\",\n  \"ends_at\": \"2026-08-01T15:30:00Z\",\n  \"booking_service_id\": 4,\n  \"user_id\": 7,\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires bookings:read.",
                "url": "{{base_url}}/api/v1/bookings/{{booking_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Update booking [bookings:write]",
          "request": {
            "method": "PATCH",
            "description": "Requires bookings:write. Uses the normal Runvello booking workflow.",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"booking\": {\n    \"status\": \"confirmed\",\n    \"location\": \"Studio A\"\n  }\n}"
            },
            "url": "{{base_url}}/api/v1/bookings/{{booking_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires bookings:write. Uses the normal Runvello booking workflow.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"booking\": {\n    \"status\": \"confirmed\",\n    \"location\": \"Studio A\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/bookings/{{booking_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 41,\n  \"status\": \"confirmed\",\n  \"payment_status\": \"not_required\",\n  \"starts_at\": \"2026-08-01T15:00:00Z\",\n  \"ends_at\": \"2026-08-01T15:30:00Z\",\n  \"booking_service_id\": 4,\n  \"user_id\": 7,\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "PATCH",
                "description": "Requires bookings:write. Uses the normal Runvello booking workflow.",
                "header": [
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"booking\": {\n    \"status\": \"confirmed\",\n    \"location\": \"Studio A\"\n  }\n}"
                },
                "url": "{{base_url}}/api/v1/bookings/{{booking_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Work and finance (read-only)",
      "item": [
        {
          "name": "List projects [projects:read]",
          "request": {
            "method": "GET",
            "description": "Requires projects:read. Paginated; supports client_id and status.",
            "url": "{{base_url}}/api/v1/projects?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires projects:read. Paginated; supports client_id and status.",
                "url": "{{base_url}}/api/v1/projects?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 51,\n      \"name\": \"Brand launch\",\n      \"status\": \"active\",\n      \"billing_type\": \"hourly\",\n      \"client_id\": 12\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires projects:read. Paginated; supports client_id and status.",
                "url": "{{base_url}}/api/v1/projects?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "List project tasks [tasks:read]",
          "request": {
            "method": "GET",
            "description": "Requires tasks:read. Paginated; supports status, project_id, assigned_user_id, and client_id.",
            "url": "{{base_url}}/api/v1/project-tasks?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires tasks:read. Paginated; supports status, project_id, assigned_user_id, and client_id.",
                "url": "{{base_url}}/api/v1/project-tasks?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 61,\n      \"name\": \"Approve concepts\",\n      \"kind\": \"task\",\n      \"status\": \"pending\",\n      \"priority\": \"medium\",\n      \"project_id\": 51\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires tasks:read. Paginated; supports status, project_id, assigned_user_id, and client_id.",
                "url": "{{base_url}}/api/v1/project-tasks?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "List contracts [contracts:read]",
          "request": {
            "method": "GET",
            "description": "Requires contracts:read. Read-only and paginated; supports status, client_id, and project_id.",
            "url": "{{base_url}}/api/v1/contracts?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires contracts:read. Read-only and paginated; supports status, client_id, and project_id.",
                "url": "{{base_url}}/api/v1/contracts?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 71,\n      \"title\": \"Services Agreement\",\n      \"status\": \"sent\",\n      \"client_name\": \"Acme Studio\",\n      \"price_cents\": 25000,\n      \"price_currency\": \"USD\"\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires contracts:read. Read-only and paginated; supports status, client_id, and project_id.",
                "url": "{{base_url}}/api/v1/contracts?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Get contract [contracts:read]",
          "request": {
            "method": "GET",
            "description": "Requires contracts:read. Read-only.",
            "url": "{{base_url}}/api/v1/contracts/{{contract_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires contracts:read. Read-only.",
                "url": "{{base_url}}/api/v1/contracts/{{contract_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 71,\n  \"title\": \"Services Agreement\",\n  \"status\": \"sent\",\n  \"service_type\": \"Consulting\",\n  \"client_name\": \"Acme Studio\",\n  \"client_email\": \"hello@example.com\",\n  \"scope_of_work\": \"Strategy\",\n  \"deliverables\": \"Plan\",\n  \"timeline\": \"Thirty days\",\n  \"usage_rights\": \"Client use\",\n  \"payment_terms\": \"Net 15\",\n  \"cancellation_terms\": \"Seven days\",\n  \"price_cents\": 25000,\n  \"price_currency\": \"USD\",\n  \"ai_generated\": false,\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires contracts:read. Read-only.",
                "url": "{{base_url}}/api/v1/contracts/{{contract_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "List invoices [invoices:read]",
          "request": {
            "method": "GET",
            "description": "Requires invoices:read. Read-only and paginated; supports status, client_id, stripe_status, and q.",
            "url": "{{base_url}}/api/v1/invoices?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires invoices:read. Read-only and paginated; supports status, client_id, stripe_status, and q.",
                "url": "{{base_url}}/api/v1/invoices?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 81,\n      \"invoice_number\": \"INV-0001\",\n      \"status\": \"sent\",\n      \"invoice_date\": \"2026-08-01\",\n      \"due_date\": \"2026-08-15\",\n      \"total\": \"250.00\",\n      \"amount_due\": \"250.00\"\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires invoices:read. Read-only and paginated; supports status, client_id, stripe_status, and q.",
                "url": "{{base_url}}/api/v1/invoices?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Get invoice [invoices:read]",
          "request": {
            "method": "GET",
            "description": "Requires invoices:read. Read-only.",
            "url": "{{base_url}}/api/v1/invoices/{{invoice_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires invoices:read. Read-only.",
                "url": "{{base_url}}/api/v1/invoices/{{invoice_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 81,\n  \"invoice_number\": \"INV-0001\",\n  \"status\": \"sent\",\n  \"invoice_date\": \"2026-08-01\",\n  \"due_date\": \"2026-08-15\",\n  \"total\": \"250.00\",\n  \"amount_paid\": \"0.00\",\n  \"amount_due\": \"250.00\",\n  \"line_items\": [],\n  \"payments\": [],\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires invoices:read. Read-only.",
                "url": "{{base_url}}/api/v1/invoices/{{invoice_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "List client unbilled time [clients:unbilled_time_entries:read]",
          "request": {
            "method": "GET",
            "description": "Requires clients:unbilled_time_entries:read. Returns all unbilled entries for the tenant-scoped client; this response is not paginated.",
            "url": "{{base_url}}/api/v1/clients/{{client_id}}/unbilled-time-entries"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires clients:unbilled_time_entries:read. Returns all unbilled entries for the tenant-scoped client; this response is not paginated.",
                "url": "{{base_url}}/api/v1/clients/{{client_id}}/unbilled-time-entries"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"time_entries\": [\n    {\n      \"id\": 101,\n      \"task\": \"Discovery\",\n      \"project_name\": \"Brand launch\",\n      \"start_time\": \"08/01 09:00AM\",\n      \"end_time\": \"10:30AM\",\n      \"duration_hours\": 1.5,\n      \"rate\": \"150.00\",\n      \"earnings\": \"225.00\"\n    }\n  ]\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires clients:unbilled_time_entries:read. Returns all unbilled entries for the tenant-scoped client; this response is not paginated.",
                "url": "{{base_url}}/api/v1/clients/{{client_id}}/unbilled-time-entries"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Marketing (read-only)",
      "item": [
        {
          "name": "List email campaigns [email_campaigns:read]",
          "request": {
            "method": "GET",
            "description": "Requires email_campaigns:read. Read-only and paginated; supports status and category.",
            "url": "{{base_url}}/api/v1/email-campaigns?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires email_campaigns:read. Read-only and paginated; supports status and category.",
                "url": "{{base_url}}/api/v1/email-campaigns?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 91,\n      \"name\": \"August newsletter\",\n      \"category\": \"newsletter\",\n      \"delivery_mode\": \"standalone\",\n      \"status\": \"draft\",\n      \"step_count\": 1\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires email_campaigns:read. Read-only and paginated; supports status and category.",
                "url": "{{base_url}}/api/v1/email-campaigns?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Get email campaign [email_campaigns:read]",
          "request": {
            "method": "GET",
            "description": "Requires email_campaigns:read. Read-only; message body HTML is not exposed.",
            "url": "{{base_url}}/api/v1/email-campaigns/{{email_campaign_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires email_campaigns:read. Read-only; message body HTML is not exposed.",
                "url": "{{base_url}}/api/v1/email-campaigns/{{email_campaign_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"id\": 91,\n  \"name\": \"August newsletter\",\n  \"category\": \"newsletter\",\n  \"delivery_mode\": \"standalone\",\n  \"status\": \"draft\",\n  \"reply_to_email\": \"owner@example.com\",\n  \"recurring_cadence\": \"none\",\n  \"step_count\": 1,\n  \"created_at\": \"2026-07-12T12:00:00Z\",\n  \"updated_at\": \"2026-07-12T12:00:00Z\"\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Requires email_campaigns:read. Read-only; message body HTML is not exposed.",
                "url": "{{base_url}}/api/v1/email-campaigns/{{email_campaign_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Legacy compatibility (deprecated)",
      "item": [
        {
          "name": "Legacy project options [projects:read]",
          "request": {
            "method": "GET",
            "description": "Deprecated compatibility endpoint. New integrations should use /api/v1/projects.",
            "url": "{{base_url}}/api/projects?client_id={{client_id}}"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Deprecated compatibility endpoint. New integrations should use /api/v1/projects.",
                "url": "{{base_url}}/api/projects?client_id={{client_id}}"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"id\": 51,\n    \"name\": \"Brand launch\"\n  }\n]"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Deprecated compatibility endpoint. New integrations should use /api/v1/projects.",
                "url": "{{base_url}}/api/projects?client_id={{client_id}}"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Legacy project tasks [tasks:read]",
          "request": {
            "method": "GET",
            "description": "Deprecated compatibility endpoint. New integrations should use /api/v1/project-tasks.",
            "url": "{{base_url}}/api/project-tasks?page=1&per_page=25"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Deprecated compatibility endpoint. New integrations should use /api/v1/project-tasks.",
                "url": "{{base_url}}/api/project-tasks?page=1&per_page=25"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"data\": [\n    {\n      \"id\": 61,\n      \"name\": \"Approve concepts\",\n      \"kind\": \"task\",\n      \"status\": \"pending\",\n      \"priority\": \"medium\",\n      \"project_id\": 51\n    }\n  ],\n  \"meta\": {\n    \"page\": 1,\n    \"per_page\": 25,\n    \"total_count\": 1,\n    \"total_pages\": 1\n  }\n}"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Deprecated compatibility endpoint. New integrations should use /api/v1/project-tasks.",
                "url": "{{base_url}}/api/project-tasks?page=1&per_page=25"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        },
        {
          "name": "Legacy time-entry task options [tasks:read]",
          "request": {
            "method": "GET",
            "description": "Deprecated compatibility endpoint.",
            "url": "{{base_url}}/api/tasks"
          },
          "response": [
            {
              "name": "Success example",
              "originalRequest": {
                "method": "GET",
                "description": "Deprecated compatibility endpoint.",
                "url": "{{base_url}}/api/tasks"
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "[\n  {\n    \"task\": \"Discovery\",\n    \"client_id\": 12,\n    \"project_id\": 51,\n    \"source\": \"project_task\"\n  }\n]"
            },
            {
              "name": "Authentication error example",
              "originalRequest": {
                "method": "GET",
                "description": "Deprecated compatibility endpoint.",
                "url": "{{base_url}}/api/tasks"
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "cookie": [],
              "body": "{\n  \"error\": \"Invalid or expired API token.\"\n}"
            }
          ]
        }
      ]
    }
  ]
}
