{
  "info": {
    "_postman_id": "b4b0f5e0-6f2a-4f5e-9b7d-2f4a1c8e9d31",
    "name": "FreeInd API",
    "description": "FreeInd AI generation API — core generation plus the Tools API (free.flow, free.studio, free.slides, free.podcast, free.audiobook, free.voices, free.boards, free.chat).\n\nBase URL: https://free.ind.in\n\n**Setup**\n1. Create an API key at https://free.ind.in/dashboard/api-keys (include workflows.* if you will use free.flow).\n2. Set the `apiKey` collection variable (or select the bundled environment and set it there).\n3. Set `workspaceId` and `modelId` from `GET /v1/models`.\n\nRequests inherit Bearer auth from the collection. Test scripts capture created ids (generationId, runId, deckId, …) so later requests chain automatically.\n\nDashboard-only endpoints (API keys, billing, workspaces, account) require a session cookie and are intentionally not included.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{apiKey}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "if (!pm.collectionVariables.get('apiKey') || pm.collectionVariables.get('apiKey') === 'fi_live_your_key_here') {",
          "  console.warn('Set the apiKey collection variable before sending requests.');",
          "}"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://free.ind.in",
      "type": "string"
    },
    {
      "key": "apiKey",
      "value": "fi_live_your_key_here",
      "type": "string"
    },
    {
      "key": "workspaceId",
      "value": "00000000-0000-4000-8000-000000000000",
      "type": "string"
    },
    {
      "key": "modelId",
      "value": "00000000-0000-4000-8000-000000000001",
      "type": "string"
    },
    {
      "key": "generationId",
      "value": "00000000-0000-4000-8000-0000000000aa",
      "type": "string"
    },
    {
      "key": "assetId",
      "value": "00000000-0000-4000-8000-0000000000b1",
      "type": "string"
    },
    {
      "key": "webhookId",
      "value": "00000000-0000-4000-8000-0000000000e1",
      "type": "string"
    },
    {
      "key": "workflowId",
      "value": "00000000-0000-4000-8000-000000000101",
      "type": "string"
    },
    {
      "key": "runId",
      "value": "00000000-0000-4000-8000-000000000102",
      "type": "string"
    },
    {
      "key": "deckId",
      "value": "00000000-0000-4000-8000-000000000103",
      "type": "string"
    },
    {
      "key": "audiobookId",
      "value": "00000000-0000-4000-8000-000000000104",
      "type": "string"
    },
    {
      "key": "voiceProfileId",
      "value": "00000000-0000-4000-8000-000000000105",
      "type": "string"
    },
    {
      "key": "planId",
      "value": "00000000-0000-4000-8000-000000000106",
      "type": "string"
    },
    {
      "key": "boardId",
      "value": "00000000-0000-4000-8000-000000000107",
      "type": "string"
    },
    {
      "key": "itemId",
      "value": "00000000-0000-4000-8000-000000000108",
      "type": "string"
    },
    {
      "key": "presetId",
      "value": "00000000-0000-4000-8000-000000000109",
      "type": "string"
    },
    {
      "key": "projectId",
      "value": "00000000-0000-4000-8000-000000000110",
      "type": "string"
    }
  ],
  "item": [
    {
      "name": "Meta & discovery",
      "description": "Unauthenticated endpoints for service health, plans, and the public model catalog. Safe to call from the browser or a startup probe.",
      "item": [
        {
          "name": "Readiness probe",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/v1/health/ready",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "health",
                "ready"
              ]
            },
            "description": "Readiness probe\n\nReports the health of the database, Redis, storage, providers, and workers. Returns 200 when the API can serve traffic and 503 when a critical dependency is unavailable.\n\n**Auth:** none (public endpoint)."
          },
          "response": []
        },
        {
          "name": "List public plans",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/v1/plans",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "plans"
              ]
            },
            "description": "List public plans\n\nActive subscription and one-time plans with their entitlements and the latest approved price. Prices are returned in USD; `GET /v1/billing/fx` exposes the live USD→INR rate.\n\n**Auth:** none (public endpoint)."
          },
          "response": []
        },
        {
          "name": "Public model showcase",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/v1/models/public",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "models",
                "public"
              ]
            },
            "description": "Public model showcase\n\nEvery active model with its provider, modality, supported modes, and credit price. No auth and no workspace context, so plan-specific availability is not applied.\n\n**Auth:** none (public endpoint)."
          },
          "response": []
        },
        {
          "name": "Public catalog with samples",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/v1/catalog/public",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "catalog",
                "public"
              ]
            },
            "description": "Public catalog with samples\n\nMakers, generation modes, and active models with sample outputs. This powers the public model pages and is cached in Redis.\n\n**Auth:** none (public endpoint)."
          },
          "response": []
        },
        {
          "name": "Public platform stats",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/v1/stats/public",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "stats",
                "public"
              ]
            },
            "description": "Public platform stats\n\nAggregate count of successfully completed generations across the platform.\n\n**Auth:** none (public endpoint)."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Models",
      "description": "Plan-aware model discovery. Always read the catalog before submitting a generation — it carries the credit price and the per-model `parameterSchema` used to validate params.",
      "item": [
        {
          "name": "List models available to a workspace",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/models?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "models"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to resolve plan availability for."
                }
              ]
            },
            "description": "List models available to a workspace\n\nActive models filtered by the workspace's plan. Each model includes `creditsPerGeneration`, `supportedModes`, `parameterSchema`, input requirements, and limits. Params sent to `POST /v1/generations` are validated against `parameterSchema`.\n\n**Required scope:** `generations.read`\n\n**Notes:**\n- Cache the response for a few minutes — the catalog changes only when models are added or re-priced."
          },
          "response": []
        }
      ]
    },
    {
      "name": "Generations",
      "description": "Create and track generation jobs. Submission is asynchronous: a 201 means the job is queued, not finished. Poll the detail endpoint or subscribe to webhooks for terminal states.",
      "item": [
        {
          "name": "Create a generation",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('generationId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);",
                  "if (json && json.id) console.log('Generation queued:', json.id);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              },
              {
                "key": "Idempotency-Key",
                "value": "fox-portrait-001",
                "description": "Optional. 8–128 chars of `[A-Za-z0-9._:-]`. Reusing a key in the same workspace returns 409 `idempotency_conflict` instead of creating a second job."
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"modelId\": \"{{modelId}}\",\n  \"params\": {\n    \"mode\": \"text_to_image\",\n    \"prompt\": \"a red fox in fresh snow, golden hour, 85mm photograph\",\n    \"aspectRatio\": \"16:9\",\n    \"seed\": 42\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/generations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations"
              ]
            },
            "description": "Create a generation\n\nSubmit a text, image, video, audio, transcription, or editing job. `workspaceId` and `modelId` are required; `params.mode` selects the parameter set and must be supported by the model. Send an `Idempotency-Key` header to make retries safe.\n\n**Required scope:** `generations.write`\n\n**Notes:**\n- The request holds a credit reservation at submit time and settles to the actual cost when the provider reports usage."
          },
          "response": []
        },
        {
          "name": "Create up to 25 generations",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"items\": [\n    {\n      \"modelId\": \"{{modelId}}\",\n      \"params\": {\n        \"mode\": \"text_to_image\",\n        \"prompt\": \"a red fox in snow\"\n      }\n    },\n    {\n      \"modelId\": \"{{modelId}}\",\n      \"params\": {\n        \"mode\": \"text_to_image\",\n        \"prompt\": \"a snowy owl at dusk\"\n      }\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/generations/batch",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations",
                "batch"
              ]
            },
            "description": "Create up to 25 generations\n\nRuns the single-generation path once per item and returns per-item outcomes. Items are independent: one bad item does not roll back the others.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "List generations",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/generations?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                },
                {
                  "key": "perPage",
                  "value": "",
                  "description": "Page size.",
                  "disabled": true
                },
                {
                  "key": "mode",
                  "value": "",
                  "description": "Filter by generation mode.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by status (`queued`, `running`, `succeeded`, …).",
                  "disabled": true
                },
                {
                  "key": "modelId",
                  "value": "",
                  "description": "Filter by model.",
                  "disabled": true
                },
                {
                  "key": "projectId",
                  "value": "",
                  "description": "Filter by project.",
                  "disabled": true
                },
                {
                  "key": "createdById",
                  "value": "",
                  "description": "Filter by the member the job is attributed to.",
                  "disabled": true
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Created after.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "Created before.",
                  "disabled": true
                }
              ]
            },
            "description": "List generations\n\nPaginated generation history for a workspace, newest first. Filter by mode, status, model, project, or attributed member.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve a generation",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/generations/{{generationId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations",
                "{{generationId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace the job belongs to."
                }
              ]
            },
            "description": "Retrieve a generation\n\nCurrent state of a job plus its full event timeline (`queued` → `reserved` → `submitted` → `running` → terminal). Poll this until `status` is terminal. Use `/raw` to fetch output assets in the same call.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve a generation with outputs",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/generations/{{generationId}}/raw?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations",
                "{{generationId}}",
                "raw"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace the job belongs to."
                }
              ]
            },
            "description": "Retrieve a generation with outputs\n\nEverything on the detail endpoint plus the generated assets and the provider request/response trace. Best endpoint for a worker that needs the finished file.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Cancel a generation",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Prompt was wrong\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/generations/{{generationId}}/cancel?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations",
                "{{generationId}}",
                "cancel"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace the job belongs to."
                }
              ]
            },
            "description": "Cancel a generation\n\nRequests cancellation for a job in `queued`, `reserved`, `submitted`, or `running`. Returns `cancel_requested`; the worker moves it to `cancelled` and releases the credit reservation.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Open the checkout for a direct-payment job",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"provider\": \"creem\",\n  \"tosAccepted\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/generations/{{generationId}}/payment",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations",
                "{{generationId}}",
                "payment"
              ]
            },
            "description": "Open the checkout for a direct-payment job\n\nFor a job created with `paymentMode: \"direct\"`, creates or resumes the one-time checkout and returns the hosted checkout URL.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Platform generation pause status",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/generations/emergency-stop",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "generations",
                "emergency-stop"
              ]
            },
            "description": "Platform generation pause status\n\nWhether generation is paused platform-wide by an operator. Automation should check this before submitting large batches.\n\n**Required scope:** `all`"
          },
          "response": []
        },
        {
          "name": "Write a voiceover script",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"brief\": \"A 30-second product intro for an AI image generator\",\n  \"tone\": \"confident\",\n  \"audience\": \"small business owners\",\n  \"durationSeconds\": 30\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/speech/script",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "speech",
                "script"
              ]
            },
            "description": "Write a voiceover script\n\nTurns a short brief into a spoken-word script sized to a target duration. Requires a paid plan. Uses the platform enhancer model and is metered separately.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Write song lyrics",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"idea\": \"a night drive through neon-lit streets\",\n  \"vocal\": \"female\",\n  \"genre\": \"synthwave\",\n  \"mood\": \"nostalgic\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/music/lyrics",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "music",
                "lyrics"
              ]
            },
            "description": "Write song lyrics\n\nWrites lyrics for a free.music track from an idea, genre, mood, and vocal style. Requires a paid plan. Instrumental tracks have no lyrics and return a validation error.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Files & assets",
      "description": "Two ways to feed media into a generation: upload it (private, stored on the platform) or pass a direct http(s)/base64 URL. Uploads use presigned PUT URLs so file bytes never touch the API.",
      "item": [
        {
          "name": "Request a presigned upload URL",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('assetId', json.id);",
                  "if (json && json.assetId) pm.collectionVariables.set('assetId', json.assetId);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"mimeType\": \"image/png\",\n  \"sizeBytes\": 1048576,\n  \"filename\": \"fox.png\",\n  \"purpose\": \"upload\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/files/upload-url",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "files",
                "upload-url"
              ]
            },
            "description": "Request a presigned upload URL\n\nCreates a pending asset and returns a presigned URL. PUT the raw file bytes to `uploadUrl`, then call `POST /v1/files/upload-complete` with the returned `assetId`.\n\n**Required scope:** `files.write`\n\n**Notes:**\n- The presigned URL is short-lived. Upload immediately and never log it — it grants write access to that object key."
          },
          "response": []
        },
        {
          "name": "Finalize an upload",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"assetId\": \"{{assetId}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/files/upload-complete",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "files",
                "upload-complete"
              ]
            },
            "description": "Finalize an upload\n\nVerifies the object exists in storage, marks the asset `ready`, and returns the asset record. Pass the asset id in `inputs.imageAssetIds` / `videoAssetIds` / `audioAssetIds` on the generation.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "List assets",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/assets?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "kind",
                  "value": "",
                  "description": "Comma-separated kinds, e.g. `generated,input`.",
                  "disabled": true
                },
                {
                  "key": "mediaType",
                  "value": "",
                  "description": "`image`, `video`, or `audio`.",
                  "disabled": true
                },
                {
                  "key": "favorite",
                  "value": "",
                  "description": "Only favorited assets.",
                  "disabled": true
                },
                {
                  "key": "projectId",
                  "value": "",
                  "description": "Filter by project.",
                  "disabled": true
                },
                {
                  "key": "sourceGenerationId",
                  "value": "",
                  "description": "Outputs of a specific generation.",
                  "disabled": true
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Search filenames, MIME types, and model names.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                },
                {
                  "key": "perPage",
                  "value": "",
                  "description": "Page size.",
                  "disabled": true
                }
              ]
            },
            "description": "List assets\n\nWorkspace asset library, newest first. Filter by kind, media type, favorite, project, or the generation that produced the asset.\n\n**Required scope:** `assets.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve an asset",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/assets/{{assetId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "{{assetId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace the asset belongs to."
                }
              ]
            },
            "description": "Retrieve an asset\n\nMetadata for one asset. Use `/download` to get a short-lived file URL.\n\n**Required scope:** `assets.read`"
          },
          "response": []
        },
        {
          "name": "Get a download URL",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/assets/{{assetId}}/download?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "{{assetId}}",
                "download"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace the asset belongs to."
                },
                {
                  "key": "disposition",
                  "value": "",
                  "description": "Set to `attachment` to force a download filename.",
                  "disabled": true
                }
              ]
            },
            "description": "Get a download URL\n\nReturns a short-lived presigned URL for the asset bytes. The URL is time-limited — request a fresh one instead of caching it.\n\n**Required scope:** `assets.read`"
          },
          "response": []
        },
        {
          "name": "Update asset metadata",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"favorite\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/assets/{{assetId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "{{assetId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace the asset belongs to."
                }
              ]
            },
            "description": "Update asset metadata\n\nRename an asset, mark it favorite, or move it to a project.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "Delete an asset",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/assets/{{assetId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "{{assetId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace the asset belongs to."
                }
              ]
            },
            "description": "Delete an asset\n\nSoft-deletes the asset. Storage is reclaimed asynchronously; the asset stops appearing in lists immediately.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "Delete assets in bulk",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"assetIds\": [\n    \"{{assetId}}\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/assets/bulk-delete",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "bulk-delete"
              ]
            },
            "description": "Delete assets in bulk\n\nSoft-delete up to 100 assets in one request.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "Favorite assets in bulk",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"assetIds\": [\n    \"{{assetId}}\"\n  ],\n  \"favorite\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/assets/bulk-favorite",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "bulk-favorite"
              ]
            },
            "description": "Favorite assets in bulk\n\nSet the favorite flag on up to 100 assets.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "Move assets to a project",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"assetIds\": [\n    \"{{assetId}}\"\n  ],\n  \"projectId\": \"00000000-0000-4000-8000-000000000020\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/assets/bulk-project",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "bulk-project"
              ]
            },
            "description": "Move assets to a project\n\nAssign up to 100 assets to a project, or clear the project with `projectId: null`.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "Resolve download URLs in bulk",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"assetIds\": [\n    \"{{assetId}}\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/assets/bulk-download",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "assets",
                "bulk-download"
              ]
            },
            "description": "Resolve download URLs in bulk\n\nReturns one short-lived presigned URL per asset so a client can download a selection without N round-trips. The manifest omits ids the caller cannot access.\n\n**Required scope:** `assets.read`"
          },
          "response": []
        },
        {
          "name": "Workspace storage usage",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workspaces/{{workspaceId}}/storage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workspaces",
                "{{workspaceId}}",
                "storage"
              ]
            },
            "description": "Workspace storage usage\n\nBytes used, quota, and a per-media-type breakdown.\n\n**Required scope:** `usage.read`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Usage & credits",
      "description": "Report on consumption and credit balances. Usage records are written when a generation settles, so totals lag terminal states by seconds.",
      "item": [
        {
          "name": "Usage summary",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/usage?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "usage"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to report on."
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Start of the window.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "End of the window.",
                  "disabled": true
                }
              ]
            },
            "description": "Usage summary\n\nCredits, provider cost, generation count, and output bytes for a workspace and date range.\n\n**Required scope:** `usage.read`"
          },
          "response": []
        },
        {
          "name": "Usage breakdown",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/usage/breakdown?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "usage",
                "breakdown"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to report on."
                },
                {
                  "key": "from",
                  "value": "",
                  "description": "Start of the window.",
                  "disabled": true
                },
                {
                  "key": "to",
                  "value": "",
                  "description": "End of the window.",
                  "disabled": true
                },
                {
                  "key": "days",
                  "value": "",
                  "description": "Length of the daily series (max 365).",
                  "disabled": true
                }
              ]
            },
            "description": "Usage breakdown\n\nPer-model and per-day usage breakdown for charts and internal cost reporting.\n\n**Required scope:** `usage.read`"
          },
          "response": []
        },
        {
          "name": "Credit balance and ledger",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workspaces/{{workspaceId}}/credits",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workspaces",
                "{{workspaceId}}",
                "credits"
              ],
              "query": [
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "Page size (max 100).",
                  "disabled": true
                },
                {
                  "key": "type",
                  "value": "",
                  "description": "Filter by ledger entry type.",
                  "disabled": true
                },
                {
                  "key": "sort",
                  "value": "",
                  "description": "`newest` or `oldest`.",
                  "disabled": true
                }
              ]
            },
            "description": "Credit balance and ledger\n\nAvailable credits plus the paginated credit ledger (grants, reservations, settlements, refunds).\n\n**Required scope:** `usage.read`"
          },
          "response": []
        },
        {
          "name": "List credit top-ups",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/credits/top-ups?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "credits",
                "top-ups"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by order status.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List credit top-ups\n\nPaginated credit top-up orders with status and date filters.\n\n**Required scope:** `usage.read`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Wallet",
      "description": "Pay-as-you-go wallet. Deposit once, then generate at live model prices. Top-ups require a dashboard session; reads and threshold updates work with an API key.",
      "item": [
        {
          "name": "Wallet balance",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/wallet?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "wallet"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                }
              ]
            },
            "description": "Wallet balance\n\nBalance, deposit totals, minimum deposit, status, and the next token expiry.\n\n**Required scope:** `wallet.read`"
          },
          "response": []
        },
        {
          "name": "Update wallet settings",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"lowBalanceThresholdUsd\": 10\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/wallet?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "wallet"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to update."
                }
              ]
            },
            "description": "Update wallet settings\n\nSet the low-balance notification threshold. Requires the billing role.\n\n**Required scope:** `wallet.write`"
          },
          "response": []
        },
        {
          "name": "Wallet transactions",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/wallet/transactions?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "wallet",
                "transactions"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "Maximum transactions to return (max 500).",
                  "disabled": true
                }
              ]
            },
            "description": "Wallet transactions\n\nCharges, refunds, and adjustments against the wallet balance.\n\n**Required scope:** `wallet.read`"
          },
          "response": []
        },
        {
          "name": "Deposit history",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/wallet/deposits?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "wallet",
                "deposits"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "Maximum deposits to return (max 500).",
                  "disabled": true
                }
              ]
            },
            "description": "Deposit history\n\nCompleted and pending wallet deposits with their provider references.\n\n**Required scope:** `wallet.read`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Webhooks",
      "description": "Subscribe to terminal generation and workflow events. Deliveries are signed with HMAC-SHA256 in the `X-FreeInd-Signature` header and retried with backoff.",
      "item": [
        {
          "name": "List webhook endpoints",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                }
              ]
            },
            "description": "List webhook endpoints\n\nConfigured delivery endpoints for a workspace. Secrets are never returned after creation.\n\n**Required scope:** `webhooks.manage`"
          },
          "response": []
        },
        {
          "name": "Create a webhook endpoint",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"name\": \"Production\",\n  \"url\": \"https://example.com/hooks/freeind\",\n  \"eventTypes\": [\n    \"generation.completed\",\n    \"generation.failed\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to register against."
                }
              ]
            },
            "description": "Create a webhook endpoint\n\nRegisters an HTTPS endpoint and returns the signing secret exactly once. Store it server-side; verify every delivery with HMAC-SHA256 over `<timestamp>.<raw body>`.\n\n**Required scope:** `webhooks.manage`\n\n**Notes:**\n- Signature header: `t=<unix>,v1=<hex>`. The signed payload is `t + \".\" + rawBody`. Reject deliveries older than 5 minutes."
          },
          "response": []
        },
        {
          "name": "Update a webhook endpoint",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"disabled\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/{{webhookId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                "{{webhookId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Update a webhook endpoint\n\nChange the name, URL, event types, or enable/disable the endpoint.\n\n**Required scope:** `webhooks.manage`"
          },
          "response": []
        },
        {
          "name": "Delete a webhook endpoint",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/{{webhookId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                "{{webhookId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Delete a webhook endpoint\n\nRemoves the endpoint. Existing delivery history is retained.\n\n**Required scope:** `webhooks.manage`"
          },
          "response": []
        },
        {
          "name": "Webhook delivery history",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/webhooks/{{webhookId}}/deliveries?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "webhooks",
                "{{webhookId}}",
                "deliveries"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Webhook delivery history\n\nDelivery attempts with status codes, errors, and retry timing — the fastest way to debug a missed event.\n\n**Required scope:** `webhooks.manage`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.flow · Workflows",
      "description": "Build, activate, and run multi-step pipelines. A workflow is a DAG of generation nodes with typed flow inputs; a run walks the nodes in order and passes outputs downstream. Pipelines can be one-shot or reusable templates.",
      "item": [
        {
          "name": "List workflows",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workflows?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "`draft`, `active`, or `archived`.",
                  "disabled": true
                },
                {
                  "key": "tag",
                  "value": "",
                  "description": "Filter by a workflow tag.",
                  "disabled": true
                },
                {
                  "key": "search",
                  "value": "",
                  "description": "Match name or description.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                },
                {
                  "key": "perPage",
                  "value": "",
                  "description": "Page size.",
                  "disabled": true
                }
              ]
            },
            "description": "List workflows\n\nNon-template workflows in a workspace, newest update first, with an estimated credit cost and step count per workflow.\n\n**Required scope:** `workflows.read`\n\n**Notes:**\n- free.flow must be enabled for the platform; otherwise the request fails with 403 forbidden."
          },
          "response": []
        },
        {
          "name": "Create a workflow",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('workflowId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"name\": \"Product hero\",\n  \"definition\": {\n    \"version\": 1,\n    \"flowInputs\": [\n      {\n        \"id\": \"subject\",\n        \"name\": \"Subject\",\n        \"mediaType\": \"text\",\n        \"required\": true,\n        \"primary\": true\n      }\n    ],\n    \"nodes\": [\n      {\n        \"id\": \"hero\",\n        \"title\": \"Hero image\",\n        \"modelId\": \"{{modelId}}\",\n        \"mode\": \"text_to_image\",\n        \"params\": {\n          \"mode\": \"text_to_image\",\n          \"prompt\": \"{{subject}}, studio lighting, 85mm photograph\"\n        }\n      }\n    ]\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/workflows",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows"
              ]
            },
            "description": "Create a workflow\n\nCreate from a `definition` (flow inputs + nodes) or adopt a `templateId`. Definitions are validated against the workspace plan, model modes, and token references before saving.\n\n**Required scope:** `workflows.write`\n\n**Notes:**\n- Node params may reference `{{flowInputId}}` and `{{nodeId}}` tokens. They are resolved in one pass at run time."
          },
          "response": []
        },
        {
          "name": "Retrieve a workflow",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/{{workflowId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "{{workflowId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve a workflow\n\nFull definition, status, tags, and reference-template metadata when present.\n\n**Required scope:** `workflows.read`"
          },
          "response": []
        },
        {
          "name": "Update a workflow",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"status\": \"active\",\n  \"tags\": [\n    \"product\",\n    \"hero\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/{{workflowId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "{{workflowId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Update a workflow\n\nRename, re-describe, retag, archive, or replace the definition. Updating a definition re-validates every node.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Delete a workflow",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/{{workflowId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "{{workflowId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Delete a workflow\n\nDeletes the workflow. Runs and their steps are retained for history.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "List workflow templates",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/templates",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "templates"
              ],
              "query": [
                {
                  "key": "scope",
                  "value": "",
                  "description": "`builtin` (default), `workspace`, or `all`.",
                  "disabled": true
                },
                {
                  "key": "workspaceId",
                  "value": "",
                  "description": "Required for `workspace` and `all` scopes.",
                  "disabled": true
                },
                {
                  "key": "tag",
                  "value": "",
                  "description": "Filter by tag.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                },
                {
                  "key": "perPage",
                  "value": "",
                  "description": "Page size.",
                  "disabled": true
                }
              ]
            },
            "description": "List workflow templates\n\nBuilt-in templates, the workspace’s own templates, or both. Templates marked as reference analyses include their analysis status.\n\n**Required scope:** `workflows.read`\n\n**Notes:**\n- Adopt a template with `POST /v1/workflows` and `{ \"templateId\": \"…\" }`."
          },
          "response": []
        },
        {
          "name": "Duplicate a workflow",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/{{workflowId}}/duplicate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "{{workflowId}}",
                "duplicate"
              ]
            },
            "description": "Duplicate a workflow\n\nCreates a copy in the same or another workspace the caller can access.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Activate a reference template",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/{{workflowId}}/activate?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "{{workflowId}}",
                "activate"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Activate a reference template\n\nPublishes a reference-analysis template once its analysis is ready and its `subject` flow input is valid. Generated workflows from `POST /v1/workflows` start as drafts; use `PATCH` for ordinary ones.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Start a workflow run",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('runId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"input\": {\n    \"subject\": {\n      \"text\": \"a red fox in fresh snow\"\n    }\n  },\n  \"paymentMode\": \"credits\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/{{workflowId}}/runs",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "{{workflowId}}",
                "runs"
              ]
            },
            "description": "Start a workflow run\n\nStarts the pipeline with flow-input values. Each run reserves credits up front and advances step by step; poll `GET /v1/runs/{runId}` until it reaches a terminal status.\n\n**Required scope:** `workflows.write`\n\n**Notes:**\n- A workflow must not be archived. Run statuses: queued, running, succeeded, failed, cancelled, paused."
          },
          "response": []
        },
        {
          "name": "List runs for a workflow",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/workflows/{{workflowId}}/runs?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "workflows",
                "{{workflowId}}",
                "runs"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by run status.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List runs for a workflow\n\nRecent runs with per-run step progress.\n\n**Required scope:** `workflows.read`"
          },
          "response": []
        },
        {
          "name": "List all workflow runs",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/runs?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "workflowId",
                  "value": "",
                  "description": "Filter by workflow.",
                  "disabled": true
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by run status.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List all workflow runs\n\nWorkspace-wide run history, optionally filtered by workflow or status.\n\n**Required scope:** `workflows.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve a run",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/runs/{{runId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs",
                "{{runId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve a run\n\nRun state plus every step (node id, status, generation id, credits, timing). This is the polling endpoint for a workflow run.\n\n**Required scope:** `workflows.read`"
          },
          "response": []
        },
        {
          "name": "Cancel a run",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"Wrong input\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/runs/{{runId}}/cancel?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs",
                "{{runId}}",
                "cancel"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Cancel a run\n\nCancels the active step and stops the pipeline. Already-finished steps are kept.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Pause a run",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/runs/{{runId}}/pause?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs",
                "{{runId}}",
                "pause"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Pause a run\n\nLets the current step finish, then holds the run before the next step.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Resume a paused run",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/runs/{{runId}}/resume?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs",
                "{{runId}}",
                "resume"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Resume a paused run\n\nContinues a paused run from the next step.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Retry a finished run",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"paymentMode\": \"credits\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/runs/{{runId}}/retry?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs",
                "{{runId}}",
                "retry"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retry a finished run\n\nStarts a new run from the failed step, reusing earlier successful steps. The new run carries `retryOfRunId`.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Regenerate one step",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/runs/{{runId}}/steps/{{nodeId}}/regenerate?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs",
                "{{runId}}",
                "steps",
                "{{nodeId}}",
                "regenerate"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Regenerate one step\n\nForks the run at a node: that node and everything downstream re-run, earlier outputs are reused. Useful for iterating on one shot without paying for the whole pipeline.\n\n**Required scope:** `workflows.write`\n\n**Notes:**\n- The parent run must be in a terminal state (succeeded, failed, or cancelled)."
          },
          "response": []
        },
        {
          "name": "Open a checkout for a direct-payment run",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"provider\": \"creem\",\n  \"tosAccepted\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/runs/{{runId}}/payment?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "runs",
                "{{runId}}",
                "payment"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Open a checkout for a direct-payment run\n\nCreates or resumes the hosted checkout for a run created with `paymentMode: \"direct\"`.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.flow · Reference templates",
      "description": "Turn a reference image or video into a reusable workflow: analyze its look, structure, and audio feel, then adopt the generated template. Analyses are metered on vision tokens and cached by asset bytes.",
      "item": [
        {
          "name": "Quote a reference analysis",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"assetId\": \"{{assetId}}\",\n  \"options\": {\n    \"keepLook\": true,\n    \"keepStructure\": true,\n    \"maxShots\": 3\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/reference/quote",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "reference",
                "quote"
              ]
            },
            "description": "Quote a reference analysis\n\nEstimated and maximum credits for analyzing an asset. Returns `cached: true` (and the existing template id) when that exact asset was analyzed before.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Start a reference analysis",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"assetId\": \"{{assetId}}\",\n  \"options\": {\n    \"keepLook\": true,\n    \"keepStructure\": true,\n    \"maxShots\": 3\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/reference/analyses",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "reference",
                "analyses"
              ]
            },
            "description": "Start a reference analysis\n\nQueues the analysis and returns the workflow id it is building. Re-analyzing the same asset is free; an in-flight analysis returns 202 with the same id.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Retrieve a reference analysis",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/reference/analyses/{{workflowId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "reference",
                "analyses",
                "{{workflowId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve a reference analysis\n\nAnalysis status plus the derived template metadata (spec, slots, shots). Poll until `status` is `ready` before adopting the template.\n\n**Required scope:** `workflows.read`"
          },
          "response": []
        },
        {
          "name": "Cancel an analysis",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/reference/analyses/{{workflowId}}/cancel?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "reference",
                "analyses",
                "{{workflowId}}",
                "cancel"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Cancel an analysis\n\nCancels a queued or running analysis and releases its credit reservation.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        },
        {
          "name": "Retry an analysis",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/reference/analyses/{{workflowId}}/retry",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "reference",
                "analyses",
                "{{workflowId}}",
                "retry"
              ]
            },
            "description": "Retry an analysis\n\nRe-queues a failed analysis using the stored options.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.slides · Presentations",
      "description": "Turn a brief into a designed deck: the planner writes an outline and one image generation runs per slide. Export to PPTX or PDF when every slide is ready.",
      "item": [
        {
          "name": "Create a slide deck",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('deckId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"brief\": \"Q4 product launch: what shipped, lessons learned, next bets\",\n  \"slideCount\": 8,\n  \"style\": \"Minimal, editorial, warm neutrals\",\n  \"aspectRatio\": \"16:9\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/slides/decks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "slides",
                "decks"
              ]
            },
            "description": "Create a slide deck\n\nGenerates the outline from a brief, then queues one text-to-image generation per slide. Requires a paid plan and at least one image model available to the workspace.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "List slide decks",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/slides/decks?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "slides",
                "decks"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List slide decks\n\nDecks for a workspace, newest first, each with per-slide generation state.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve a slide deck",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/slides/decks/{{deckId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "slides",
                "decks",
                "{{deckId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve a slide deck\n\nDeck outline, slide statuses, asset ids, and export availability. Poll until every slide finishes.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Edit deck text",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"slides\": [\n    {\n      \"index\": 0,\n      \"title\": \"What shipped in Q4\",\n      \"bullets\": [\n        \"Faster generation\",\n        \"New tools\"\n      ]\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/slides/decks/{{deckId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "slides",
                "decks",
                "{{deckId}}"
              ]
            },
            "description": "Edit deck text\n\nRename the deck or edit slide titles and bullets. Background visuals are unchanged.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Export a deck",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/slides/decks/{{deckId}}/export",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "slides",
                "decks",
                "{{deckId}}",
                "export"
              ]
            },
            "description": "Export a deck\n\nRenders every slide and writes both a raster PDF and an editable PPTX. Every slide must have succeeded.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Download an exported deck",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/slides/decks/{{deckId}}/download/{{format}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "slides",
                "decks",
                "{{deckId}}",
                "download",
                "{{format}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Download an exported deck\n\nShort-lived URL for the PPTX or PDF. Export the deck first.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.podcast · Episodes",
      "description": "Write a multi-speaker script, render each turn with a different voice, and mix the episode with an optional music bed and outro. Rendering runs on free.flow under the hood.",
      "item": [
        {
          "name": "Write a podcast script",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"brief\": \"Why small teams are shipping faster with AI tools\",\n  \"speakers\": [\n    {\n      \"id\": \"host\",\n      \"name\": \"Maya\",\n      \"persona\": \"curious host\"\n    },\n    {\n      \"id\": \"guest\",\n      \"name\": \"Dev\",\n      \"persona\": \"pragmatic engineer\"\n    }\n  ],\n  \"tone\": \"curious\",\n  \"durationSeconds\": 600\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/podcast/script",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "podcast",
                "script"
              ]
            },
            "description": "Write a podcast script\n\nTurns a brief and a speaker roster into a timed dialogue script. Two to four speakers; each speaker can carry a persona to steer the writing.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Render a podcast episode",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('runId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"title\": \"Small Teams, Big Ships\",\n  \"speakers\": [\n    {\n      \"id\": \"host\",\n      \"name\": \"Maya\",\n      \"voice\": \"alloy\",\n      \"speed\": 1\n    },\n    {\n      \"id\": \"guest\",\n      \"name\": \"Dev\",\n      \"voice\": \"ash\",\n      \"speed\": 1\n    }\n  ],\n  \"segments\": [\n    {\n      \"speakerId\": \"host\",\n      \"text\": \"Welcome back to the show.\"\n    },\n    {\n      \"speakerId\": \"guest\",\n      \"text\": \"Thanks for having me.\"\n    }\n  ],\n  \"concat\": {\n    \"gapMs\": 300,\n    \"outputFormat\": \"mp3\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/podcast/episodes",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "podcast",
                "episodes"
              ]
            },
            "description": "Render a podcast episode\n\nRenders a (possibly edited) script: one TTS generation per turn plus an audio_concat mix. Optional music bed and outro, with ducking.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Episode transcript (SRT)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/podcast/runs/{{runId}}/transcript?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "podcast",
                "runs",
                "{{runId}}",
                "transcript"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Episode transcript (SRT)\n\nSRT captions timed by each rendered turn’s real audio duration.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Re-render one line",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"nodeId\": \"seg_2\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/podcast/runs/{{runId}}/retake",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "podcast",
                "runs",
                "{{runId}}",
                "retake"
              ]
            },
            "description": "Re-render one line\n\nRegenerates a single `seg_<n>` turn and rebuilds the mix, without paying for the other lines.\n\n**Required scope:** `workflows.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.audiobook · Narration",
      "description": "Turn long text into a single narrated audiobook. The text is chunked, each chunk is rendered with the chosen voice model, and the final mix is assembled on demand.",
      "item": [
        {
          "name": "Create an audiobook",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('audiobookId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"title\": \"The Long Winter\",\n  \"text\": \"Chapter one. The snow had not stopped for eleven days…\",\n  \"format\": \"mp3\",\n  \"gapMs\": 400\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/audiobooks",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "audiobooks"
              ]
            },
            "description": "Create an audiobook\n\nChunks the text, queues one TTS generation per chunk, and returns the job with per-chunk progress.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "List audiobooks",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/audiobooks?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "audiobooks"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List audiobooks\n\nJobs for a workspace, newest first, with chunk progress.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve an audiobook",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/audiobooks/{{jobId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "audiobooks",
                "{{jobId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve an audiobook\n\nJob state, per-chunk progress, and the final asset id once complete.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Assemble the final mix",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/audiobooks/{{jobId}}/assemble",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "audiobooks",
                "{{jobId}}",
                "assemble"
              ]
            },
            "description": "Assemble the final mix\n\nConcatenates every rendered chunk in order. Idempotent while a mix is running or complete; retry after a failed mix.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Download the audiobook",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/audiobooks/{{jobId}}/download?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "audiobooks",
                "{{jobId}}",
                "download"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Download the audiobook\n\nShort-lived URL for the finished audio file.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Audiobook transcript (SRT)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/audiobooks/{{jobId}}/transcript?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "audiobooks",
                "{{jobId}}",
                "transcript"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Audiobook transcript (SRT)\n\nSRT captions timed by each chunk’s real audio duration.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.speech · Voices",
      "description": "Clone a voice from uploaded samples, then pass the returned `providerVoiceId` as the `voice` param on any text-to-audio generation. Cloning needs a paid plan and explicit consent.",
      "item": [
        {
          "name": "List cloned voices",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/voices?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "voices"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by profile status.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List cloned voices\n\nVoice profiles for a workspace with status, labels, and preview URL.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Clone a voice",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('voiceProfileId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"name\": \"Narrator — warm\",\n  \"sampleAssetIds\": [\n    \"{{assetId}}\"\n  ],\n  \"labels\": {\n    \"language\": \"en\"\n  },\n  \"consent\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/voices",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "voices"
              ]
            },
            "description": "Clone a voice\n\nSubmits 1–5 sample assets to the cloning provider and stores the resulting profile. Requires `consent: true`.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Re-verify a voice",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/voices/{{voiceProfileId}}/refresh",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "voices",
                "{{voiceProfileId}}",
                "refresh"
              ]
            },
            "description": "Re-verify a voice\n\nRe-checks the provider-side voice and updates the stored status/preview.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Delete a voice",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/voices/{{voiceProfileId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "voices",
                "{{voiceProfileId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Delete a voice\n\nRemoves the profile and the provider-side voice where supported.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.studio · Storyboard to video",
      "description": "The ad/studio pipeline: a brief becomes a storyboard of shots, the storyboard runs as a workflow, and captions come back as SRT. Effects and transitions are catalogued for the UI.",
      "item": [
        {
          "name": "Effects and transitions catalog",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "auth": {
              "type": "noauth"
            },
            "url": {
              "raw": "{{baseUrl}}/v1/studio/effects",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "studio",
                "effects"
              ]
            },
            "description": "Effects and transitions catalog\n\nAvailable video transitions, video effects, audio effects, and presets, with auto-generated controls. Public — no auth.\n\n**Auth:** none (public endpoint)."
          },
          "response": []
        },
        {
          "name": "Create a studio plan",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('planId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"brief\": {\n    \"prompt\": \"A 20-second launch ad for a matte black espresso machine\",\n    \"durationSeconds\": 20,\n    \"aspectRatio\": \"16:9\",\n    \"size\": \"wide\",\n    \"quality\": \"standard\",\n    \"captions\": true\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/studio/plans",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "studio",
                "plans"
              ]
            },
            "description": "Create a studio plan\n\nTurns a brief (prompt, optional media, duration, aspect ratio, quality) into a storyboard and a persisted workflow definition. Nothing renders until you run the plan.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "List studio plans",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/studio/plans?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "studio",
                "plans"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "Filter by plan status.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List studio plans\n\nPlans for a workspace with status and credit estimate.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve a studio plan",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/studio/plans/{{planId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "studio",
                "plans",
                "{{planId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve a studio plan\n\nStoryboard, shots, audio, assembly settings, and estimated credits.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Update a studio plan",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PUT",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"plan\": {\n    \"version\": 1\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/studio/plans/{{planId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "studio",
                "plans",
                "{{planId}}"
              ]
            },
            "description": "Update a studio plan\n\nSaves an edited storyboard and rebuilds its workflow definition.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Render a studio plan",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"paymentMode\": \"credits\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/studio/plans/{{planId}}/run",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "studio",
                "plans",
                "{{planId}}",
                "run"
              ]
            },
            "description": "Render a studio plan\n\nStarts the storyboard workflow and returns the run. Poll the run like any free.flow run.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Plan captions (SRT)",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/studio/plans/{{planId}}/srt?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "studio",
                "plans",
                "{{planId}}",
                "srt"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Plan captions (SRT)\n\nThe same caption timeline the render burns in, exported as SRT.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.boards · Moodboards",
      "description": "Collect assets into ordered boards for review and iteration. Items reference assets; resolve previews with `GET /v1/assets?assetIds=…`. Paid plans only.",
      "item": [
        {
          "name": "List boards",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/boards?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "status",
                  "value": "",
                  "description": "`active` or `archived`.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List boards\n\nActive or archived boards with item counts.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve a board",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/boards/{{boardId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards",
                "{{boardId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve a board\n\nBoard metadata plus its ordered items.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Create a board",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('boardId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"name\": \"Winter launch\",\n  \"description\": \"Direction options for the campaign\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/boards",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards"
              ]
            },
            "description": "Create a board\n\nCreates an empty board. Requires a paid plan.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Rename or archive a board",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"status\": \"archived\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/boards/{{boardId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards",
                "{{boardId}}"
              ]
            },
            "description": "Rename or archive a board\n\nUpdates name, description, or status.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Delete a board",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/boards/{{boardId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards",
                "{{boardId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Delete a board\n\nDeletes the board and its items. Assets are untouched.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Add an asset to a board",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"assetId\": \"{{assetId}}\",\n  \"note\": \"Hero direction\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/boards/{{boardId}}/items",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards",
                "{{boardId}}",
                "items"
              ]
            },
            "description": "Add an asset to a board\n\nAppends an asset with an optional note. Boards hold up to 60 items.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Update an item note",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"note\": \"Approved\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/boards/{{boardId}}/items/{{itemId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards",
                "{{boardId}}",
                "items",
                "{{itemId}}"
              ]
            },
            "description": "Update an item note\n\nSets or clears the item note.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Remove an item",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/boards/{{boardId}}/items/{{itemId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards",
                "{{boardId}}",
                "items",
                "{{itemId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Remove an item\n\nRemoves the item from the board. The asset is untouched.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Reorder board items",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"itemIds\": [\n    \"{{itemId}}\"\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/boards/{{boardId}}/order",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "boards",
                "{{boardId}}",
                "order"
              ]
            },
            "description": "Reorder board items\n\nFull replacement order: every position is rewritten in one pass.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Presets",
      "description": "Saved generator setups: a mode, an optional model, and the raw form params. Re-apply a preset by sending its params to `POST /v1/generations`.",
      "item": [
        {
          "name": "List presets",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/presets?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "presets"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "mode",
                  "value": "",
                  "description": "Filter by generation mode.",
                  "disabled": true
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List presets\n\nPresets for a workspace, optionally filtered by mode.\n\n**Required scope:** `generations.read`"
          },
          "response": []
        },
        {
          "name": "Save a preset",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('presetId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"name\": \"Editorial portrait\",\n  \"mode\": \"text_to_image\",\n  \"params\": {\n    \"prompt\": \"editorial portrait, soft light\",\n    \"aspectRatio\": \"4:3\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/presets",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "presets"
              ]
            },
            "description": "Save a preset\n\nStores a named setup. `params` is the generator form state (max 64 keys).\n\n**Required scope:** `generations.write`"
          },
          "response": []
        },
        {
          "name": "Delete a preset",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/presets/{{presetId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "presets",
                "{{presetId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Delete a preset\n\nDeletes the saved setup.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "Projects",
      "description": "Group generations and assets into projects for the library. Filter generations and assets by `projectId` once assigned.",
      "item": [
        {
          "name": "List projects",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/projects?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "projects"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace to read."
                },
                {
                  "key": "page",
                  "value": "",
                  "description": "1-indexed page.",
                  "disabled": true
                }
              ]
            },
            "description": "List projects\n\nProjects for a workspace, newest first.\n\n**Required scope:** `assets.read`"
          },
          "response": []
        },
        {
          "name": "Retrieve a project",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/projects/{{projectId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "projects",
                "{{projectId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Retrieve a project\n\nProject metadata and cover asset.\n\n**Required scope:** `assets.read`"
          },
          "response": []
        },
        {
          "name": "Create a project",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.id) pm.collectionVariables.set('projectId', json.id);",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"name\": \"Winter campaign\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/projects",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "projects"
              ]
            },
            "description": "Create a project\n\nCreates a project container.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "Update a project",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"name\": \"Winter campaign 2027\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/projects/{{projectId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "projects",
                "{{projectId}}"
              ]
            },
            "description": "Update a project\n\nRename, re-describe, or archive a project.\n\n**Required scope:** `files.write`"
          },
          "response": []
        },
        {
          "name": "Delete a project",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "DELETE",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/projects/{{projectId}}?workspaceId={{workspaceId}}",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "projects",
                "{{projectId}}"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Owning workspace."
                }
              ]
            },
            "description": "Delete a project\n\nDeletes the project container. Generations and assets are kept and unfiled.\n\n**Required scope:** `files.write`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.chat · OpenAI-compatible",
      "description": "Send chat completions with an API key using the OpenAI wire format. Models and quota are exposed alongside, so SDKs can point at this base URL unchanged.",
      "item": [
        {
          "name": "Create a chat completion",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"model\": \"openai/gpt-4.1-mini\",\n  \"messages\": [\n    {\n      \"role\": \"user\",\n      \"content\": \"Write a 2-line product tagline for a coffee brand.\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/chat/completions",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "chat",
                "completions"
              ]
            },
            "description": "Create a chat completion\n\nOpenAI-compatible completions. Supports streaming (`stream: true`), tool calls, and attachments. `workspaceId` selects the paying workspace.\n\n**Required scope:** `all`"
          },
          "response": []
        },
        {
          "name": "List chat models",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/chat/models",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "chat",
                "models"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace context for plan filtering.",
                  "disabled": true
                }
              ]
            },
            "description": "List chat models\n\nOpenAI-style model list plus the current free chat model.\n\n**Required scope:** `all`"
          },
          "response": []
        },
        {
          "name": "Chat quota",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [],
            "url": {
              "raw": "{{baseUrl}}/v1/chat/usage",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "chat",
                "usage"
              ],
              "query": [
                {
                  "key": "workspaceId",
                  "value": "{{workspaceId}}",
                  "description": "Workspace context.",
                  "disabled": true
                }
              ]
            },
            "description": "Chat quota\n\nDaily message quota for session users; API keys report unlimited.\n\n**Required scope:** `all`"
          },
          "response": []
        }
      ]
    },
    {
      "name": "free.logo · Brand kit",
      "description": "Generate names, taglines, and a colour palette before rendering logo marks with an image model.",
      "item": [
        {
          "name": "Generate a brand kit",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test('Status code is 2xx', () => {",
                  "  pm.expect(pm.response.code).to.be.within(200, 299);",
                  "});",
                  "",
                  "const json = pm.response.json();",
                  "if (json && json.key) console.log('New API key (shown once):', json.key);"
                ]
              }
            }
          ],
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"workspaceId\": \"{{workspaceId}}\",\n  \"brandName\": \"Northwind\",\n  \"description\": \"Specialty coffee roasted in small batches\",\n  \"industry\": \"Food & beverage\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/v1/logo/brand-kit",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                "v1",
                "logo",
                "brand-kit"
              ]
            },
            "description": "Generate a brand kit\n\nReturns 3–5 name options, 3–5 taglines, and a 3–6 colour palette for a brand brief. Use the chosen name/palette as prompt context for logo image generations.\n\n**Required scope:** `generations.write`"
          },
          "response": []
        }
      ]
    }
  ]
}