Documentation Index
Fetch the complete documentation index at: https://api-tools.memories.ai/llms.txt
Use this file to discover all available pages before exploring further.
Product: Visual Search
Use case: Upload videos and images, auto-index them, then search by natural language, image, or transcript phrase
Host: https://api.memories.ai/serve/api/v1
Auth: Authorization: sk-mavi-... (no Bearer prefix)
Upload a video file from disk into your Private Video Library for indexing and search. To pull a video from a remote URL instead, use Upload Video — from URL. For images, use Upload Image.
The upload queues the video for asynchronous indexing. The response returns immediately with videoStatus: "UNPARSE"; register a callback URL or poll Get Metadata with the returned videoNo to know when indexing reaches PARSE.
Prerequisites
- You have created a memories.ai API key.
- Supported formats:
.mp4, .avi, .mkv, .mov. Content-Type of the file part must start with video/.
- Video codecs: h264, h265, vp9, hevc.
- Max file size: 3 GB.
Request Example
Uses multipart/form-data. Send all non-file parameters as form fields, not JSON.
import requests, os
headers = {"Authorization": "sk-mavi-..."}
file_path = "my_video.mp4"
with open(file_path, "rb") as f:
response = requests.post(
"https://api.memories.ai/serve/api/v1/upload",
headers=headers,
files={"file": (os.path.basename(file_path), f, "video/mp4")},
data={
"unique_id": "my-project",
"callback": "https://your.app/callback",
"datetime_taken": "2025-10-20 11:00:00",
"camera_model": "Canon EOS 5D",
"latitude": "39.9042",
"longitude": "116.4074",
"tags": ["tag1", "tag2"],
"retain_original_video": True,
"video_transcription_prompt": "Focus on spoken dialogue"
}
)
print(response.json())
Parameters
The video file. Extension must be .mp4, .avi, .mkv, or .mov and Content-Type must start with video/. Maximum 3 GB.
Namespace to group videos under a logical folder in your account. Created automatically on first use. Must be non-empty when provided.
URL that receives a POST notification when the video finishes indexing. Maximum 299 characters.
Capture time in yyyy-MM-dd HH:mm:ss format (e.g. 2025-10-20 11:00:00). Invalid formats are rejected.
Camera or device model name. Maximum 200 characters.
GPS latitude where the video was captured (decimal).
GPS longitude where the video was captured (decimal).
User-defined tags (e.g. ["outdoor", "2025"]). Maximum 20 tags. An api tag is appended automatically.
Whether to retain the original video file after indexing. Defaults to true.
video_transcription_prompt
Custom prompt to steer the transcription and video understanding focus.
Response Example
{
"code": "0000",
"msg": "success",
"data": {
"videoNo": "VI568102998803353600",
"videoName": "1be6a69f3c6e49bf986235d68807ab1f",
"videoStatus": "UNPARSE",
"uploadTime": "1744905509814"
}
}
Response Fields
Business status code. 0000 indicates success.
Human-readable status message.
Unique identifier for the uploaded video. Use this in all subsequent operations.
Internal name assigned to the stored video.
Initial processing status. Always UNPARSE immediately after upload; transitions to PARSE once indexing completes.
Upload timestamp in milliseconds since epoch.
Knowing When Indexing Is Done
A successful upload returns videoStatus: "UNPARSE" — the video is queued for indexing but is not yet searchable. Two ways to wait for PARSE:
| Approach | How |
|---|
| Push (recommended for production) | Provide a callback URL on upload; memories.ai POSTs to it when indexing completes. |
| Poll | Call Get Metadata with video_no=<the videoNo above> and check data.status until it becomes PARSE. |
Callback payload, if you registered one:
{
"videoNo": "VI554046065381212160",
"status": "PARSE"
}
Notes & Limits
- Rate limiting: Exceeding the per-account upload rate limit returns an error. See Rate limits.
- Concurrent indexing: There is a cap on how many videos can be in the indexing queue within a rolling 2-hour window. New uploads are rejected once the cap is reached until prior videos finish parsing.
- Billing: Each upload deducts credits from your account. Insufficient balance causes the request to fail.
Video file to upload. Allowed extensions: .mp4, .avi, .mkv, .mov. Content-Type must start with video/. Max size 3 GB.
Callback URL invoked when the video moves to the parsing stage. Max 299 characters.
Maximum string length: 299
Example:"https://your.app/callback"
Scope identifier. A folder is auto-created on first use for the authenticated account.
Capture time in format yyyy-MM-dd HH:mm:ss.
Camera/device model. Max 200 characters.
Maximum string length: 200
User-defined tags. Max 20. The server automatically appends an 'api' tag.
Maximum array length: 20
video_transcription_prompt
Example:"Focus on the speaker and major scene changes."
Business status code. 0000 indicates success.
Example:{
"videoNo": "VI568102998803353600",
"videoName": "1be6a69f3c6e49bf986235d68807ab1f",
"videoStatus": "UNPARSE",
"uploadTime": "1744905509814"
}