# Action Items Source: https://docs.flowla.com/api/action-items Create and manage action items (Mutual Action Plan tasks). Supports room-wide, page-wide, and block-scoped listing with pagination. **Terminology:** the *action-plan block* is the container (created via `POST /api/v2/blocks` with `type: "action-plan"`). The individual tasks inside it are called **action items** and are managed via the endpoints on this page. ## Endpoints | Method | Path | Description | | -------- | --------------------------------------- | --------------------- | | `GET` | `/api/v2/action-items` | List action items | | `POST` | `/api/v2/action-items` | Create action items | | `PATCH` | `/api/v2/action-items/{action_item_id}` | Update an action item | | `DELETE` | `/api/v2/action-items/{action_item_id}` | Delete an action item | ## Action item fields | Field | Type | Notes | | ------------- | -------------- | ------------------------------------------------ | | `id` | string | | | `blockId` | string \| null | ID of the action-plan block this item belongs to | | `title` | string | **Required on create.** | | `description` | string | | | `status` | enum | `todo`, `in_progress`, `done`, `cancelled` | | `startDate` | string | ISO 8601 | | `dueDate` | string | ISO 8601 | | `internal` | boolean | Hidden from buyers when `true`. Default `false`. | | `assignees` | object\[] | `{ userId, email, name }` per assignee | | `completedAt` | string \| null | ISO 8601 | | `createdAt` | string | ISO 8601 | | `updatedAt` | string | ISO 8601 | *** ## List action items `GET /api/v2/action-items` Returns action items scoped to a room, page, or specific block. All scope parameters are optional, but at least one should be provided. If `blockId` is set, `pageId` **must** also be set (otherwise the API returns 400). ### Scoping | `roomId` | `pageId` | `blockId` | Result | | -------- | -------- | --------- | ---------------------------------- | | ✓ | — | — | All action items in the room | | — | ✓ | — | All action items on the page | | — | ✓ | ✓ | Action items in the specific block | | — | — | ✓ | **400 Bad Request** | ### Query parameters Room ID — returns all action items across the room. Page ID — returns all action items on the page. Action-plan block ID — returns items in that block. Requires `pageId`. Page number (default: 1). Results per page (default: 100, max: 1000). ### Response ```json theme={null} { "items": [ ... ], "totalRecords": 42, "totalPages": 1 } ``` ```bash cURL — room scope theme={null} curl "https://api.flowla.com/api/v2/action-items?roomId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```bash cURL — page scope theme={null} curl "https://api.flowla.com/api/v2/action-items?pageId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```bash cURL — block scope theme={null} curl "https://api.flowla.com/api/v2/action-items?pageId=&blockId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/action-items", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"roomId": ""}, ) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/action-items?roomId=", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); ``` *** ## Create action items `POST /api/v2/action-items` The page containing the action-plan block. The action-plan block to add action items to. Array of action item objects. ```json Example theme={null} { "pageId": "", "blockId": "", "items": [ { "title": "Review proposal", "description": "Check pricing and terms", "status": "in_progress", "startDate": "2026-05-28", "dueDate": "2026-06-01", "internal": false, "assignees": ["owner@example.com", "buyer@example.com"] }, { "title": "Schedule kickoff call", "status": "todo" } ] } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/action-items \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pageId": "", "blockId": "", "items": [ { "title": "Review proposal", "status": "in_progress", "dueDate": "2026-06-01" }, { "title": "Confirm legal sign-off", "internal": true } ] }' ``` ```python Python theme={null} requests.post( "https://api.flowla.com/api/v2/action-items", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={ "pageId": "", "blockId": "", "items": [ {"title": "Review proposal", "dueDate": "2026-06-01"}, {"title": "Confirm legal sign-off", "internal": True}, ], }, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/action-items", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ pageId: "", blockId: "", items: [ { title: "Review proposal", dueDate: "2026-06-01" }, { title: "Confirm legal sign-off", internal: true }, ], }), }); ``` *** ## Update an action item `PATCH /api/v2/action-items/{action_item_id}` All fields are optional. `assignees` **replaces** the full assignee list. Updated title. Updated description. New status. ISO 8601 start date. ISO 8601 due date. Whether hidden from buyers. Replaces the full assignee list. Pass an empty array to remove all. ```json Example theme={null} { "status": "done", "assignees": ["alex@ourcompany.com"] } ``` ```bash cURL theme={null} curl -X PATCH https://api.flowla.com/api/v2/action-items/ \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"status": "done"}' ``` ```python Python theme={null} requests.patch( "https://api.flowla.com/api/v2/action-items/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"status": "done"}, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/action-items/", { method: "PATCH", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json" }, body: JSON.stringify({ status: "done" }), }); ``` *** ## Delete an action item `DELETE /api/v2/action-items/{action_item_id}` ```bash cURL theme={null} curl -X DELETE https://api.flowla.com/api/v2/action-items/ \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} requests.delete( "https://api.flowla.com/api/v2/action-items/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/action-items/", { method: "DELETE", headers: { "x-flowla-api-key": "YOUR_API_KEY" }, }); ``` # Analytics Source: https://docs.flowla.com/api/analytics Retrieve rich engagement data for a room: progress, assignees, and per-section/step viewership. ## Endpoints | Method | Path | Description | | ------ | ----------------------------------- | ------------------ | | `GET` | `/api/v2/rooms/{room_id}/analytics` | Get room analytics | *** ## Get room analytics `GET /api/v2/rooms/{room_id}/analytics` Returns engagement data for the room: overall progress, the internal company, all assignees (internal and external), and a breakdown of viewership per section, step, and action. ```bash cURL theme={null} curl https://api.flowla.com/api/v2/rooms//analytics \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/rooms//analytics", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/rooms//analytics", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); const data = await res.json(); ``` ### Response fields Room title. Overall completion percentage (0–100). `{ type, name }` of the owning organization. Everyone on the room — internal team members and external contacts. `internal_organization` or `external_organization`. Assignee email. Full name. Job title. Present on internal assignees. `true` if this person owns the room. Present on external assignees. ISO 8601 timestamp. Present on external assignees. Total visits. Present on external assignees. Per-section analytics. Section ID. Section title. Whether the section is marked complete. Whether buyers can see this section. Page-level viewership. Each entry has `id`, `title`, `isVisibleToExternal`, and a `viewership` array with `durationInSeconds`, `timesViewed`, `engagements`, and the `user` who viewed it. Action-plan items with analytics. Each includes `id`, `title`, `status`, `description`, `internal`, `assignees`, `dueDate`, `isOverdue`, `isVisibleToExternal`, `actionType`, and `viewership`. ```json theme={null} { "title": "Flowla <> Acme", "progressPercentage": 14.29, "internalCompany": { "type": "internal", "name": "Flowla" }, "assignees": [ { "belongsTo": "internal_organization", "email": "jordan@flowla.com", "name": "Jordan Avery", "title": "Account Executive", "isRoomOwner": true }, { "belongsTo": "external_organization", "email": "morgan.lee@acme.com", "name": "Morgan Lee", "title": "VP of Operations", "isPrimaryContact": true, "lastSeen": "2026-05-05T14:30:44.260Z", "viewCount": 4 } ], "sections": [ { "id": "e6136fc8-0036-472c-886d-5f4089f22af0", "title": "Welcome", "isCompleted": false, "isVisibleToExternal": true, "steps": [ { "id": "14968206-ac51-4da1-9846-8b6b85a10edf", "title": "Introduction", "isVisibleToExternal": true, "viewership": [ { "user": { "belongsTo": "external_organization", "email": "morgan.lee@acme.com", "name": "Morgan Lee", "isPrimaryContact": true, "lastSeen": "2026-05-05T14:30:44.260Z", "viewCount": 4 }, "durationInSeconds": 144, "timesViewed": 1, "engagements": [ { "type": "TASK_COMPLETED", "createdAt": "2026-05-05T14:30:54.168Z" } ] } ] } ], "actions": [ { "id": "7e06cab8-4bf6-49ca-a1c6-f49893ae28c2", "title": "Sign mutual NDA", "status": "in_progress", "description": "Review and countersign the NDA before kickoff", "internal": false, "dueDate": "2026-05-11T22:00:00.000Z", "isOverdue": true, "isVisibleToExternal": true, "actionType": "fill-form", "assignees": [ { "type": "user", "user": { "belongsTo": "internal_organization", "email": "delia@flowla.com", "name": "Delia Barbat", "isRoomOwner": false } } ], "viewership": [ { "user": { "belongsTo": "external_organization", "email": "morgan.lee@acme.com", "name": "Morgan Lee", "isPrimaryContact": true, "lastSeen": "2026-05-05T14:30:44.260Z", "viewCount": 4 }, "durationInSeconds": 3, "timesViewed": 1, "engagements": [] } ] } ] } ] } ``` # Blocks Source: https://docs.flowla.com/api/blocks Blocks are the content units inside a group. Type is fixed at creation. ## Endpoints | Method | Path | Description | | -------- | ---------------------------------------------------- | ---------------------- | | `POST` | `/api/v2/blocks` | Create blocks | | `GET` | `/api/v2/blocks?pageId={page_id}&groupId={group_id}` | List blocks in a group | | `PATCH` | `/api/v2/blocks/{block_id}` | Update a block | | `DELETE` | `/api/v2/blocks/{block_id}?pageId={page_id}` | Delete a block | Block type is **immutable** after creation. To change a block's type, delete it and create a new one. ## Block types | Type | Use it for | Content field | | ------------- | ------------------ | -------------------------------- | | `text` | Rich text | `content` — accepts **Markdown** | | `image` | Images | `url` — auto-stored in Flowla S3 | | `embed` | Web pages, iframes | `url` | | `link` | Clickable URLs | `url` | | `pdf` | PDF documents | `url` — auto-stored in Flowla S3 | | `action-plan` | Task checklists | *(no extra fields)* | *** ## Create blocks `POST /api/v2/blocks` Blocks are organized into **columns**. Each element of `columns` is a vertical stack of blocks; multiple elements appear side by side. The page the group belongs to. The group to add blocks to. Array of column objects. Each column contains a `blocks` array stacked vertically. Multiple columns appear side by side on the page. Array of block objects for this column. Block type. Immutable after creation. Text content for `text` blocks. Accepts **Markdown** — bold, italic, headings, lists, tables, blockquotes, and code blocks are converted automatically. URL for `image`, `embed`, `link`, and `pdf` blocks. For `image` and `pdf`, any public URL is accepted — the file is automatically fetched and stored in Flowla S3. ### Layout examples ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [ { "type": "text", "content": "## Welcome\n\nThis is **bold** text." }, { "type": "image", "url": "https://cdn.example.com/banner.png" } ] } ] } ``` ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [{ "type": "text", "content": "Left column" }] }, { "blocks": [{ "type": "image", "url": "https://cdn.example.com/img.png" }] } ] } ``` ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [{ "type": "text", "content": "Welcome to the room." }] } ] } ``` The `content` field accepts Markdown. Formatting like `**bold**`, `# Heading`, bullet lists, and tables are rendered correctly. ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [{ "type": "image", "url": "https://cdn.example.com/banner.png" }] } ] } ``` The image is automatically fetched from the provided URL and stored in Flowla S3. ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [{ "type": "embed", "url": "https://example.com/page" }] } ] } ``` ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [{ "type": "link", "url": "https://example.com/pricing" }] } ] } ``` ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [{ "type": "pdf", "url": "https://cdn.example.com/proposal.pdf" }] } ] } ``` The PDF is automatically fetched and stored in Flowla S3. ```json theme={null} { "pageId": "", "groupId": "", "columns": [ { "blocks": [{ "type": "action-plan" }] } ] } ``` Once created, use the [Action Items](/api/action-items) endpoints to add tasks to this block. ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/blocks \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pageId": "", "groupId": "", "columns": [{ "blocks": [{ "type": "action-plan" }] }] }' ``` ```python Python theme={null} import requests requests.post( "https://api.flowla.com/api/v2/blocks", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={ "pageId": "", "groupId": "", "columns": [{"blocks": [{"type": "action-plan"}]}], }, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/blocks", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ pageId: "", groupId: "", columns: [{ blocks: [{ type: "action-plan" }] }], }), }); ``` *** ## List blocks `GET /api/v2/blocks?pageId={page_id}&groupId={group_id}` ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/blocks?pageId=&groupId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} response = requests.get( "https://api.flowla.com/api/v2/blocks", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"pageId": "", "groupId": ""}, ) ``` *** ## Update a block `PATCH /api/v2/blocks/{block_id}` The page the block belongs to. Updated text content (for `text` blocks). Accepts Markdown. Updated URL (for `image`, `embed`, `link`, `pdf` blocks). For `image` and `pdf`, the file is automatically fetched and stored in Flowla S3. ```json Example theme={null} { "pageId": "", "content": "Updated **text** content" } ``` ```bash cURL theme={null} curl -X PATCH https://api.flowla.com/api/v2/blocks/ \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"pageId": "", "content": "Updated text content"}' ``` ```python Python theme={null} requests.patch( "https://api.flowla.com/api/v2/blocks/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"pageId": "", "content": "Updated text content"}, ) ``` *** ## Delete a block `DELETE /api/v2/blocks/{block_id}?pageId={page_id}` If the block is an `action-plan` block, all its action items are deleted too. ```bash cURL theme={null} curl -X DELETE "https://api.flowla.com/api/v2/blocks/?pageId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} requests.delete( "https://api.flowla.com/api/v2/blocks/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"pageId": ""}, ) ``` # Companies Source: https://docs.flowla.com/api/companies List and create companies in your organization. Use a returned ID as companyId when creating or updating a room. ## Endpoints | Method | Path | Description | | ------ | ------------------- | ---------------- | | `GET` | `/api/v2/companies` | List companies | | `POST` | `/api/v2/companies` | Create a company | *** ## List companies `GET /api/v2/companies` ### Query parameters Search by company name or domain (e.g. `"Acme"` or `"acme.com"`). Page number (default: 1). Results per page (default: 10). ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/companies?keyword=acme&page=1&limit=20" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/companies", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"keyword": "acme", "page": 1, "limit": 20}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/companies?keyword=acme&page=1&limit=20", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); const data = await res.json(); ``` ### Response Array of company objects. Company identifier. Use this as `companyId` when creating or updating a room. Company display name. Company domain (e.g. `acme.com`). Total matching companies. Total pages at the current limit. ```json Response 200 theme={null} { "results": [ { "id": "cmp_01ab2", "name": "Acme Corp", "domain": "acme.com" } ], "totalRecords": 1, "totalPages": 1 } ``` *** ## Create a company `POST /api/v2/companies` Company domain (e.g. `acme.com`). Also used as `name` when `name` is omitted. Company display name. Defaults to `domain` when not provided. Full website URL (e.g. `https://acme.com`). ```json Example theme={null} { "domain": "acme.com", "name": "Acme Corp" } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/companies \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "domain": "acme.com", "name": "Acme Corp" }' ``` ```python Python theme={null} import requests response = requests.post( "https://api.flowla.com/api/v2/companies", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"domain": "acme.com", "name": "Acme Corp"}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/companies", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ domain: "acme.com", name: "Acme Corp" }), }); const company = await res.json(); ``` ### Response ```json Response 201 theme={null} { "id": "cmp_01ab2", "name": "Acme Corp", "domain": "acme.com", "website": null, "createdAt": "2026-06-01T10:00:00.000Z" } ``` # Groups Source: https://docs.flowla.com/api/groups Groups are rows on a page. They hold one or more blocks and can have optional titles. ## Endpoints | Method | Path | Description | | -------- | -------------------------------------------- | ----------------------------- | | `GET` | `/api/v2/groups?pageId={page_id}` | List groups on a page | | `POST` | `/api/v2/groups` | Create groups | | `PATCH` | `/api/v2/groups/{group_id}` | Update a group | | `DELETE` | `/api/v2/groups/{group_id}?pageId={page_id}` | Delete a group and its blocks | *** ## List groups `GET /api/v2/groups?pageId={page_id}` ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/groups?pageId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/groups", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"pageId": ""}, ) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/groups?pageId=", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); ``` *** ## Create groups `POST /api/v2/groups` Create one or more groups on a page in a single request. The page to add groups to. Array of group objects. Display title shown above the group. ```json Example theme={null} { "pageId": "", "groups": [ { "title": "Quick links" }, { "title": "Resources" } ] } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/groups \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "pageId": "", "groups": [{ "title": "Quick links" }] }' ``` ```python Python theme={null} requests.post( "https://api.flowla.com/api/v2/groups", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={ "pageId": "", "groups": [{"title": "Quick links"}], }, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/groups", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ pageId: "", groups: [{ title: "Quick links" }], }), }); ``` *** ## Update a group `PATCH /api/v2/groups/{group_id}` The page the group belongs to. New display title. ```json Example theme={null} { "pageId": "", "title": "Updated Group Title" } ``` ```bash cURL theme={null} curl -X PATCH https://api.flowla.com/api/v2/groups/ \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"pageId": "", "title": "Updated Group Title"}' ``` ```python Python theme={null} requests.patch( "https://api.flowla.com/api/v2/groups/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"pageId": "", "title": "Updated Group Title"}, ) ``` *** ## Delete a group `DELETE /api/v2/groups/{group_id}?pageId={page_id}` Deletes the group and all its blocks permanently. Any action-plan tasks inside the group are also deleted. ```bash cURL theme={null} curl -X DELETE "https://api.flowla.com/api/v2/groups/?pageId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} requests.delete( "https://api.flowla.com/api/v2/groups/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"pageId": ""}, ) ``` # Labels Source: https://docs.flowla.com/api/labels List label definitions configured in your organization. ## Endpoints | Method | Path | Description | | ------ | ---------------- | ----------- | | `GET` | `/api/v2/labels` | List labels | *** ## List labels `GET /api/v2/labels` Returns all labels available in the organization. Use a returned `id` as `labelId` when creating a room. ```bash cURL theme={null} curl https://api.flowla.com/api/v2/labels \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/labels", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/labels", { headers: { "x-flowla-api-key": "YOUR_API_KEY" }, }); const labels = await res.json(); ``` ### Response ```json Response 200 theme={null} [ { "id": "lbl_01ab2", "title": "Strategic" }, { "id": "lbl_01xy9", "title": "At Risk" } ] ``` # API Reference Source: https://docs.flowla.com/api/overview The Flowla REST API lets you programmatically create rooms, manage content, and retrieve analytics. ## Base URL ``` https://api.flowla.com/api/v2 ``` ## Authentication All requests require your API key in the `x-flowla-api-key` header. Generate API keys from your workspace under **Settings → API**. ```bash cURL theme={null} curl https://api.flowla.com/api/v2/rooms \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests headers = {"x-flowla-api-key": "YOUR_API_KEY"} response = requests.get("https://api.flowla.com/api/v2/rooms", headers=headers) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/rooms", { headers: { "x-flowla-api-key": "YOUR_API_KEY" }, }); ``` ## Pagination List endpoints accept `page` and `limit` query parameters. ## Typical workflow `POST /api/v2/rooms` — optionally from a template or by duplicating an existing room. `POST /api/v2/sections` — create one or more sections in a single request. `POST /api/v2/pages` — create pages inside each section. `POST /api/v2/groups` then `POST /api/v2/blocks` — build page content. `POST /api/v2/action-items` — add action items to an action-plan block. Register a webhook (`FLOW_COMPLETED`) or trigger workflows for follow-ups. *** ## Endpoints Create, list, retrieve, and update rooms. Supports CRM linking and duplication. Rich engagement data per room: progress, assignees, section/step viewership. Add and manage sections with access level control. Add and organise pages within sections, with access levels. Group blocks together on a page. Add text, images, links, embeds, PDFs, and action-plan blocks to groups. Create and manage action items with assignees, dates, and statuses. Trigger configured automations on a room. Register and remove webhooks for room completion events. List templates available in your org. List and create companies to associate with rooms. List organization users. List room status definitions. # Pages Source: https://docs.flowla.com/api/pages Pages live inside sections and contain groups of blocks. Each supports an access level for buyer visibility control. ## Endpoints | Method | Path | Description | | -------- | -------------------------------------- | ----------------------------- | | `GET` | `/api/v2/pages?sectionId={section_id}` | List pages in a section | | `POST` | `/api/v2/pages` | Create pages | | `PATCH` | `/api/v2/pages/{page_id}` | Update a page | | `DELETE` | `/api/v2/pages/{page_id}` | Delete a page and its content | ## Access levels | Value | Behaviour | | ------------ | ---------------------------- | | `visible` | Shown to everyone | | `restricted` | Requires password or sign-in | | `locked` | Visible but not accessible | | `hidden` | Not shown to the buyer | *** ## List pages `GET /api/v2/pages?sectionId={section_id}` ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/pages?sectionId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/pages", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"sectionId": ""}, ) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/pages?sectionId=", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); ``` *** ## Create pages `POST /api/v2/pages` Create one or more pages in a single request. The section to add pages to. Array of page objects. Display title of the page. Visibility setting. Defaults to `visible`. ```json Example theme={null} { "sectionId": "", "pages": [ { "title": "Plans", "access": "visible" }, { "title": "FAQ", "access": "visible" } ] } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/pages \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "sectionId": "", "pages": [ { "title": "Plans", "access": "visible" }, { "title": "FAQ", "access": "visible" } ] }' ``` ```python Python theme={null} requests.post( "https://api.flowla.com/api/v2/pages", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={ "sectionId": "", "pages": [ {"title": "Plans", "access": "visible"}, {"title": "FAQ", "access": "visible"}, ], }, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/pages", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ sectionId: "", pages: [ { title: "Plans", access: "visible" }, { title: "FAQ", access: "visible" }, ], }), }); ``` *** ## Update a page `PATCH /api/v2/pages/{page_id}` New display title. New access level. ```json Example theme={null} { "title": "Questions & Answers", "access": "visible" } ``` ```bash cURL theme={null} curl -X PATCH https://api.flowla.com/api/v2/pages/ \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"title": "Questions & Answers"}' ``` ```python Python theme={null} requests.patch( "https://api.flowla.com/api/v2/pages/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"title": "Questions & Answers"}, ) ``` *** ## Delete a page `DELETE /api/v2/pages/{page_id}` Deletes the page and all its groups and blocks permanently. ```bash cURL theme={null} curl -X DELETE https://api.flowla.com/api/v2/pages/ \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} requests.delete( "https://api.flowla.com/api/v2/pages/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) ``` # Room Completed Events Source: https://docs.flowla.com/api/room-completed-events List events triggered when a room is marked as completed. ## Endpoints | Method | Path | Description | | ------ | ------------------------------- | -------------------------- | | `GET` | `/api/v2/room-completed-events` | List room completed events | *** ## List room completed events `GET /api/v2/room-completed-events` Returns events for rooms that have been completed in your organization. ### Query parameters Page number (default: 1). Results per page (default: 10). ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/room-completed-events?page=1&limit=20" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/room-completed-events", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"page": 1, "limit": 20}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/room-completed-events?page=1&limit=20", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); const events = await res.json(); ``` ### Response fields | Field | Type | Description | | ---------------- | ------ | ----------------------------------- | | `flowId` | string | Room identifier | | `flowTitle` | string | Room title | | `flowOwnerEmail` | string | Email of the room owner | | `flowOwnerName` | string | Name of the room owner | | `linkAnalytics` | string | Direct link to the room's analytics | | `linkEditView` | string | Direct link to edit the room | | `linkLiveView` | string | Direct link to the live room view | You can also register a webhook to be notified in real time when a room is completed. See [Webhooks](/api/webhooks). # Rooms Source: https://docs.flowla.com/api/rooms Create, list, retrieve, and update rooms. Supports CRM linking, templates, and duplication. ## Endpoints | Method | Path | Description | | ------- | ---------------------------------- | ------------------------------------ | | `POST` | `/api/v2/rooms` | Create a room | | `GET` | `/api/v2/rooms/{room_id}` | Get a room | | `GET` | `/api/v2/rooms/{room_id}/contents` | Get room structure and block content | | `GET` | `/api/v2/rooms` | List rooms | | `PATCH` | `/api/v2/rooms/{room_id}` | Update a room | *** ## Create a room `POST /api/v2/rooms` ### Body parameters The display title of the room. Optional description. Template ID to initialise the room from. Ignored when `duplicateFromId` is set. ID of an existing room to duplicate. ID of the company to associate with this room. ID of the status to set on the room. ID of the label to apply. ID of the Flowla user to assign as room owner. Email address of the primary contact. HubSpot deal ID to link this room to. Salesforce opportunity ID (e.g. `0064x000009abcD`). Attio deal ID (e.g. `deal-abc-123`). Title displayed on the room's cover page. Description displayed on the room's cover page. When `true`, the cover page is hidden. Background color as a hex value (e.g. `#FF5500`). Navigation bar color. Accepts a hex value, `"flow-org-color"` (your org's brand color), or `"target-company-color"` (the associated company's color). ### Modes ```json theme={null} { "title": "Acme Corp – Onboarding", "email": "buyer@acme.com", "companyId": "" } ``` ```json theme={null} { "title": "Acme Corp – Onboarding", "templateId": "", "email": "buyer@acme.com" } ``` ```json theme={null} { "title": "Acme Corp – Onboarding (copy)", "duplicateFromId": "" } ``` ```json theme={null} { "title": "Globex Q3 Deal", "templateId": "", "hsDealId": "12345678", "userId": "" } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/rooms \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "title": "Acme Corp – Onboarding", "templateId": "", "email": "buyer@acme.com", "hsDealId": "12345678" }' ``` ```python Python theme={null} import requests response = requests.post( "https://api.flowla.com/api/v2/rooms", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={ "title": "Acme Corp – Onboarding", "templateId": "", "email": "buyer@acme.com", "hsDealId": "12345678", }, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/rooms", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ title: "Acme Corp – Onboarding", templateId: "", email: "buyer@acme.com", hsDealId: "12345678", }), }); const room = await res.json(); ``` *** ## Get a room `GET /api/v2/rooms/{room_id}` ```bash cURL theme={null} curl https://api.flowla.com/api/v2/rooms/ \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} response = requests.get( "https://api.flowla.com/api/v2/rooms/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/rooms/", { headers: { "x-flowla-api-key": "YOUR_API_KEY" }, }); ``` *** ## Get room contents `GET /api/v2/rooms/{room_id}/contents` Returns the full structure of a room: sections → pages → groups → blocks, with text content extracted from each block. Action-plan blocks also include their action items. Use this endpoint when you need to understand what is inside a room — for example, before suggesting next best actions or edits. ### Response shape ```json theme={null} { "sections": [ { "id": "", "title": "Introduction", "access": "visible", "pages": [ { "id": "", "title": "Overview", "access": "visible", "groups": [ { "id": "", "title": null, "blocks": [ { "id": "", "type": "text", "content": "Welcome to Acme Corp's onboarding room." }, { "id": "", "type": "action-plan", "content": null, "actionItems": [ { "id": "", "title": "Sign NDA", "status": "done", "dueDate": "2026-06-15T00:00:00.000Z", "completedAt": "2026-06-10T09:23:00.000Z" } ] } ] } ] } ] } ] } ``` ```bash cURL theme={null} curl https://api.flowla.com/api/v2/rooms//contents \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} response = requests.get( "https://api.flowla.com/api/v2/rooms//contents", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/rooms//contents", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); ``` *** ## List rooms `GET /api/v2/rooms` ### Query parameters Page number (default: 1). Results per page (default: 10). Field to sort by (default: `createdAt`). Sort direction (default: `DESC`). ### Response fields Each room in `results` includes: | Field | Type | Description | | ------------------ | --------------- | ---------------------------------------------------------------------------------------------- | | `id` | string | Room identifier | | `title` | string | Room title | | `userId` | string \| null | Room owner user ID | | `companyId` | string \| null | Associated company ID | | `createdAt` | string | ISO 8601 | | `updatedAt` | string | ISO 8601 | | `totalEngagements` | number \| null | Total engagement actions across all types | | `lastEngagedAt` | string \| null | Timestamp of the last engagement | | `totalViews` | number \| null | Total page view count | | `totalUniqueViews` | number \| null | Unique viewer count | | `engagements` | object \| null | Breakdown: `clicks`, `comments`, `downloads`, `reactions`, `shares`, `views`, `tasksCompleted` | | `coverTitle` | string \| null | Cover page title | | `coverDescription` | string \| null | Cover page description | | `coverDisabled` | boolean \| null | Whether the cover page is hidden | | `themeColor` | string \| null | Background color | | `navColor` | string \| null | Navigation bar color | ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/rooms?page=1&limit=20" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} response = requests.get( "https://api.flowla.com/api/v2/rooms", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"page": 1, "limit": 20}, ) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/rooms?page=1&limit=20", { headers: { "x-flowla-api-key": "YOUR_API_KEY" }, }); ``` *** ## Update a room `PATCH /api/v2/rooms/{room_id}` All fields are optional. Only provided fields are updated. New display title. New description. New status ID. Sets the room owner. Links the room to a company. HubSpot deal ID. Salesforce opportunity ID. Attio deal ID. Cover page title. Cover page description. When `true`, the cover page is hidden. Background color as a hex value (e.g. `#FF5500`). Navigation bar color. Accepts a hex value, `"flow-org-color"`, or `"target-company-color"`. ```json Example theme={null} { "title": "Globex – Closed Won", "statusId": "", "userId": "" } ``` ```bash cURL theme={null} curl -X PATCH https://api.flowla.com/api/v2/rooms/ \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"title": "Globex – Closed Won", "statusId": ""}' ``` ```python Python theme={null} requests.patch( "https://api.flowla.com/api/v2/rooms/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"title": "Globex – Closed Won", "statusId": ""}, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/rooms/", { method: "PATCH", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ title: "Globex – Closed Won", statusId: "" }), }); ``` # Sections Source: https://docs.flowla.com/api/sections Sections are the top-level chapters within a room. Each supports an access level that controls buyer visibility. ## Endpoints | Method | Path | Description | | -------- | ----------------------------------- | ------------------------------ | | `GET` | `/api/v2/sections?roomId={room_id}` | List sections in a room | | `POST` | `/api/v2/sections` | Create sections | | `PATCH` | `/api/v2/sections/{section_id}` | Update a section | | `DELETE` | `/api/v2/sections/{section_id}` | Delete a section and its pages | ## Access levels | Value | Behaviour | | ------------ | ---------------------------- | | `visible` | Shown to everyone | | `restricted` | Requires password or sign-in | | `locked` | Visible but not accessible | | `hidden` | Not shown to the buyer | *** ## List sections `GET /api/v2/sections?roomId={room_id}` ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/sections?roomId=" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/sections", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"roomId": ""}, ) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/sections?roomId=", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); ``` *** ## Create sections `POST /api/v2/sections` Create one or more sections in a single request. The room to add sections to. Array of section objects. Display title of the section. Visibility setting. Defaults to `visible`. ```json Example theme={null} { "roomId": "", "sections": [ { "title": "Introduction", "access": "visible" }, { "title": "Pricing", "access": "visible" }, { "title": "Internal Notes", "access": "hidden" } ] } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/sections \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "roomId": "", "sections": [ { "title": "Introduction", "access": "visible" }, { "title": "Pricing", "access": "visible" } ] }' ``` ```python Python theme={null} requests.post( "https://api.flowla.com/api/v2/sections", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={ "roomId": "", "sections": [ {"title": "Introduction", "access": "visible"}, {"title": "Pricing", "access": "visible"}, ], }, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/sections", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ roomId: "", sections: [ { title: "Introduction", access: "visible" }, { title: "Pricing", access: "visible" }, ], }), }); ``` *** ## Update a section `PATCH /api/v2/sections/{section_id}` New display title. New access level. ```json Example theme={null} { "title": "New Title", "access": "visible" } ``` ```bash cURL theme={null} curl -X PATCH https://api.flowla.com/api/v2/sections/ \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"title": "New Title", "access": "visible"}' ``` ```python Python theme={null} requests.patch( "https://api.flowla.com/api/v2/sections/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"title": "New Title", "access": "visible"}, ) ``` *** ## Delete a section `DELETE /api/v2/sections/{section_id}` Deletes the section and all its pages, groups, and blocks permanently. ```bash cURL theme={null} curl -X DELETE https://api.flowla.com/api/v2/sections/ \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} requests.delete( "https://api.flowla.com/api/v2/sections/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) ``` # Sessions Source: https://docs.flowla.com/api/sessions List visitor sessions — each time someone viewed a room. ## Endpoints | Method | Path | Description | | ------ | ------------------ | ------------- | | `GET` | `/api/v2/sessions` | List sessions | *** ## List sessions `GET /api/v2/sessions` Returns visitor sessions across rooms in your organization, with location, device, and contact information. ### Query parameters Page number (default: 1). Results per page (default: 10). Filter sessions to a specific room. Filter by identified contact ID. Search by visitor name or email. When `true`, return only sessions with an identified contact. Sort field (default: `createdAt`). Sort direction (default: `DESC`). Return sessions created at or after this ISO 8601 date. Return sessions created at or before this ISO 8601 date. ### Response fields Each item in `results` includes: | Field | Type | Description | | ------------------ | -------------- | --------------------------------------------------- | | `id` | string | Session identifier | | `roomId` | string | Room the session belongs to | | `createdAt` | string | ISO 8601 — when the session started | | `updatedAt` | string | ISO 8601 | | `city` | string \| null | Visitor city | | `region` | string \| null | Visitor region | | `country` | string \| null | Visitor country | | `visitorNumber` | number \| null | Ordinal visitor number for this room | | `browser.software` | string \| null | Browser name | | `browser.os` | string \| null | Operating system | | `browser.contact` | object \| null | Identified contact (`id`, `email`, `fullName`) | | `user` | object \| null | Room owner (`id`, `email`, `firstName`, `lastName`) | ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/sessions?roomId=&limit=20" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/sessions", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"roomId": "", "page": 1, "limit": 20}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/sessions?roomId=&limit=20", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); const data = await res.json(); ``` # Statuses Source: https://docs.flowla.com/api/statuses List room status definitions configured in your organization. ## Endpoints | Method | Path | Description | | ------ | ------------------ | ------------------ | | `GET` | `/api/v2/statuses` | List room statuses | *** ## List room statuses `GET /api/v2/statuses` Returns all room statuses available in the organization. Use a returned `id` as `statusId` when creating or updating a room. ```bash cURL theme={null} curl https://api.flowla.com/api/v2/statuses \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/statuses", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/statuses", { headers: { "x-flowla-api-key": "YOUR_API_KEY" }, }); const statuses = await res.json(); ``` ### Response Status identifier. Use this as `statusId` when creating or updating a room. Display name of the status. `true` if this status is automatically assigned to new rooms. ```json Response 200 theme={null} [ { "id": "st_01ab2", "title": "In Progress", "defaultStatus": true }, { "id": "st_01xy9", "title": "Closed Won", "defaultStatus": false } ] ``` Colors and other visual metadata are not included in the API response. # Templates Source: https://docs.flowla.com/api/templates List room templates available in your organization. Use a returned ID as templateId when creating a room. ## Endpoints | Method | Path | Description | | ------ | ------------------- | -------------- | | `GET` | `/api/v2/templates` | List templates | *** ## List templates `GET /api/v2/templates` ### Query parameters `org` (default) returns your organization's templates. `public` returns marketplace templates. Page number (default: 1). Results per page (default: 10). ```bash cURL theme={null} curl "https://api.flowla.com/api/v2/templates?source=org&page=1&limit=20" \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/templates", headers={"x-flowla-api-key": "YOUR_API_KEY"}, params={"source": "org", "page": 1, "limit": 20}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch( "https://api.flowla.com/api/v2/templates?source=org&page=1&limit=20", { headers: { "x-flowla-api-key": "YOUR_API_KEY" } } ); const data = await res.json(); ``` ### Response Array of template objects. Template identifier. Pass this as `templateId` when creating a room. Template display name. Optional description. ISO 8601 creation timestamp. Total number of matching templates. Total number of pages at the current `limit`. ```json Response 200 theme={null} { "results": [ { "id": "tpl_01ab2", "title": "Enterprise onboarding", "description": null, "createdAt": "2026-01-15T10:00:00.000Z" }, { "id": "tpl_01xy9", "title": "POC kickoff", "description": null, "createdAt": "2026-02-01T09:00:00.000Z" } ], "totalRecords": 2, "totalPages": 1 } ``` # Users Source: https://docs.flowla.com/api/users List users in your organization. ## Endpoints | Method | Path | Description | | ------ | --------------- | ----------------------- | | `GET` | `/api/v2/users` | List organization users | *** ## List users `GET /api/v2/users` Returns active users in the organization. Use a returned ID as `userId` when creating or updating a room. ```bash cURL theme={null} curl https://api.flowla.com/api/v2/users \ -H "x-flowla-api-key: YOUR_API_KEY" ``` ```python Python theme={null} import requests response = requests.get( "https://api.flowla.com/api/v2/users", headers={"x-flowla-api-key": "YOUR_API_KEY"}, ) print(response.json()) ``` ```js JavaScript theme={null} const res = await fetch("https://api.flowla.com/api/v2/users", { headers: { "x-flowla-api-key": "YOUR_API_KEY" }, }); const users = await res.json(); ``` # Workflows Source: https://docs.flowla.com/api/workflows Trigger configured Flowla automations on a room. ## Endpoints | Method | Path | Description | | ------ | ------------------------------------- | ----------------------------- | | `POST` | `/api/v2/workflows/{workflow_id}` | Trigger a workflow | | `POST` | `/api/v2/workflows/{workflow_id}/raw` | Trigger a workflow (raw body) | *** ## Trigger a workflow `POST /api/v2/workflows/{workflow_id}` Triggers a configured automation. The request body is wrapped in a `data` object. Arbitrary key-value data passed to the workflow. ```json Example theme={null} { "data": { "roomId": "", "stage": "kickoff" } } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/workflows/ \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"data": {"roomId": "", "stage": "kickoff"}}' ``` ```python Python theme={null} import requests requests.post( "https://api.flowla.com/api/v2/workflows/", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"data": {"roomId": "", "stage": "kickoff"}}, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/workflows/", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ data: { roomId: "", stage: "kickoff" } }), }); ``` *** ## Trigger a workflow (raw) `POST /api/v2/workflows/{workflow_id}/raw` Same as above but sends the full request body as workflow data — no `data` wrapper. ```json Example theme={null} { "roomId": "", "stage": "kickoff" } ``` ```bash cURL theme={null} curl -X POST https://api.flowla.com/api/v2/workflows//raw \ -H "x-flowla-api-key: YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"roomId": "", "stage": "kickoff"}' ``` ```python Python theme={null} requests.post( "https://api.flowla.com/api/v2/workflows//raw", headers={"x-flowla-api-key": "YOUR_API_KEY"}, json={"roomId": "", "stage": "kickoff"}, ) ``` ```js JavaScript theme={null} await fetch("https://api.flowla.com/api/v2/workflows//raw", { method: "POST", headers: { "x-flowla-api-key": "YOUR_API_KEY", "Content-Type": "application/json", }, body: JSON.stringify({ roomId: "", stage: "kickoff" }), }); ``` # Attio automations Source: https://docs.flowla.com/automations/Attio Trigger Flowla workflows from Attio events like deal stage changes and attribute updates. ## TL;DR Trigger Flowla workflows from Attio events — like a deal stage changing or an attribute being updated — to automatically create rooms, personalise content, and keep your CRM in sync. *** ### Why it matters Attio tracks every stage of your deal pipeline. When something changes there, that's the right moment for Flowla to act. By using Attio as a trigger, you can: * **Create a personalised room the moment a deal reaches a new stage** — auto-fill company name, contact details, and deal data so your team hits the ground running * **Update Attio when something happens inside the room** — when a buyer completes an action or section, automatically log it as an engagement note on the deal record * **Keep both platforms in sync** — room views, action completions, and content engagement flow back to Attio automatically, so your CRM always reflects real buyer activity *** ### What you can use as triggers Flowla currently supports the following Attio-triggered workflows: * **Deal Stage Changed** — when a deal moves to a specific stage (e.g. *In Progress* or *Closed Won*), trigger room creation or content updates * **Attribute Updated** — when a deal or contact attribute is updated in Attio, trigger room actions or personalisation updates #### Actions you can trigger from Attio events Using the Attio triggers above, you can: * **Create a room from a template** * **Assign the room creator based on the deal owner** * **Fill variables** using company, contact, or deal data from Attio * **Unlock room sections** based on deal stage progression * **Log room activity** back into Attio as engagement notes *** ### How to set it up In Flowla, navigate to **Workflows** in the main navigation. Click **+ Create New Workflow** then **Add Trigger**. Select **Attio** as the trigger type, then choose the event: * **Deal stage changed** * **Attribute updated** — e.g. a specific field value changing Add the actions you want to trigger: * Create a room from a template * Unlock a section * Change the room's status * Add CRM data as variables Learn more about setting up the two-way sync between Flowla and Attio in the [Attio integration guide](/integrations/Attio). # HubSpot automations Source: https://docs.flowla.com/automations/HubSpot Trigger Flowla workflows from HubSpot events like deal stage changes and property updates. ## TL;DR Trigger Flowla workflows from HubSpot events — like a deal moving to a new stage or a contact property being updated — to automatically create rooms, send follow-ups, and keep your CRM in sync. *** ### Why it matters Your HubSpot deals hold the source of truth for every customer relationship. When something happens in HubSpot, that's the perfect moment to act. By using HubSpot as a trigger, you can: * **Create a personalised room the moment a deal is created or moves to a new stage** — auto-fill company name, logo, and contact details so your team doesn't start from scratch * **Update HubSpot when something happens inside the room** — when a buyer completes an action or submits a form, automatically update a HubSpot property or deal field * **Change the room status based on deal stage updates** — if a deal moves to "Closed Won" in HubSpot, Flowla can update the room's status and unlock onboarding sections automatically *** ### What you can use as triggers Flowla currently supports the following HubSpot-triggered workflows: * **New Deal Created** — when a new deal is created in HubSpot, trigger a room automatically * **Deal Stage Changed** — when a deal moves to a specific stage (e.g. *Proposal Sent* or *Closed Won*), trigger room creation, content updates, or a sync back to HubSpot * **Property Updated** — when a contact or deal field is updated (e.g. "Contract Signed = True"), trigger room actions or field updates #### Actions you can trigger from HubSpot events Using the HubSpot triggers above, you can: * **Create a room from a template** * **Assign the room creator based on the deal owner** * **Fill variables** using contact, company, or deal data from HubSpot * **Update HubSpot fields** (e.g. mark onboarding as started when a room section is completed) * **Unlock room sections** based on deal stage progression * **Track room status changes** back into HubSpot *** ### How to set it up In Flowla, navigate to **Workflows** in the main navigation. Click **+ Create New Workflow** then **Add Trigger**. Select **HubSpot** as the trigger type, then choose the event: * **New deal** — when a new deal is created * **Deal stage changed** * **Property updated** — e.g. "Contract Signed = True" Add the actions you want to trigger: * Create a room from a template * Unlock a section * Update HubSpot fields * Change the room's status * Add CRM data as variables You can also automate room creation directly from HubSpot deal records. Learn more about the [HubSpot integration](/integrations/HubSpot). # Salesforce automations Source: https://docs.flowla.com/automations/Salesforce Trigger Flowla workflows from Salesforce events like opportunity stage changes and property updates. ## TL;DR Trigger Flowla workflows from Salesforce events — like an opportunity stage changing or a property being updated — to automatically create rooms, send follow-ups, and keep your CRM in sync. *** ### Why it matters Your CRM holds the source of truth for every deal. When something happens in Salesforce, that's the perfect moment to act. By using Salesforce as a trigger, you can: * **Create a personalised room the moment a new opportunity is logged** — auto-fill company name, logo, and primary contact so your team doesn't start from scratch * **Update Salesforce when something happens inside the room** — when a section is marked complete in Flowla, automatically update a Salesforce field * **Change the room status based on Salesforce property updates** — if "Contract Signed" is checked in Salesforce, Flowla can update the room's status and unlock onboarding sections *** ### What you can use as triggers Flowla currently supports the following Salesforce-triggered workflows: * **New Object Created** — when a new Opportunity is created, trigger a room automatically * **Opportunity Stage Changed** — when an opportunity moves to a specific stage (e.g. *Proposal Sent* or *Closed Won*), trigger room creation, content updates, or a sync back to Salesforce * **Property Updated** — when a field (e.g. "Contract Signed") is updated, trigger room actions or field updates #### Actions you can trigger from Salesforce events Using the Salesforce triggers above, you can: * **Create a room from a template** * **Assign the room creator based on the opportunity owner** * **Fill variables** using contact, company, or deal data * **Update Salesforce fields** (e.g. mark onboarding as started when a section is completed) * **Unlock room sections** based on deal progression * **Track room status changes** back into Salesforce *** ### How to set it up In Flowla, navigate to **Workflows** in the main navigation. Click **+ Create New Workflow** then **Add Trigger**. Select **Salesforce** as the trigger type, then choose the event: * **New object** — e.g. when a new opportunity is created * **Opportunity stage changed** * **Property updated** — e.g. "Contract Signed = True" Add the actions you want to trigger: * Create a room from a template * Unlock a section * Update Salesforce fields * Change the room's status * Add CRM data as variables Learn more about setting up the two-way sync between Flowla and Salesforce in the [Salesforce integration guide](/integrations/SalesForce). # Actions Source: https://docs.flowla.com/automations/actions See everything your workflows can do — from creating rooms to sending emails and updating your CRM. Actions are what your workflow actually does — the steps Flowla takes once a trigger fires.