API Reference
Last updated: April 17, 2026
Overview
The Echosaw REST API lets you programmatically submit media for analysis, poll for processing status, retrieve intelligence results, and search your media library. All endpoints live under the /v1/ path prefix.
Getting Started
- Subscribe — Choose a Starter, Growth, Pro, or Agency plan. Your API key and base URL are delivered in the welcome email.
- Authenticate — Include your API key in every request using the
X-Api-Keyheader. No other credentials are required. - Submit media — Call
POST /v1/analyzewith the media type and filename. You will receive a pre-signed upload URL. - Upload the file —
PUTyour file to the upload URL returned in step 3. - Poll for status — Call
GET /v1/analysis/status/{mediaId}until the status iscomplete. - Retrieve results — Call
GET /v1/analysis/results/{mediaId}to fetch the full intelligence report.
Base URL
Your API base URL is included in the welcome email you received at subscription time. All /v1/ paths are relative to this base URL.
https://api.echosaw.com/v1/
If your welcome email contains a different base URL, use that instead.
Authentication
Every request must include an X-Api-Key header containing the API key from your welcome email. No other credentials or tokens are required.
X-Api-Key: your-api-key
Your API key is shown once in the welcome email and is not recoverable. Store it securely. If your key is lost or compromised, contact support for a replacement.
Endpoints
POST /v1/analyze
Submit media for analysis. Returns a job ID and a pre-signed upload URL.
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
mediaType | string | Yes | One of video, audio, or image |
originalFilename | string | No | Original filename for reference |
fileSize | number | No | File size in bytes |
contentType | string | No | MIME type (e.g. video/mp4) |
Example Request
curl -X POST https://api.echosaw.com/v1/analyze \
-H "X-Api-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{
"mediaType": "video",
"originalFilename": "interview.mp4",
"fileSize": 52428800,
"contentType": "video/mp4"
}'Response 200 OK
{
"jobId": "38be3491-b9a4-446f-b3f5-95380576baf4",
"mediaId": "38be3491-b9a4-446f-b3f5-95380576baf4",
"uploadUrl": "https://...presigned-s3-url..."
}After receiving the response, upload your file with a PUT request to the uploadUrl. The URL expires in 15 minutes.
curl -X PUT "UPLOAD_URL_FROM_RESPONSE" \ -H "Content-Type: video/mp4" \ --data-binary @interview.mp4
GET /v1/analysis/status/{mediaId}
Poll for the current processing status of a submitted job.
Path Parameters
| Parameter | Type | Description |
|---|---|---|
mediaId | string (UUID) | The mediaId returned by POST /v1/analyze |
Example Request
curl https://api.echosaw.com/v1/analysis/status/38be3491-b9a4-446f-b3f5-95380576baf4 \ -H "X-Api-Key: your-api-key"
Response 200 OK
{
"mediaId": "38be3491-b9a4-446f-b3f5-95380576baf4",
"status": "processing",
"createdAt": 1773087339,
"updatedAt": 1773087726
}Status Values
| Status | Description |
|---|---|
pending | Upload received, awaiting processing |
processing | Analysis in progress |
complete | Analysis finished — results are ready |
failed | Analysis encountered an error |
GET /v1/analysis/results/{mediaId}
Retrieve the full intelligence report for a completed analysis. Only returns data when status is complete.
Example Request
curl https://api.echosaw.com/v1/analysis/results/38be3491-b9a4-446f-b3f5-95380576baf4 \ -H "X-Api-Key: your-api-key"
Response 200 OK
{
"videoId": "38be3491-...",
"mediaType": "VIDEO",
"createdAt": "2026-03-09T20:15:39.000Z",
"summary": {
"title": "string",
"description": "string",
"primarySubject": "string",
"categories": "string"
},
"transcript": {
"fullText": "string",
"wordCount": 0,
"languageCode": "en-US"
},
"safety": {
"overallRating": "string",
"categories": {}
},
"insights": {
"sentiment": "string",
"entities": [],
"contentSignals": {}
},
"metadata": {
"durationSec": 0,
"format": "string",
"resolution": "string"
},
"thumbnailUrl": "string",
"thumbnails": [],
"location": {
"displayName": "string",
"coordinates": { "lat": 0, "lon": 0 }
},
"downloads": {
"intelligenceReport": "presigned URL",
"transcript": "presigned URL"
}
}Response fields vary by media type (video, audio, image) and subscription tier. Higher tiers include additional fields such as transcript segments, visual intelligence, and semantic analysis.
GET /v1/media/locker
List all media items in your library.
Example Request
curl https://api.echosaw.com/v1/media/locker \ -H "X-Api-Key: your-api-key"
Response 200 OK
{
"items": [
{
"mediaId": "string (UUID)",
"fileName": "string",
"originalFilename": "string | null",
"mediaType": "VIDEO | AUDIO | IMAGE",
"status": "COMPLETE | UPLOADED_PENDING_SCAN | PROCESSING | FAILED",
"uploadedAt": 1773089776,
"durationSec": 12.7,
"fileSize": "50.00 MB",
"fileSizeBytes": 52428800,
"contentType": "video/mp4"
}
],
"count": 1
}GET /v1/media/search
Semantic search across your analyzed media library.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
q | string | Yes | Search query (natural language supported) |
Example Request
curl "https://api.echosaw.com/v1/media/search?q=outdoor+wildlife" \ -H "X-Api-Key: your-api-key"
Response 200 OK
{
"query": "outdoor wildlife",
"resultCount": 3,
"results": [
{
"mediaId": "string (UUID)",
"mediaType": "VIDEO",
"title": "string",
"summary": "string",
"transcriptSnippet": "string",
"labels": ["Animal", "Nature", "Outdoors"],
"tags": ["wildlife", "nature"],
"durationSec": 12.7,
"createdAt": 1773087339,
"score": 0.95
}
],
"searchType": "semantic"
}GET /v1/media/library
List media items and folders in your library. Supports folder filtering and pagination.
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
folderPath | string | No | Filter by folder path (default: "/" for root) |
limit | number | No | Max items per page (default: 25) |
nextToken | string | No | Pagination cursor from previous response |
includeSubfolders | boolean | No | Include subfolder listing (default: false) |
mediaType | string | No | Filter by media type. One of VIDEO, AUDIO, IMAGE |
status | string | No | Filter by job status (e.g. COMPLETE, PROCESSING, FAILED) |
sentiment | string | No | Filter by report sentiment. One of positive, negative, neutral, mixed |
Example Request
curl "https://api.echosaw.com/v1/media/library?folderPath=/Marketing&limit=10&mediaType=VIDEO&status=COMPLETE" \ -H "X-Api-Key: your-api-key"
Response 200 OK
{
"items": [
{
"mediaId": "string (UUID)",
"fileName": "interview.mp4",
"mediaType": "VIDEO",
"status": "COMPLETE",
"folderPath": "/Marketing",
"reportTitle": "Product Launch Interview",
"reportSentiment": "positive",
"uploadedAt": 1773087339,
"durationSec": 312,
"thumbnailUrl": "string (presigned URL)"
}
],
"folders": [
{
"folderPath": "/Marketing/Q1 2026",
"displayName": "Q1 2026",
"parentPath": "/Marketing",
"createdAt": 1773087339,
"itemCount": 5
}
],
"count": 1,
"nextToken": "string | null"
}POST /v1/media/library/folder
Create a new folder in your media library.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Folder display name |
parentPath | string | No | Parent folder path (default: "/") |
Example Request
curl -X POST "https://api.echosaw.com/v1/media/library/folder" \
-H "X-Api-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{"name": "Marketing", "parentPath": "/"}'PATCH /v1/media/library/folder
Rename an existing folder in your media library.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
folderPath | string | Yes | Current folder path to rename |
newName | string | Yes | New display name for the folder |
Example Request
curl -X PATCH "https://api.echosaw.com/v1/media/library/folder" \
-H "X-Api-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{"folderPath": "/Marketing", "newName": "Brand & Marketing"}'DELETE /v1/media/library/folder
Delete a folder from your media library. Items in the folder are moved to the parent folder by default.
Example Request
curl -X DELETE "https://api.echosaw.com/v1/media/library/folder" \
-H "X-Api-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{"folderPath": "/Old Campaigns", "moveItemsToParent": true}'PATCH /v1/media/library/move
Move one or more media items to a different folder in your library.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
mediaIds | string[] | Yes | Array of mediaId strings to move |
targetFolderPath | string | Yes | Destination folder path |
Example Request
curl -X PATCH "https://api.echosaw.com/v1/media/library/move" \
-H "X-Api-Key: your-api-key" \
-H "Content-Type: application/json" \
-d '{"mediaIds": ["38be3491-b9a4-446f-b3f5-95380576baf4"], "targetFolderPath": "/Marketing"}'Organization Management
Organization management (create, invite, manage members) is available via the Echosaw web interface at /organization and through Cognito-authenticated API endpoints. These endpoints are not part of the /v1/ API key-authenticated API.
For programmatic access to organization data, use the echosaw_get_organization MCP tool, which returns your organization details, members, and roles.
Rate Limits
Rate limits are enforced per API key based on your subscription tier. Exceeding the limit returns 429 Too Many Requests.
| Tier | Requests / sec | Burst | Daily Quota |
|---|---|---|---|
| Starter | 10 | 20 | 1,000 |
| Growth | 25 | 50 | 5,000 |
| Pro | 50 | 100 | 10,000 |
| Agency | 100 | 200 | 50,000 |
Error Responses
All errors return JSON with an error field and the appropriate HTTP status code.
| Status | Meaning | Common Cause |
|---|---|---|
400 | Bad Request | Missing or invalid parameters |
403 | Forbidden | Invalid API key or accessing another user's resource |
404 | Not Found | Resource does not exist or has not been processed |
429 | Too Many Requests | Rate limit exceeded — back off and retry |
500 | Internal Server Error | Unexpected error — contact support if persistent |
Example Error Response
{
"error": "Authentication required"
}