# Weflow Public API Overview

## Using the Weflow Public API

The Weflow Public API gives you programmatic access to the data Weflow Conversation Intelligence captures from your meetings. This includes recordings, participants, video URLs, comments, clips, and interaction metrics. You can use it to push call data into a data warehouse, build custom dashboards, sync recordings into internal tools, or trigger workflows in other systems.

This article walks through how to authenticate and what's available today.

[Weflow API Documentation](https://api.getweflow.app/api/v1/docs)

## Before you start

To use the API you'll need:

- A Weflow workspace on a plan that includes API access. If you're not sure whether your plan includes it, reach out to your Customer Success Manager or contact support.

- An API key generated from your Weflow workspace settings. Treat this key like a password as it grants access to all conversation data in your company workspace.

- The API can be set in the Admin Console

![](https://downloads.intercomcdn.com/i/o/j7ewb21y/2329289536/5efea89402c3ff7fad7282b8bdd6/image.png?expires=1793514600&amp;signature=c0973b4121eeaf5938a6d093396d8db0321236f45b0ee9f6fe2a551efe781d46&amp;req=diMlH8t2lIRcX%2FMW1HO4zYBSgBow3GV8PbnRkEDnhZ1JWHMzB6SuG%2F3wyJ6A%0A3a%2BXdPv4UpjqeqSF434%3D%0A)

The API base URL is:

```
https://api.getweflow.app/api/v1
```

## Authentication

Every request must include your API key in the `Authorization` header as a Bearer token:

```
Authorization: Bearer YOUR_API_KEY
```

If the key is missing or invalid, the API returns a `401 Unauthorized` response. If your workspace doesn't have API access enabled, list endpoints return `403 Forbidden` — in that case, contact support to enable it.

## Rate limits

The API is rate limited per workspace. If you exceed the limit, you'll receive a `429 Too Many Requests` response. We recommend implementing exponential backoff for any production integration and batching reads where possible (for example, paginating with a sensible page size rather than fetching one record at a time).

## Working with recordings

Everything in the API today is centered on **recordings** — the meetings Weflow has captured, transcribed, and analyzed. Each recording has a unique `uid` (UUID) that you'll use across all the endpoints below.

## List recordings

```
GET /recordings
```

Returns a paginated list of recordings for your company, newest first.

**Query parameters:**

| Parameter   | Type              | Description                                              |
| ----------- | ----------------- | -------------------------------------------------------- |
| `limit`     | integer           | Number of recordings per page (default `20`)             |
| `cursor`    | string            | Cursor from the previous response to fetch the next page |
| `startDate` | ISO 8601 datetime | Only return recordings on or after this date             |
| `endDate`   | ISO 8601 datetime | Only return recordings on or before this date            |

The response includes `data` (the recordings), `total`, `nextCursor`, and `hasMore`. To paginate, pass `nextCursor` back in your next request as the `cursor` parameter — and keep going while `hasMore` is `true`.

**Example:**

```
curl "https://api.getweflow.app/api/v1/recordings?limit=50&startDate=2026-04-01T00:00:00Z" \   -H "Authorization: Bearer YOUR_API_KEY"
```

## Get a single recording

```
GET /recordings/{uid}
```

Returns full metadata for one recording, including:

- Title, duration, and start time

- Source (`bot` or other), whether the meeting was external, and conference URL

- The linked Salesforce recording ID (if Weflow synced it to Salesforce)

- Transcript and summary languages

- The list of participants with name, email, and role (`host` or attendee)

- All Salesforce records the recording is linked to (Account, Opportunity, Contact, etc.) with their IDs, object types, and names

This is the endpoint you'll typically call to enrich a recording in your system after spotting it in the list endpoint.

## Get recording video URLs

```
GET /recordings/{uid}/video
```

Returns pre-signed S3 URLs for the recording video:

- `streamUrl` — for playback (e.g., embedding in a web player)

- `downloadUrl` — for downloading the file

- `expiresAt` — the timestamp at which both URLs expire

**Important:** The URLs expire after **1 hour**. Don't store them long-term. If you need a fresh URL, re-call this endpoint at request time.

## Get recording comments

```
GET /recordings/{uid}/comments
```

Returns threaded comments left on the recording. The response is a flat list, but each comment includes a `parentCommentUid` and a `replies` array containing the UIDs of its replies — so you can reconstruct threads on your side.

Each comment includes the author (`userUid`, `userName`), timestamp position in the recording (`timestampSeconds`), the rich-text content, and the character range it's anchored to (`startChar`, `endChar`).

## Get recording clips

```
GET /recordings/{uid}/clips
```

Returns all clips someone has saved from the recording. Each clip has a `start` and `end` (in seconds), a title, the text it covers, and the user who created it.

Useful for surfacing customer-highlighted moments, building libraries of objection-handling examples, or syndicating clips to enablement tools.

## Get recording interaction metrics

```
GET /recordings/{uid}/interaction-metrics
```

Returns per-participant conversation analytics:

| Metric               | What it measures                                  |
| -------------------- | ------------------------------------------------- |
| `talkRatio`          | Share of the meeting this person spoke            |
| `longestMonologue`   | Longest uninterrupted stretch of speech (seconds) |
| `interactivityScore` | Composite score for back-and-forth engagement     |
| `patience`           | How long this person waits before responding      |
| `questionsPerHour`   | Question rate normalized to hourly                |
| `totalQuestions`     | Total questions asked                             |
| `transitionPauses`   | Number of pauses between speaker transitions      |

These are the same metrics that power the coaching insights in the Weflow app — pulling them via API is how teams typically build custom rep scorecards or feed coaching data into a BI tool.

## Get recording transcript

`GET /recordings/{uid}/transcript`

Returns the full transcript for a recording, grouped by speaker, with per-word timestamps where available. Each segment includes:

- `speakerId` and `speaker` (the speaker label)

- `words`, an array of `{ text, start, end }` entries with timings in seconds

Returns an empty array if transcription never produced output (for example, a meeting with no audio captured).

Common uses: feeding transcripts into your own LLM workflows, archiving meeting content in a knowledge base, running custom search across calls, or training internal models on your sales conversations.

## Get recording scorecards

`GET /recordings/{uid}/scorecards`

Returns all cached scorecards for a recording, one per coaching template that has been run against it. Each scorecard contains:

- `coachingTemplateUid` so you can map results back to the template

- An `overall` block with a title, summary text, and numeric `rating`

- A list of `sections`, each with its own title, text, rating, and `items` (timestamped evidence pulled from the call)

Useful for piping scorecard outcomes into Salesforce as custom object records, building aggregate reporting across reps or teams in your BI tool, or triggering workflows when specific criteria fail (e.g., notify a manager when "next steps confirmed" is rated low).

## Get recording trackers

`GET /recordings/{uid}/trackers`

Returns every tracker that has at least one match on the recording, along with the matches themselves. Each match includes the matched phrase, the keyword that triggered it, and its position (`index`) in the transcript.

Use this to surface where competitors, pricing terms, objections, or any other tracked keywords came up across your calls without having to parse the transcript yourself.

## Get recording summary

`GET /recordings/{uid}/summary`

Returns the AI-generated summary for a recording, based on a specific summary template.

Query parameters:

| Parameter    | Type | Description                                                                        |
| ------------ | ---- | ---------------------------------------------------------------------------------- |
| `templateId` | UUID | Summary template UID. If omitted, your company's default summary template is used. |

The response includes the `summaryTemplateUid`, the overall `summary` text, and a list of `sections`. Each section has a title and timestamped `items` linking back into the recording.
​

Returns 404 if the recording or template isn't found, or if a summary couldn't be generated for that combination.

## List summary templates

`GET /summary-templates`

Returns every summary template available to your company, with `uid`, `name`, and an `isDefault` flag. Use a returned `uid` as the `templateId` query parameter on `/recordings/{uid}/summary` to fetch the corresponding summary.
​

This is the endpoint to call first if you want to generate multiple summary flavors per recording (e.g., one for CRM sync, one for executive review).

## Error handling

Errors follow a consistent shape:

```
{   "error": {     "code": "string",     "message": "string"   } }
```

Common status codes:

- `400 Bad Request` — invalid query parameters (typically a malformed date or unknown cursor)

- `401 Unauthorized` — missing or invalid API key

- `403 Forbidden` — API not enabled for your workspace

- `404 Not Found` — recording UID doesn't exist or isn't accessible to your workspace

- `429 Too Many Requests` — rate limit exceeded; back off and retry
​

## A typical integration pattern

For most use cases, the flow looks like this:

1. **Discover new recordings** — poll `GET /recordings` on a schedule (e.g., every 15 minutes) using `startDate` set to the last sync time, paginating until `hasMore` is `false`.

2. **Enrich each recording** — for any new UID, call `GET /recordings/{uid}` to pull metadata, participants, and Salesforce links.

3. **Pull the analytics you need** — call `interaction-metrics`, `comments`, `clips`, and (from May) `scorecards` and the transcript endpoint as needed.

4. **Generate video URLs on demand** — never cache `streamUrl` or `downloadUrl`; call `/video` at the moment you need them.

## Need help?

If you run into anything unexpected — missing data, unclear errors, or a use case the API doesn't yet support — reach out to **<support@getweflow.com>** or use the in-app chat. We read every API feedback ticket and use it to prioritize the roadmap.