Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.1.0
info:
title: Alto API
version: '2026-11-01'
description: 'GENERATED FROM DOCUMENTATION by API Evangelist on 2026-11-01: 31 operation(s) read from 1 public documentation page(s) (each operation
names its page in x-source). This is not the provider''s published contract; Alto has published no machine-readable contract that the pipeline
could find. Engine: local.'
x-evidence-tiers:
code-example: 35
documentation: -4
pages-with-code: 1
pages-read: 1
x-generated-from: documentation
x-provenance: generated
x-authored-by: API Evangelist
x-generated: '2026-11-01'
x-generator: generate-contract-from-docs.py
x-engine: local
x-sources:
- https://alto.video/docs/api
paths:
/api/activity:
get:
operationId: get_api_activity
tags:
- Api
summary: GET /api/activity
x-source: https://alto.video/docs/api
parameters:
- name: before
in: query
required: false
schema:
type: string
responses:
'200':
description: Success (shape read from the example response on the page)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiActivityResponse'
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS \"https://alto.video/api/activity?before=MjAyNi0wOS0yNVQwOTo0MToxNy4wMzZafGIyYzdlOWE0LTVmMWQtNGIzZS04YTZjLTlkMGUyZjdiMWM1OA\"\
\ -H \"Authorization: Bearer $ALTO_API_KEY\"\n Transcripts and chapters \n On every plan, Alto makes a transcript for each video when\
\ it processes the file: the transcript itself, captions for the share page, and chapters when the video has speech, has no chapters\
\ yet and"
/api/billing:
get:
operationId: get_api_billing
tags:
- Api
summary: GET /api/billing
x-source: https://alto.video/docs/api
responses:
'200':
description: Success (shape read from the example response on the page)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiBillingResponse'
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS https://alto.video/api/billing -H \"Authorization: Bearer $ALTO_API_KEY\"\n Uploads \n A video file goes up in parts\
\ through /api/uploads . The finished upload answers a src , which POST /api/library turns into a video, or PATCH /api/videos/{id} uses\
\ to replace a video's file. Images for covers go up in one request to POST /api/upload . \n POST /api/uploads \n Starts an upload in\
\ parts. This is"
/api/capabilities:
get:
operationId: get_api_capabilities
tags:
- Api
summary: GET /api/capabilities
x-source: https://alto.video/docs/api
responses:
'200':
description: Success (status as documented)
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS https://alto.video/api/capabilities -H \"Authorization: Bearer $ALTO_API_KEY\"\n GET /api/billing \n The account's\
\ plan, how it is paid for, and this month's use against the plan's limits. \n Response 200 : \n Field Type Notes \n plan string free\
\ or pro . \n source string or null Why the account is on Pro: polar (a subscription) or grant (Pro given by Alto). null on Free. \n\
\ interval string month "
/api/connect:
post:
operationId: post_api_connect
tags:
- Api
summary: POST /api/connect
x-source: https://alto.video/docs/api
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiConnectRequest'
responses:
'201':
description: Success (status as documented)
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS -X POST https://alto.video/api/connect -H \"Content-Type: application/json\" -d '{\"machine\":\"build-server-2\"\
}'\n GET /api/connect/{code} \n Reports where a connect request stands, and hands over the key once. No key. \n Path: code is the code\
\ from POST /api/connect . \n Response 200 : \n Field Type Notes \n status string pending (not approved yet), approved , claimed (a\
\ poll already collected t"
/api/connect/{code}:
get:
operationId: get_api_connect_code
tags:
- Api
summary: GET /api/connect/{code}
x-source: https://alto.video/docs/api
parameters:
- name: code
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiConnectCodeResponse'
x-evidence:
kind: documentation
/api/library:
get:
operationId: get_api_library
tags:
- Api
summary: GET /api/library
x-source: https://alto.video/docs/api
responses:
'200':
description: Success (status as documented)
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS https://alto.video/api/library -H \"Authorization: Bearer $ALTO_API_KEY\"\n GET /api/videos/{id} \n One video, with\
\ its share links. alto status and alto chapters read it. \n Path: id is the video's id. \n Response 200 : \n Field Type Notes \n video\
\ object The video object , with retention . \n generatedChapters array The chapters this file's transcript generated, which \"chapters\"\
: \"generated\" put"
post:
operationId: post_api_library
tags:
- Api
summary: POST /api/library
x-source: https://alto.video/docs/api
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiLibraryRequest'
responses:
'201':
description: Success (status as documented)
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS -X POST https://alto.video/api/library -H \"Authorization: Bearer $ALTO_API_KEY\" -H \"Content-Type: application/json\"\
\ -d '{\"title\":\"Fleet QA for Pruitt Logistics\",\"description\":\"The three-minute walkthrough of Fleet QA at the Reno depot.\"\
,\"duration\":184,\"src\":\"/api/media/uploads/Xb7kQ2mNp4Rt9vLw3yZs8cDf1gHj6KaE/0b7e4f2a-9c1d-4e8b-a6f3-5d2c8e1b9a70.mp4\",\"poster\"\
:\"\"}'\n GET /api/library \n Ev"
/api/links:
get:
operationId: get_api_links
tags:
- Api
summary: GET /api/links
x-source: https://alto.video/docs/api
parameters:
- name: video
in: query
required: false
schema:
type: string
responses:
'200':
description: Success (shape read from the example response on the page)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiLinksResponse'
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS \"https://alto.video/api/links?video=3f9c2a71b8d44e0f9a6c15e2d7b08c43\" -H \"Authorization: Bearer $ALTO_API_KEY\"\
\n PATCH /api/links/{id} \n Changes who a link is for, its note, whether it works, or when it expires. Send any of the fields below;\
\ the rest stay as they are. \n Path: id is the link's id. \n Body: \n Field Type Notes \n name string 1 to 120 characters. label is\
\ taken instead when nam"
/api/links/{id}:
patch:
operationId: patch_api_links_id
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/PatchApiLinksIdRequest'
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PatchApiLinksIdResponse'
x-evidence:
kind: documentation
/api/me:
get:
operationId: get_api_me
tags:
- Api
summary: GET /api/me
x-source: https://alto.video/docs/api
responses:
'200':
description: Success (status as documented)
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS https://alto.video/api/me -H \"Authorization: Bearer $ALTO_API_KEY\"\n GET /api/capabilities \n What the account can\
\ upload: the plan's limits, what this month has used, and whether Alto converts files on this deployment. The key is optional. Without\
\ a working key, the answer is the Free plan's numbers with nothing used. \n Response 200 : \n Field Type Notes \n transcoding boolean\
\ Whether Alto c"
/api/upload:
post:
operationId: post_api_upload
tags:
- Api
summary: POST /api/upload
x-source: https://alto.video/docs/api
responses:
'201':
description: Success (status as documented)
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS -X POST https://alto.video/api/upload -H \"Authorization: Bearer $ALTO_API_KEY\" -H \"Content-Type: image/jpeg\" \
\ --data-binary @cover.jpg\n Videos \n The video object \n GET /api/videos/{id} , PATCH /api/videos/{id} , POST /api/videos/{id}/keep\
\ and GET /api/library answer videos in this shape. \n Field Type Notes \n id string The video's id. \n userId string The account's\
\ id. \n title string \n des"
/api/uploads:
post:
operationId: post_api_uploads
tags:
- Api
summary: POST /api/uploads
x-source: https://alto.video/docs/api
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiUploadsRequest'
responses:
'201':
description: Success (shape read from the example response on the page)
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiUploadsResponse'
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS -X POST https://alto.video/api/uploads -H \"Authorization: Bearer $ALTO_API_KEY\" -H \"Content-Type: application/json\"\
\ -d '{\"type\":\"video/mp4\",\"bytes\":131072000,\"duration\":184}'\n PUT /api/uploads/{uploadId}/parts/{part} \n Stores one part\
\ of an upload. Part n is the file's bytes from (n - 1) × partBytes up to, but not including, n × partBytes , or to the end of the file\
\ for the last part. \n"
/api/uploads/{uploadid}:
delete:
operationId: delete_api_uploads_uploadid
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: uploadid
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteApiUploadsUploadidResponse'
x-evidence:
kind: documentation
/api/uploads/{uploadid}/complete:
post:
operationId: post_api_uploads_uploadid_complete
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: uploadid
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiUploadsUploadidCompleteRequest'
responses:
'201':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiUploadsUploadidCompleteResponse'
x-evidence:
kind: documentation
/api/uploads/{uploadid}/parts/{part}:
put:
operationId: put_api_uploads_uploadid_parts_part
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: uploadid
in: path
required: true
schema:
type: string
- name: part
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PutApiUploadsUploadidPartsPartResponse'
x-evidence:
kind: documentation
/api/videos/{id}:
delete:
operationId: delete_api_videos_id
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/DeleteApiVideosIdResponse'
x-evidence:
kind: documentation
get:
operationId: get_api_videos_id
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiVideosIdResponse'
x-evidence:
kind: documentation
patch:
operationId: patch_api_videos_id
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/PatchApiVideosIdRequest'
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PatchApiVideosIdResponse'
x-evidence:
kind: documentation
/api/videos/{id}/analytics:
get:
operationId: get_api_videos_id_analytics
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiVideosIdAnalyticsResponse'
x-evidence:
kind: documentation
/api/videos/{id}/captions:
get:
operationId: get_api_videos_id_captions
tags:
- Api
summary: GET /api/videos/{id}/captions
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiVideosIdCaptionsResponse'
x-evidence:
kind: documentation
/api/videos/{id}/email-thumbnail:
get:
operationId: get_api_videos_id_email_thumbnail
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiVideosIdEmailThumbnailResponse'
x-evidence:
kind: documentation
put:
operationId: put_api_videos_id_email_thumbnail
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PutApiVideosIdEmailThumbnailRequest'
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PutApiVideosIdEmailThumbnailResponse'
x-evidence:
kind: documentation
/api/videos/{id}/keep:
post:
operationId: post_api_videos_id_keep
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'201':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiVideosIdKeepResponse'
x-evidence:
kind: documentation
/api/videos/{id}/links:
patch:
operationId: patch_api_videos_id_links
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PatchApiVideosIdLinksRequest'
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PatchApiVideosIdLinksResponse'
x-evidence:
kind: documentation
post:
operationId: post_api_videos_id_links
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiVideosIdLinksRequest'
responses:
'201':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiVideosIdLinksResponse'
x-evidence:
kind: documentation
/api/videos/{id}/moments:
get:
operationId: get_api_videos_id_moments
tags:
- Api
summary: GET /api/videos/{id}/moments
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiVideosIdMomentsResponse'
x-evidence:
kind: documentation
/api/videos/{id}/status:
get:
operationId: get_api_videos_id_status
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiVideosIdStatusResponse'
x-evidence:
kind: documentation
/api/videos/{id}/transcript:
get:
operationId: get_api_videos_id_transcript
tags:
- Api
summary: GET /api/videos/{id}/transcript
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiVideosIdTranscriptResponse'
x-evidence:
kind: documentation
post:
operationId: post_api_videos_id_transcript
tags:
- Api
summary: POST /api/videos/{id}/transcript
x-source: https://alto.video/docs/api
parameters:
- name: id
in: path
required: true
schema:
type: string
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/PostApiVideosIdTranscriptRequest'
responses:
'202':
description: Success (status as documented)
x-evidence:
kind: documentation
/api/viewers:
get:
operationId: get_api_viewers
tags:
- Api
summary: GET /api/viewers
x-source: https://alto.video/docs/api
parameters:
- name: filter
in: query
required: false
schema:
type: string
responses:
'200':
description: Success (status as documented)
x-evidence:
kind: code-example
language: curl
snippet: "curl -sS \"https://alto.video/api/viewers?filter=engaged\" -H \"Authorization: Bearer $ALTO_API_KEY\"\n GET /api/viewers/{key}\
\ \n One person's whole story: plays, how much they watched, replays, the videos they opened, and what they did, newest first. \n Plan:\
\ Pro, with a key or in the studio. \n Path: key is a row's key from GET /api/viewers , URL-encoded ( r%3Adana%40pruitt.example ). \n\
\ Response 200 : \n"
/api/viewers/{key}:
get:
operationId: get_api_viewers_key
tags:
- Api
summary: 'Alto API Reference: Uploads, Links, Viewers and Analytics'
x-source: https://alto.video/docs/api
parameters:
- name: key
in: path
required: true
schema:
type: string
responses:
'200':
description: Success (status as documented)
content:
application/json:
schema:
$ref: '#/components/schemas/GetApiViewersKeyResponse'
x-evidence:
kind: documentation
components:
schemas:
GetApiActivityResponse:
type: object
properties:
state:
type: string
segments:
type: array
items: {}
language:
type: string
error:
type: string
chapters:
type: integer
blocked:
type: string
GetApiBillingResponse:
type: object
properties:
part:
type: integer
etag:
type: string
PostApiConnectRequest:
type: object
properties:
machine:
type: string
GetApiConnectCodeResponse:
type: object
properties:
status:
type: string
description: pending, approved, claimed, or expired
key:
type: string
description: API key (only on first approved poll)
email:
type: string
description: Account email (when key present)
name:
type: string
description: Account name (when key present)
PostApiLibraryRequest:
type: object
properties:
title:
type: string
description:
type: string
duration:
type: integer
src:
type: string
poster:
type: string
GetApiLinksResponse:
type: object
properties:
link:
type: object
properties:
id:
type: string
videoId:
type: string
videoTitle:
type: string
url:
type: string
path:
type: string
name:
type: string
email:
type: string
company:
type: string
title:
type: string
note:
type: string
createdAt:
type: string
format: date-time
expiresAt:
type:
- string
- 'null'
disabledAt:
type: string
format: date-time
status:
type: string
expiringSoon:
type: boolean
watchedPct:
type:
- string
- 'null'
views:
type: integer
lastViewedAt:
type:
- string
- 'null'
PatchApiLinksIdRequest:
type: object
properties:
name:
type: string
description: New recipient name
email:
type: string
description: New recipient email
company:
type: string
description: New recipient company
PatchApiLinksIdResponse:
type: object
properties:
ok:
type: boolean
description: true if update succeeded
PostApiUploadsRequest:
type: object
properties:
type:
type: string
bytes:
type: integer
duration:
type: integer
PostApiUploadsResponse:
type: object
properties:
part:
type: integer
etag:
type: string
DeleteApiUploadsUploadidResponse:
type: object
properties:
ok:
type: boolean
description: true if cancelled.
PostApiUploadsUploadidCompleteRequest:
type: object
properties:
parts:
type: array
description: Array of {part, etag} for each part.
required:
- parts
PostApiUploadsUploadidCompleteResponse:
type: object
properties:
src:
type: string
description: The file, for src in POST /api/library or PATCH /api/videos/{id}.
PutApiUploadsUploadidPartsPartResponse:
type: object
properties:
part:
type: number
description: The part number.
etag:
type: string
description: Keep it for complete.
DeleteApiVideosIdResponse:
type: object
properties:
ok:
type: boolean
description: true if deletion succeeded
GetApiVideosIdResponse:
type: object
properties:
video:
type: object
description: The full video object with retention.
generatedChapters:
type: array
description: Chapters generated from transcript.
slug:
type: string
description: The link name.
sharePath:
type: string
description: What follows /v/ in the main share link.
shareUrl:
type: string
description: The main share link.
links:
type: array
description: Recipient links for the video.
PatchApiVideosIdRequest:
type: object
properties:
title:
type: string
description: New title.
description:
type: string
description: New description.
duration:
type: number
description: New length in seconds.
src:
type: string
description: New src from a completed upload.
poster:
type: string
description: New poster src.
slug:
type: string
description: New link name.
PatchApiVideosIdResponse:
type: object
properties:
ok:
type: boolean
description: true if updated.
GetApiVideosIdAnalyticsResponse:
type: object
properties:
analytics:
type: object
description: Analytics data for the video
GetApiVideosIdCaptionsResponse:
type: object
properties:
captions:
type: string
description: WebVTT caption file
GetApiVideosIdEmailThumbnailResponse:
type: object
properties:
emailThumbnail:
type: string
description: URL of the email thumbnail image
PutApiVideosIdEmailThumbnailRequest:
type: object
properties:
emailThumbnail:
type: string
description: New thumbnail image URL
required:
- emailThumbnail
PutApiVideosIdEmailThumbnailResponse:
type: object
properties:
ok:
type: boolean
description: true if update succeeded
PostApiVideosIdKeepResponse:
type: object
properties:
ok:
type: boolean
description: true if keep succeeded
PatchApiVideosIdLinksRequest:
type: object
properties:
links:
type: array
description: Array of link objects to replace existing links
required:
- links
PatchApiVideosIdLinksResponse:
type: object
properties:
ok:
type: boolean
description: true if replacement succeeded
PostApiVideosIdLinksRequest:
type: object
properties:
name:
type: string
description: Recipient name
email:
type: string
description: Recipient email
company:
type: string
description: Recipient company
required:
- name
- email
PostApiVideosIdLinksResponse:
type: object
properties:
link:
type: object
description: Created link object
GetApiVideosIdMomentsResponse:
type: object
properties:
moments:
type: array
description: Array of moments (details not listed on the page)
GetApiVideosIdStatusResponse:
type: object
properties:
status:
type: string
description: Video status (processing, ready, failed, archived)
transcodeState:
type: string
description: Conversion state (pending, running, done, failed, skipped)
GetApiVideosIdTranscriptResponse:
type: object
properties:
transcript:
type: object
description: Transcript data (fields not detailed on the page)
PostApiVideosIdTranscriptRequest:
type: object
properties:
language:
type: string
description: Optional language code
GetApiViewersKeyResponse:
type: object
properties:
viewer:
type: object
description: Viewer details
securitySchemes:
bearer:
type: http
scheme: bearer
security:
- bearer: []
tags:
- name: Api