Happy Scribe Organization Memberships API
Manage who belongs to an organization - list memberships, add a member by email with a role, update a member's role, and remove a member. Enables programmatic workspace and seat administration.
Manage who belongs to an organization - list memberships, add a member by email with a role, update a member's role, and remove a member. Enables programmatic workspace and seat administration.
openapi: 3.0.3
info:
title: Happy Scribe API
description: >-
The Happy Scribe API turns audio and video into text and subtitles
programmatically. Submit work through the Orders API (automatic/machine or
professional/human service), manage the resulting transcriptions, export
finished transcripts into 15+ formats (SRT, VTT, STL, DOCX, PDF, TXT, JSON,
CSV, XLSX, and editing-suite formats), and administer organizations and their
members. Files are ingested by public URL or via a signed upload. All requests
are REST over HTTPS and authenticated with a Bearer API token from your Happy
Scribe account settings. Base URL https://www.happyscribe.com/api/v1. Endpoint
paths and fields are grounded in the public developer documentation
(dev.happyscribe.com); request/response schemas below are honestly modeled
from that documentation and may not enumerate every field.
version: '1.0'
contact:
name: Happy Scribe
url: https://dev.happyscribe.com
servers:
- url: https://www.happyscribe.com/api/v1
description: Happy Scribe API v1
security:
- bearerAuth: []
tags:
- name: Transcriptions
description: List, retrieve, update, and delete transcriptions.
- name: Orders
description: Create and track transcription, subtitling, and translation orders.
- name: Exports
description: Render finished transcripts into downloadable files.
- name: Organizations
description: Organizations (workspaces) the authenticated user belongs to.
- name: Organization Memberships
description: Manage members and roles within an organization.
- name: Uploads
description: Signed upload URLs for local media files.
- name: Glossaries and Style Guides
description: Reusable glossaries and style guides attachable to orders.
paths:
/transcriptions:
get:
operationId: listTranscriptions
tags:
- Transcriptions
summary: List transcriptions
description: Lists transcriptions in an organization.
parameters:
- name: organization_id
in: query
required: false
description: Filter transcriptions by organization.
schema:
type: string
- name: folder_id
in: query
required: false
description: Filter transcriptions by folder.
schema:
type: string
responses:
'200':
description: A list of transcriptions.
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/Transcription'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createTranscription
tags:
- Transcriptions
summary: Create a transcription (deprecated)
description: >-
Deprecated. Creating a transcription directly is superseded by the Orders
API; use POST /orders instead. Retained here because it remains documented
for backward compatibility.
deprecated: true
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TranscriptionInput'
responses:
'201':
description: The created transcription.
content:
application/json:
schema:
$ref: '#/components/schemas/Transcription'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/transcriptions/{id}:
parameters:
- $ref: '#/components/parameters/Id'
get:
operationId: getTranscription
tags:
- Transcriptions
summary: Retrieve a transcription
description: Retrieves a single transcription by ID, including its state and metadata.
responses:
'200':
description: The requested transcription.
content:
application/json:
schema:
$ref: '#/components/schemas/Transcription'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
patch:
operationId: updateTranscription
tags:
- Transcriptions
summary: Update a transcription
description: Updates editable details of a transcription, such as its name or folder.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
folder_id:
type: string
responses:
'200':
description: The updated transcription.
content:
application/json:
schema:
$ref: '#/components/schemas/Transcription'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationError'
delete:
operationId: deleteTranscription
tags:
- Transcriptions
summary: Delete a transcription
description: Deletes a transcription.
responses:
'204':
description: The transcription was deleted.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/transcriptions/{id}/summary:
parameters:
- $ref: '#/components/parameters/Id'
get:
operationId: getTranscriptionSummary
tags:
- Transcriptions
summary: Retrieve a transcription summary
description: >-
Retrieves the AI-generated summary for a transcription (for example, a
meeting summary), when available.
responses:
'200':
description: The transcription summary.
content:
application/json:
schema:
type: object
properties:
id:
type: string
summary:
type: string
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/orders:
post:
operationId: createOrder
tags:
- Orders
summary: Create a transcription or subtitling order
description: >-
Creates an order to transcribe or subtitle a media file from a URL, using
automatic (machine) or professional (human) service. This is the preferred
way to submit new work.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/OrderInput'
responses:
'201':
description: The created order.
content:
application/json:
schema:
$ref: '#/components/schemas/Order'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/orders/translation:
post:
operationId: createTranslationOrder
tags:
- Orders
summary: Create a translation order
description: Creates an order to translate an existing transcription into a target language.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- transcription_id
- target_language
properties:
transcription_id:
type: string
target_language:
type: string
description: BCP-47 target language code.
service:
type: string
enum:
- auto
- pro
responses:
'201':
description: The created translation order.
content:
application/json:
schema:
$ref: '#/components/schemas/Order'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/orders/{id}:
parameters:
- $ref: '#/components/parameters/Id'
get:
operationId: getOrder
tags:
- Orders
summary: Retrieve an order
description: Retrieves an order by ID, including its state.
responses:
'200':
description: The requested order.
content:
application/json:
schema:
$ref: '#/components/schemas/Order'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/orders/{id}/confirm:
parameters:
- $ref: '#/components/parameters/Id'
post:
operationId: confirmOrder
tags:
- Orders
summary: Confirm an incomplete order
description: >-
Confirms an order that was created in an incomplete state, submitting it
for processing.
responses:
'200':
description: The confirmed order.
content:
application/json:
schema:
$ref: '#/components/schemas/Order'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationError'
/exports:
post:
operationId: createExport
tags:
- Exports
summary: Create an export
description: >-
Creates an export that renders one or more transcriptions into a
downloadable file in the requested format.
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ExportInput'
responses:
'201':
description: The created export.
content:
application/json:
schema:
$ref: '#/components/schemas/Export'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/exports/{id}:
parameters:
- $ref: '#/components/parameters/Id'
get:
operationId: getExport
tags:
- Exports
summary: Retrieve an export
description: >-
Retrieves an export by ID. Poll this endpoint until the state is ready,
then use the download link.
responses:
'200':
description: The requested export.
content:
application/json:
schema:
$ref: '#/components/schemas/Export'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/organizations:
get:
operationId: listOrganizations
tags:
- Organizations
summary: List organizations
description: Lists the organizations the authenticated user belongs to.
responses:
'200':
description: A list of organizations.
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/Organization'
'401':
$ref: '#/components/responses/Unauthorized'
/organization_memberships:
get:
operationId: listOrganizationMemberships
tags:
- Organization Memberships
summary: List organization memberships
description: Lists memberships, optionally filtered by organization.
parameters:
- name: organization_id
in: query
required: false
description: Filter memberships by organization.
schema:
type: string
responses:
'200':
description: A list of memberships.
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/OrganizationMembership'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createOrganizationMembership
tags:
- Organization Memberships
summary: Add a member to an organization
description: Adds a user to an organization by email, with a role.
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- organization_id
- email
properties:
organization_id:
type: string
email:
type: string
format: email
role:
type: string
enum:
- admin
- member
responses:
'201':
description: The created membership.
content:
application/json:
schema:
$ref: '#/components/schemas/OrganizationMembership'
'401':
$ref: '#/components/responses/Unauthorized'
'422':
$ref: '#/components/responses/ValidationError'
/organization_memberships/{id}:
parameters:
- $ref: '#/components/parameters/Id'
patch:
operationId: updateOrganizationMembership
tags:
- Organization Memberships
summary: Update a membership
description: Updates a member's role in an organization.
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
role:
type: string
enum:
- admin
- member
responses:
'200':
description: The updated membership.
content:
application/json:
schema:
$ref: '#/components/schemas/OrganizationMembership'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'422':
$ref: '#/components/responses/ValidationError'
delete:
operationId: deleteOrganizationMembership
tags:
- Organization Memberships
summary: Remove a member
description: Removes a member from an organization.
responses:
'204':
description: The membership was removed.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/uploads/new:
get:
operationId: newUpload
tags:
- Uploads
summary: Request a signed upload URL
description: >-
Returns a signed URL to which a local media file can be PUT. The returned
temporary URL is then passed as tmp_url / url when creating a transcription
or order.
parameters:
- name: filename
in: query
required: true
description: The name of the file to be uploaded.
schema:
type: string
responses:
'200':
description: A signed upload URL.
content:
application/json:
schema:
$ref: '#/components/schemas/Upload'
'401':
$ref: '#/components/responses/Unauthorized'
/glossaries:
get:
operationId: listGlossaries
tags:
- Glossaries and Style Guides
summary: List glossaries
description: Lists the glossaries available in an organization.
parameters:
- name: organization_id
in: query
required: true
description: The organization to list glossaries for.
schema:
type: string
responses:
'200':
description: A list of glossaries.
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/Glossary'
'401':
$ref: '#/components/responses/Unauthorized'
/style_guides:
get:
operationId: listStyleGuides
tags:
- Glossaries and Style Guides
summary: List style guides
description: Lists the style guides available in an organization.
parameters:
- name: organization_id
in: query
required: true
description: The organization to list style guides for.
schema:
type: string
responses:
'200':
description: A list of style guides.
content:
application/json:
schema:
type: object
properties:
results:
type: array
items:
$ref: '#/components/schemas/StyleGuide'
'401':
$ref: '#/components/responses/Unauthorized'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: >-
API token from your Happy Scribe account settings, passed as
`Authorization: Bearer YOUR_API_TOKEN`.
parameters:
Id:
name: id
in: path
required: true
description: The unique identifier of the resource.
schema:
type: string
responses:
Unauthorized:
description: Missing or invalid Bearer token.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: The requested resource was not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
ValidationError:
description: The request payload failed validation.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
Error:
type: object
properties:
error:
type: string
message:
type: string
TranscriptionInput:
type: object
required:
- name
- language
- tmp_url
- organization_id
properties:
name:
type: string
language:
type: string
description: BCP-47 language code of the audio.
tmp_url:
type: string
format: uri
description: Public or signed URL of the media file to transcribe.
service:
type: string
enum:
- auto
- pro
- alignment
organization_id:
type: string
folder_id:
type: string
is_subtitle:
type: boolean
default: false
tags:
type: array
items:
type: string
Transcription:
type: object
properties:
id:
type: string
name:
type: string
state:
type: string
description: Processing state of the transcription.
language:
type: string
audioLengthInSeconds:
type: number
costInCents:
type: integer
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
OrderInput:
type: object
required:
- url
- language
- organization_id
properties:
url:
type: string
format: uri
description: Public or signed URL of the media file.
language:
type: string
description: BCP-47 language code.
organization_id:
type: string
service:
type: string
enum:
- auto
- pro
is_subtitle:
type: boolean
default: false
confirm:
type: boolean
description: When true, submit immediately instead of leaving the order incomplete.
glossary_ids:
type: array
items:
type: string
style_guide_id:
type: string
Order:
type: object
properties:
id:
type: string
state:
type: string
enum:
- incomplete
- waiting_for_payment
- submitted
- locked
- fulfilled
- failed
- canceled
- expired
service:
type: string
language:
type: string
transcription_ids:
type: array
items:
type: string
createdAt:
type: string
format: date-time
ExportInput:
type: object
required:
- format
- transcription_ids
properties:
format:
type: string
description: >-
Output format, e.g. txt, docx, pdf, srt, vtt, stl, json, csv, xlsx,
mp3, mp4, and editing-suite formats.
transcription_ids:
type: array
items:
type: string
show_timestamps:
type: boolean
show_speakers:
type: boolean
show_comments:
type: boolean
show_highlights:
type: boolean
Export:
type: object
properties:
id:
type: string
state:
type: string
enum:
- pending
- processing
- ready
- expired
- failed
format:
type: string
download_link:
type: string
format: uri
description: Present when the export state is ready.
Organization:
type: object
properties:
id:
type: string
name:
type: string
role:
type: string
enum:
- owner
- admin
- member
- guest
membersCount:
type: integer
currency:
type: string
isHumanTranscriptionAllowed:
type: boolean
isHumanTranslationAllowed:
type: boolean
OrganizationMembership:
type: object
properties:
id:
type: string
email:
type: string
format: email
name:
type: string
role:
type: string
enum:
- admin
- member
organizationId:
type: string
organizationName:
type: string
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
Upload:
type: object
properties:
url:
type: string
format: uri
description: Signed URL to PUT the file to.
tmp_url:
type: string
format: uri
description: Temporary URL to pass when creating a transcription or order.
Glossary:
type: object
properties:
id:
type: string
name:
type: string
organizationId:
type: string
StyleGuide:
type: object
properties:
id:
type: string
name:
type: string
organizationId:
type: string