---
title: "Transcribe ad-account video"
method: POST
path: "/open/v1/ad-accounts/{account_id}/videos/{video_id}/transcript"
tags: ["Ad Accounts"]
---

# Transcribe ad-account video

`POST /open/v1/ad-accounts/{account_id}/videos/{video_id}/transcript`

Transcribe a workspace-owned ad video to text. Synchronous: blocks until the transcript is ready (~30-60 seconds on a cache miss, near-instant on a hit).

**POST vs GET semantics.** POST on this path triggers transcription; GET on the **same path** is a pure cache lookup that never triggers and never charges. Pick the verb by intent.

**Caching.** Transcripts are cached per workspace + video content-hash, so repeat calls in the same workspace return the cached transcript at 0 credit.

**Credits.** Cache hit: 0 credits. Cache miss: charged at the same rate as the in-app video-transcription feature — trigger it once in Atria's web app to see the current per-call credit cost. The charge is auto-refunded if transcription itself fails.

Returns: `code=0` success (status=`success` with transcript, or status=`failure` with `error` populated and credits refunded); `code=40001` invalid `account_id`; `code=40401` cross-workspace / unknown account / video not found on the platform; `code=42900` when the workspace is out of credits for this feature.

## Path parameters

- `account_id` string, required — Workspace ad-account UUID (dashed or hex) that owns this video. Must match an entry returned by `GET /open/v1/ad-accounts` for the calling workspace.
- `video_id` string, required — Platform-native Video Object ID surfaced by `GET /open/v1/ad-accounts/{account_id}/ads/{platform_ad_id}` as `creative.videos[].video_id`. Opaque string — pass it back verbatim.

## Response `200`

Successful Response

- OpenVideoTranscriptResponse — Envelope for all open API responses. code=0 means success.
  - `code` integer
  - `message` string
  - `data` OpenVideoTranscript — Transcript record for a single video. Same payload shape returned by both the transcribe POST and the cache-lookup GET.
    - `video_id` string, required — Platform-native Video Object ID.
    - `video_url` string — Atria-rehosted CDN URL of the source video, when available.
    - `status` string, required — Transcription status: `success` (transcript ready), `pending` (still running — only returned by GET on a freshly enqueued task), `failure` (transcription errored).
    - `transcript` OpenVideoTranscriptBody
      - `text` string, required — Full transcript text (all segments joined).
      - `segments` OpenVideoTranscriptBodySegment[] — Time-aligned per-segment breakdown.
        - `start` number, required — Segment start, seconds from the video origin.
        - `end` number, required — Segment end, seconds from the video origin.
        - `text` string, required — Voice-over text spoken in this segment.
    - `error` string — Human-readable failure detail when status=`failure`.

## Other responses

- `400` — Invalid request — a query parameter, path parameter, or body field failed validation.

---

[API](https://skmtc.net/tryatria/apis/atria-open-api.md) · [All operations](https://skmtc.net/tryatria/apis/atria-open-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/tryatria/atria-open-api/revisions/548d57b611ea/schema)
