Video

Upload videos

Transfer owned source media directly to storage, then request asynchronous processing through the account protocol.

Select compatible source media

Modal validationCurrent behavior
Containers and MIME typesMP4: video/mp4. MOV: video/quicktime. WebM: video/webm. MKV: video/x-matroska.
SizeAt most 5 × 1024³ bytes, or 5 GiB. The interface labels this as 5 GB.
DurationAt most 900 seconds. The modal rejects durations greater than 15 minutes.
MetadataThe browser must read video metadata before the selection is accepted.
LanguageEnglish or Other. English is selected initially.

These are upload-dialog checks. A supported container does not guarantee that every codec can play or decode in every browser.

A misleading or missing MIME type can fail validation even when the filename has a supported extension. Changing the extension does not convert media.

Upload and processing failures

Understand the direct-storage transfer

  1. The application creates an owned provisional video row.
  2. The browser uploads the video to authorized storage using resumable TUS requests.
  3. The application starts processing after the transfer succeeds.
Transfer settingApplication behavior
DestinationThe configured Supabase resumable storage endpoint, not the RapidEye site request body.
Object identityThe newly created owned video ID.
AuthenticationThe signed-in account’s storage authorization token and storage ownership policy.
Chunk size6 MiB per chunk.
Parallel uploadsOne.
Automatic retry delays1 second, then 3 seconds, subject to the client’s retry policy and active attempt.

Large media goes directly to storage. Do not send video bytes through an application JSON route or paste a storage service credential into browser code.

Pause, resume and cancel

ActionEffect
PauseStops the current transfer without terminating its resumable upload.
ResumeFinds the prior upload and continues the active upload attempt.
CancelTerminates the upload and removes its provisional video row.
Transfer failureStops the attempt and tries to remove the provisional row.
Cleanup failureKeeps a cleanup-failed state. Retry cleanup before starting another upload.
Processing-start failureKeeps the transferred video and offers a retry of processing admission.

Leaving the upload flow aborts its active attempt. Browser-local resume controls do not promise a resumable upload after a page reload or a different device.

Transfer cleanup and processing recovery are different operations. Deleting a provisional row does not establish that an already accepted processing revision was cancelled.

Request ingest after a completed transfer

The account client calls POST https://api.rapideye.ai/v1/parser/upload-video/ with a fresh user bearer token. The source video must already exist under authorized ownership.

Field or headerTypeMeaning
AuthorizationBearer user access tokenA verified account principal. The server derives the actor user ID.
Idempotency-KeyNon-empty request identityKeep the same identity for the same request. The application uses video-upload:<videoId>.
unique_keyStringThe owned source video ID. Required.
video_nameStringSource filename or display name supplied to ingest.
video_descriptionStringDescription supplied with the request.
video_extStringSource extension, for example .mp4. Processing normalizes its leading dot.
languageStringThe selected language, for example english.
idempotency_keyString, optionalBody fallback when the header is absent.
llm_labels_enabledBoolean, optionalOpt-in processing configuration accepted by ingest. It is not a model or accuracy guarantee.
person_rosterArray, optional compatibility fieldThe facade validates entries, but current ingest strips this field. Do not rely on a roster affecting analysis.
Account-client ingest request, after authorized source transfer
async function requestIngest({ accessToken, videoId, filename, extension }) {
  const requestId = 'video-upload:' + videoId;
  const response = await fetch('https://api.rapideye.ai/v1/parser/upload-video/', {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + accessToken,
      'Content-Type': 'application/json',
      'Idempotency-Key': requestId
    },
    body: JSON.stringify({
      unique_key: videoId,
      video_name: filename,
      video_description: '',
      video_ext: extension,
      language: 'english',
      idempotency_key: requestId
    })
  });
  const payload = await response.json();
  return { status: response.status, payload };
}

This example accepts an existing authorized user token. It does not provision an account, create a video row or transfer source bytes.

Representative 202 response shape
{
  "status": "Successfully Sent Video To Processing: <videoId> <revisionId>",
  "data": { "revision_id": "<revisionId>", "kind": "ingest", "status": "pending" },
  "error": null
}

HTTP 202 means a pending revision was accepted. Retain its revision ID and observe processing separately.

A repeated account admission can return 409 duplicate_request. It does not necessarily repeat the original success response or create another job.

Request identity and usage receipts

Review before publishing

After processing starts, the owner can continue editing. Review thumbnails, detected entities, labels, subtitles, locations and authored metadata before publication.

A processed video and a published embed experience are separate records. Publish an embed revision to change its viewer configuration.

Processing stages and outputs

Configure and publish an embed