Descript website screenshot

Descript

Descript is an AI-powered video and audio editing platform. Descript's API lets you programmatically create projects, import media, run AI ("Underlord") edits, publish compositions, and export transcripts — all without opening the desktop app. The API surfaces the same job model that backs the desktop editor and is currently in early access.

1 APIs 10 Features
AIAudio EditingCaptionsMediaPodcastingTranscriptionVideo Editing

APIs

Descript Platform API

REST API for programmatically creating projects, importing media, running AI edits via the Underlord agent, publishing compositions, exporting transcripts, and managing asynchro...

Collections

Pricing Plans

Descript Plans Pricing

5 plans

PLANS

Rate Limits

Descript Rate Limits

5 limits

RATE LIMITS

FinOps

Features

Project Creation

Create new projects in a Drive and import media from public or pre-signed URLs in a single API request.

Direct File Upload

Receive 3-hour signed upload URLs from the import endpoint and PUT media bytes directly to storage.

AI Agent Editing

Send natural-language prompts to the Underlord agent to apply Studio Sound, captions, filler-word removal, translation, dubbing, and rough-cut building.

Asynchronous Jobs

All long-running operations return a job_id; clients poll GET /v1/jobs/{job_id} or supply a callback_url for webhook delivery.

Composition Publishing

Publish compositions to public, unlisted, drive, or private access levels with configurable resolution (480p–4K) for video.

Transcript Export

Export composition transcripts in txt, markdown, html, rtf, or docx with configurable speaker labels, markers, and timecodes.

Multi-Language Transcription

Automatically transcribe imported media in 25 languages with multi-speaker detection on paid plans.

Edit-in-Descript Partner Flow

Generate one-time import URLs for partner integrations so users can hand off media into Descript with a single click.

Published Project Metadata

Retrieve metadata (download URL, privacy, subtitles in WebVTT) for published projects via a public slug endpoint.

Rate-Limit Headers

429 responses include Retry-After, X-RateLimit-Remaining, and X-RateLimit-Consumed for client-side budgeting.

Use Cases

Podcast Production Automation

Import recordings, run Studio Sound and filler-word removal, and publish episodes without opening the desktop app.

Bulk Video Captioning

Programmatically caption a backlog of videos in 25 languages and export captions for downstream platforms.

AI-Driven Rough Cuts

Send raw multitrack recordings to the agent with a prompt like "build a rough cut" and retrieve a near-finished timeline.

Translation and Dubbing

Translate and dub video content into 30+ languages with proofread review using the Business plan's translation pipeline.

Content Repurposing

Generate clips, social cuts, and shorts from long-form recordings using Underlord prompts.

Embedded Video Workflows

Use the Edit-in-Descript partner endpoint to embed Descript editing into third-party recording tools (Ecamm, Restream, SquadCast, Zoom, Captivate).

Resources

🔗
LinkedIn
LinkedIn
🌐
Portal
Portal
🔗
Documentation
Documentation
🔗
APIReference
APIReference
📝
Signup
Signup
🔗
Login
Login
💰
Pricing
Pricing
🔗
Plans
Plans
🔗
RateLimits
RateLimits
🔗
FinOps Framework Profile
Resources
🔗
CLI
CLI
💬
Support
Support
🔗
KnowledgeCenter
KnowledgeCenter
📰
Blog
Blog
👥
YouTube
YouTube
📜
TermsOfService
TermsOfService
📜
PrivacyPolicy
PrivacyPolicy
🔗
Security
Security
👥
GitHubOrganization
GitHubOrganization

Sources

Raw ↑
opencollection: 1.0.0
info:
  name: Descript API
  version: '1.2'
items:
- info:
    name: API Endpoints
    type: folder
  items:
  - info:
      name: Import media and sequences
      type: http
    http:
      method: POST
      url: https://descriptapi.com/v1/jobs/import/project_media
      body:
        type: json
        data: '{}'
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'Import media files into a new or existing project and create compositions.


      This endpoint can:

      - Create a new project if `project_id` is not provided

      - Import media files from URLs

      - Create multitrack sequences

      - Create compositions (timelines) from existing or new media in the project

      - Trigger transcription and other background processing tasks


      ### Media URL requirements

      - URLs must be accessible by Descript servers

      - URLs must support HTTP Range requests

      - Recommended to sign URLs for 12-48 '
  - info:
      name: Agent edit
      type: http
    http:
      method: POST
      url: https://descriptapi.com/v1/jobs/agent
      body:
        type: json
        data: '{}'
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'Use a background agent to create and edit projects using a natural language prompt.


      - **Edit existing project**: Provide a `project_id` to edit an existing project

      - **Target a specific composition**: Provide both `project_id` and `composition_id` to direct the agent to a specific
      composition within the project

      - **Create new project**: Provide a `project_name` instead of `project_id` to create a new project


      ### Common use cases

      - Create new content: "create a 30-second video about cooking tip'
  - info:
      name: Publish project media
      type: http
    http:
      method: POST
      url: https://descriptapi.com/v1/jobs/publish
      body:
        type: json
        data: '{}'
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: "Publish a project composition to create a shareable link and download the exported file.\n\nPublishes a specific\
      \ composition from a project, rendering the output as video or audio\nat the specified resolution. When the job completes\
      \ successfully the result contains both:\n\n- `share_url`: a public URL that can be used to view the published content\
      \ on Descript's share site.\n- `download_url`: a time-limited signed URL to download the exported media file directly,\n\
      \  along with `download_url_expires_at` "
  - info:
      name: List jobs
      type: http
    http:
      method: GET
      url: https://descriptapi.com/v1/jobs
      params:
      - name: project_id
        value: ''
        type: query
        description: Filter by project ID
      - name: type
        value: ''
        type: query
        description: Filter by job type
      - name: cursor
        value: ''
        type: query
        description: Cursor for the next page of results, obtained from `pagination.next_cursor` in a previous response
      - name: limit
        value: ''
        type: query
        description: Number of items per page (1-100). Defaults to 20.
      - name: created_after
        value: ''
        type: query
        description: 'Filter jobs created after this timestamp (ISO 8601). Default: 7 days ago. Oldest allowed: 30 days ago.'
      - name: created_before
        value: ''
        type: query
        description: 'Filter jobs created before this timestamp (ISO 8601). Default: now.'
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'List recent jobs with optional filtering by project or job type.


      By default, jobs created within the last 7 days are returned. Use `created_after` and

      `created_before` to customize the time range. The maximum lookback is 30 days.


      Results are paginated. Use the `cursor` from the response `pagination.next_cursor` to

      fetch subsequent pages.


      Query parameters allow you to filter the results:

      * Filter by `project_id` to see all jobs for a project

      * Filter by `type` to see specific job types (import'
  - info:
      name: Get job status
      type: http
    http:
      method: GET
      url: https://descriptapi.com/v1/jobs/:job_id
      params:
      - name: job_id
        value: ''
        type: path
        description: The job ID
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'Retrieve the status of any job.


      The response format varies based on job type and includes type-specific fields.

      '
  - info:
      name: Cancel job
      type: http
    http:
      method: DELETE
      url: https://descriptapi.com/v1/jobs/:job_id
      params:
      - name: job_id
        value: ''
        type: path
        description: The job ID
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'Cancel a running job.

      '
  - info:
      name: List projects
      type: http
    http:
      method: GET
      url: https://descriptapi.com/v1/projects
      params:
      - name: name
        value: ''
        type: query
        description: Filter projects whose name contains this string (case-insensitive).
      - name: folder_path
        value: ''
        type: query
        description: Filter projects by folder path (e.g. "Clients/Acme/Videos"). Use "/" to separate nested folders. Returns
          only projects directly inside the deepest folder.
      - name: created_by
        value: ''
        type: query
        description: Filter projects created by this user UUID. Pass `me` to filter by the authenticated user.
      - name: created_after
        value: ''
        type: query
        description: Filter projects created after this ISO 8601 timestamp.
      - name: created_before
        value: ''
        type: query
        description: Filter projects created before this ISO 8601 timestamp.
      - name: updated_after
        value: ''
        type: query
        description: Filter projects updated after this ISO 8601 timestamp.
      - name: updated_before
        value: ''
        type: query
        description: Filter projects updated before this ISO 8601 timestamp.
      - name: sort
        value: ''
        type: query
        description: Sort field. Defaults to created_at.
      - name: direction
        value: ''
        type: query
        description: Sort direction. Defaults to desc.
      - name: cursor
        value: ''
        type: query
        description: Pagination cursor from a previous response's `pagination.next_cursor`.
      - name: limit
        value: ''
        type: query
        description: Number of projects per page (1-100). Defaults to 20.
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'List projects accessible to the authenticated user within a drive.


      The drive is determined from the access token.


      Results are paginated. Use the `cursor` from the response `pagination.next_cursor`

      to fetch subsequent pages.

      '
  - info:
      name: Get project details
      type: http
    http:
      method: GET
      url: https://descriptapi.com/v1/projects/:project_id
      params:
      - name: project_id
        value: ''
        type: path
        description: The project UUID
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'Get a detailed project summary including all media files and compositions.


      Returns the project''s id, name, drive_id, a map of media files (keyed by

      display path) with type and duration, and a list of compositions with id,

      name, duration, and media type.


      Use this to inspect a project''s contents before editing or importing media.

      '
  - info:
      name: Check API status
      type: http
    http:
      method: GET
      url: https://descriptapi.com/v1/status
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: '> **Work in progress** — This endpoint is not yet available and will return an error if called.


      Check API availability and validate authentication token.


      This endpoint can be used to:

      - Verify that your authentication token is valid

      - Check API connectivity without performing any heavy operations


      Returns a success response if the token is valid, or a 401 error if the token is invalid or missing.

      '
- info:
    name: Export from Descript
    type: folder
  items:
  - info:
      name: Get Published Project Metadata
      type: http
    http:
      method: GET
      url: https://descriptapi.com/v1/published_projects/:publishedProjectSlug
      params:
      - name: publishedProjectSlug
        value: ''
        type: path
        description: The unique URL slug identifying the published project
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: 'Retrieve metadata for a published Descript project by its URL slug. This endpoint provides information

      about the published project including title, duration, publisher details, privacy settings, and subtitles.


      This endpoint requires authentication using a personal token and is subject to rate limiting of 1000

      requests per hour per user.

      '
- info:
    name: Edit in Descript
    type: folder
  items:
  - info:
      name: Create Import URL
      type: http
    http:
      method: POST
      url: https://descriptapi.com/v1/edit_in_descript/schema
      body:
        type: json
        data: '{}'
      auth:
        type: bearer
        token: '{{bearerToken}}'
    docs: "Create an Import URL by sending a Project schema to Descript API from your service's backend.\n\n### Import Schema\n\
      Our import schemas are specified as a minimal JSON list of files which is detailed in full at the bottom of this\nsection.\
      \ At it's smallest, the request body looks like:\n\n```\n{\n  \"partner_drive_id\": \"162c61d1-6ced-4b25-a622-7dba922983ee\"\
      ,\n  \"project_schema\": {\n    \"schema_version\": \"1.0.0\",\n    \"files\": [{\"uri\": \"https://descriptusercontent.com/jane.wav?signature=d182bca64bf94a1483d2fd"
bundled: true