Speakflow API Teams use ChatGPT, Claude, virtual assistants, and internal tools to draft scripts, then open them in Speakflow for review, rehearsal, and recording.
Draft elsewhere. Deliver in Speakflow.

A common flow is simple: an assistant or AI tool drafts the script, your system saves it to Speakflow, and the presenter opens the returned URL when it is time to record.

  1. 1

    Generate a key

    Open Account Settings -> API Keys, create a workspace-scoped key, and copy the sfk_ token immediately. It is only shown once.

  2. 2

    Send authenticated requests

    Call https://www.speakflow.com/api/v1 with Authorization: Bearer sfk_... and write scripts into the key's scoped workspace.

  3. 3

    Open the script

    After you create or update a script, use the returned script URL to open it in Speakflow.

Use this reference to authenticate with an API key, create or update scripts, and manage labels and workspaces from your tools.

Base URL: https://www.speakflow.com/api/v1

Authentication

This reference covers Speakflow API keys (sfk_ prefix) passed as a Bearer token:

Authorization: Bearer sfk_your_key_here

Creating an API key

API keys require a paid plan. If you're on a free workspace, Speakflow will prompt you to upgrade before you can create one.

  1. Go to Account Settings > API Keys
  2. Click Create Key
  3. Give it a name and select a workspace
  4. Copy the key immediately — you won't be able to see it again

API keys are scoped to a single workspace. Any scripts you create with a key are automatically saved to that workspace.

Key behavior

  • Keys have full read/write access within their scoped workspace
  • Keys never expire unless manually revoked
  • Keys stop working if the key owner no longer has a paid plan
  • You can revoke a key at any time from the API Keys settings page
  • Each key tracks when it was last used

Endpoints

Get current user

Returns information about the authenticated user.

GET /api/v1/user

Example:

curl https://www.speakflow.com/api/v1/user \
  -H "Authorization: Bearer sfk_your_key_here"

Response:

{
  "user": {
    "id": 123,
    "email": "you@example.com",
    "first_name": "Jane",
    "last_name": "Doe",
    "team": "My Team",
    "profile_picture_url": "https://...",
    "plan_name": "Plus",
    "active_subscription": true,
    "subscription_end_date": "2026-04-15",
    "created_at": "2025-01-10T08:00:00Z",
    "updated_at": "2026-03-14T12:30:00Z",
    "use_case": "sales"
  }
}

List scripts

Returns scripts in the API key's workspace, ordered by most recently updated.

Script, workspace, and folder IDs in this API are returned as obfuscated strings. Use those values when calling related endpoints.

GET /api/v1/scripts

Example:

curl https://www.speakflow.com/api/v1/scripts \
  -H "Authorization: Bearer sfk_your_key_here"

Response:

{
  "scripts": [
    {
      "id": "QbLmXy",
      "title": "Product Demo Script",
      "preview": "Welcome everyone, today I'll be walking you through...",
      "workspace_id": "NwPqRs",
      "folder_id": null,
      "source": "web",
      "created_at": "2026-03-10T14:00:00Z",
      "updated_at": "2026-03-14T09:00:00Z",
      "url": "https://www.speakflow.com/account/scripts/abc123",
      "script_url": "https://www.speakflow.com/account/scripts/abc123"
    }
  ]
}

Returns up to 100 scripts.


Get a script

Returns a single script with its full content.

GET /api/v1/scripts/:id

Example:

curl https://www.speakflow.com/api/v1/scripts/QbLmXy \
  -H "Authorization: Bearer sfk_your_key_here"

Response:

{
  "script": {
    "id": "QbLmXy",
    "title": "Product Demo Script",
    "content": "Welcome everyone, today I'll be walking you through our product...",
    "preview": "Welcome everyone, today I'll be walking you through...",
    "workspace_id": "NwPqRs",
    "folder_id": null,
    "source": "web",
    "created_at": "2026-03-10T14:00:00Z",
    "updated_at": "2026-03-14T09:00:00Z",
    "url": "https://www.speakflow.com/account/scripts/abc123",
    "script_url": "https://www.speakflow.com/account/scripts/abc123",
    "labels": [
      { "id": 1, "name": "Sales", "color": "#4f46e5" }
    ]
  }
}

Create a script

Creates a new script in the API key's workspace.

POST /api/v1/scripts

Parameters:

FieldTypeRequiredDescription
script[title]stringYesThe script title
script[body]stringYesThe full script content (plain text or HTML)
script[source]stringNoSource tag for the script, such as web or chatgpt. Defaults to web.
script[workspace_id]stringNoTarget workspace. Use the obfuscated workspace ID returned by the API. If omitted, Speakflow uses the workspace scoped to the API key
script[folder_id]stringNoTarget folder within the selected workspace. Use the obfuscated folder ID returned by the API
script[label_ids]arrayNoArray of label IDs to apply

Example:

curl -X POST https://www.speakflow.com/api/v1/scripts \
  -H "Authorization: Bearer sfk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "script": {
      "title": "My New Script",
      "body": "This is the script content that will appear in the teleprompter.",
      "workspace_id": "NwPqRs"
    }
  }'

Response (201 Created):

{
  "script": {
    "id": "AbCdEf",
    "title": "My New Script",
    "content": "This is the script content that will appear in the teleprompter.",
    "preview": "This is the script content that will appear in the...",
    "workspace_id": "NwPqRs",
    "folder_id": null,
    "source": "api",
    "created_at": "2026-03-15T10:00:00Z",
    "updated_at": "2026-03-15T10:00:00Z",
    "url": "https://www.speakflow.com/account/scripts/def456",
    "script_url": "https://www.speakflow.com/account/scripts/def456",
    "labels": []
  }
}

Update a script

Updates an existing script.

PATCH /api/v1/scripts/:id

Parameters: Same as create — only include fields you want to change.

Example:

curl -X PATCH https://www.speakflow.com/api/v1/scripts/AbCdEf \
  -H "Authorization: Bearer sfk_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "script": {
      "body": "Updated script content for today's presentation."
    }
  }'

Response (200 OK):

{
  "script": {
    "id": "AbCdEf",
    "title": "My New Script",
    "content": "Updated script content for today's presentation.",
    "preview": "Updated script content for today's presentation.",
    "workspace_id": "NwPqRs",
    "folder_id": null,
    "source": "api",
    "created_at": "2026-03-15T10:00:00Z",
    "updated_at": "2026-03-15T10:05:00Z",
    "url": "https://www.speakflow.com/account/scripts/def456",
    "script_url": "https://www.speakflow.com/account/scripts/def456",
    "labels": []
  }
}

Delete a script

Permanently deletes a script.

DELETE /api/v1/scripts/:id

Example:

curl -X DELETE https://www.speakflow.com/api/v1/scripts/AbCdEf \
  -H "Authorization: Bearer sfk_your_key_here"

Response: 204 No Content


List labels

Returns all labels for the current team.

GET /api/v1/labels

Example:

curl https://www.speakflow.com/api/v1/labels \
  -H "Authorization: Bearer sfk_your_key_here"

Response:

{
  "labels": [
    { "id": 1, "name": "Sales", "color": "#4f46e5", "scripts_count": 12 },
    { "id": 2, "name": "Training", "color": "#059669", "scripts_count": 5 }
  ]
}

Create a label

POST /api/v1/labels

Parameters:

FieldTypeRequiredDescription
label[name]stringYesLabel name
label[color]stringNoHex color code

Update a label

PATCH /api/v1/labels/:id

Delete a label

DELETE /api/v1/labels/:id

Response: 204 No Content


List workspaces

Returns workspaces accessible to the authenticated user. If using an API key, returns only the key's scoped workspace.

GET /api/v1/workspaces

Example:

curl https://www.speakflow.com/api/v1/workspaces \
  -H "Authorization: Bearer sfk_your_key_here"

Response:

{
  "workspaces": [
    {
      "id": "NwPqRs",
      "name": "My Workspace",
      "team_name": "My Team",
      "is_default": true,
      "scripts_count": 42
    }
  ]
}

Error responses

All errors follow a consistent format:

{
  "error": "error_code",
  "error_description": "Human-readable description"
}
StatusError CodeDescription
401unauthorizedInvalid or expired API key
403access_deniedKey doesn't have access to this resource
403insufficient_scopeMissing required scope
404not_foundResource not found
422validation_failedInvalid parameters (details in error_description)
429rate_limit_exceededRate limit exceeded (100 requests/hour per IP)

Rate limits

API requests are limited to 100 requests per hour per IP address. If you exceed this limit, you'll receive a 429 response with error: "rate_limit_exceeded".


Use with AI tools

ChatGPT (Custom GPT Actions)

You can create a Custom GPT that writes scripts directly to your Speakflow teleprompter:

  1. Create a new GPT in ChatGPT
  2. Add an Action for the Speakflow endpoints you want the GPT to call
  3. Configure Bearer authentication with your sfk_ API key
  4. Instruct the GPT to create/update scripts based on your prompts

Public API access uses API keys. OAuth is not available for external developers.

Example GPT instruction: > "When the user asks you to write or update a script, call the Speakflow API and include the returned script_url in your reply so they can open it in Speakflow."

Claude (MCP or direct API calls)

Claude can use tools/functions to call the Speakflow API directly:

Create a 2-minute product demo script and save it to my Speakflow teleprompter.

With the right tool definitions, Claude will call POST /api/v1/scripts to create the script.

Any AI tool or CLI

Any tool that can make HTTP requests can integrate with Speakflow:

# Generate a script with an AI, then push it to Speakflow
echo "Your generated script content" | \
  curl -X POST https://www.speakflow.com/api/v1/scripts \
    -H "Authorization: Bearer sfk_your_key_here" \
    -H "Content-Type: application/json" \
    -d "{\"script\": {\"title\": \"AI-Generated Script\", \"body\": \"$(cat)\"}}"
10710c0f7f74d4c259af403437daaf1450d3c776