Skip to content

DocsAPI referenceOperations

Read media metadata

The container, duration and streams of input, read with ffprobe: nothing is encoded. Waits up to 25 seconds for the job to end, or not at all with ?wait=false. A job that has ended answers 200, with the document in probe when it succeeded; a job still queued or running answers 202 and probe is null. The document is also the job's output file. Creates the same Job as POST /v1/jobs, with operation set.

POST /v1/probe

Needs an API key: Authorization: Bearer $VIDEXO_API_KEY.

Parameters

Parameters
NameInTypeDescription
wait queryone of true, falseWait up to 25 seconds for the job to end (true, the default), or answer at once (false).
idempotency-key headerstring, up to 255 charactersMakes retries safe for 24 hours. Up to 255 printable ASCII characters. One key space per account across every endpoint that creates a job.

Body ProbeRequest

Body fields
NameTypeDescription
input requiredstring or objectAn http or https URL, videxo://uploads/<upload_id>, { "url" } or { "upload_id" }.
filename string, up to 105 charactersThe stored file name, <name>.<format> by default; one extension, matching format.
webhook_url string, URL, up to 2,048 characters or nullAn https URL that gets the job when it ends (M4).
metadata map of string to string, up to 500 charactersYour own string pairs, returned with the job and its webhook: at most 20 keys of up to 40 characters, values up to 500.

Request

bash
curl "$VIDEXO_API_URL/v1/probe" \
  -H "Authorization: Bearer $VIDEXO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "input": "https://videxo.io/samples/talk.mp4"
}'

Response

200 JSON
{
  "id": "job_3k9x0c2mfq8w1n7r5t4b6v2z",
  "state": "succeeded",
  "kind": "operations",
  "operation": "probe",
  "spec": {
    "inputs": {
      "source": {
        "url": "https://videxo.io/samples/talk.mp4"
      }
    },
    "outputs": [
      {
        "name": "metadata",
        "type": "metadata",
        "input": "source",
        "filename": "metadata.json",
        "format": "json"
      }
    ]
  },
  "command": null,
  "input_files": null,
  "output_files": null,
  "ffmpeg_command": null,
  "steps": [
    {
      "tool": "ffprobe",
      "inputs": [
        "source"
      ],
      "outputs": [
        "metadata"
      ],
      "command": null
    }
  ],
  "webhook_url": null,
  "metadata": {},
  "progress": null,
  "error": null,
  "outputs": [
    {
      "alias": "out_metadata",
      "name": "metadata",
      "filename": "metadata.json",
      "size_bytes": 612,
      "sha256": "9f2c4e1a7b3d5f60c8e2a4b6d8f0e1c3a5b7d9f1e3c5a7b9d1f3e5c7a9b1d3f5",
      "content_type": "application/json",
      "expires_at": "2026-11-05T12:01:09.000Z",
      "download_url": "https://api.videxo.io/v1/files/job_3k9x0c2mfq8w1n7r5t4b6v2z/out_video?account=acc_example&expires=1793797269&signature=example",
      "download_url_expires_at": "2026-11-04T13:01:09.000Z",
      "deleted_at": null
    }
  ],
  "usage": {
    "seconds": 1,
    "input_bytes": 48000000,
    "output_bytes": 612,
    "credits": 1,
    "bill": {
      "lines": [
        {
          "kind": "metadata",
          "credits": 0
        }
      ],
      "data": {
        "input_bytes": 48000000,
        "output_bytes": 612,
        "credits": 0.48
      },
      "processing": {
        "seconds": 1,
        "included_seconds": 0,
        "credits": 0.167
      }
    }
  },
  "created_at": "2026-11-04T12:00:00.000Z",
  "started_at": "2026-11-04T12:00:01.000Z",
  "finished_at": "2026-11-04T12:00:04.000Z",
  "probe": {
    "container": "mov,mp4,m4a,3gp,3g2,mj2",
    "duration": 62.4,
    "start_time": 0,
    "size_bytes": 48000000,
    "bit_rate": 6153846,
    "tags": {
      "major_brand": "isom",
      "creation_time": "2026-10-30T09:12:00.000000Z"
    },
    "streams": [
      {
        "index": 0,
        "type": "video",
        "codec": "h264",
        "profile": "High",
        "duration": 62.4,
        "bit_rate": 6000000,
        "width": 1920,
        "height": 1080,
        "rotation": 0,
        "fps": 29.97,
        "pixel_format": "yuv420p",
        "frames": 1870,
        "cover_art": false,
        "tags": {
          "language": "eng"
        }
      },
      {
        "index": 1,
        "type": "audio",
        "codec": "aac",
        "profile": "LC",
        "duration": 62.38,
        "bit_rate": 128000,
        "channels": 2,
        "channel_layout": "stereo",
        "sample_rate": 48000,
        "tags": {
          "language": "eng"
        }
      }
    ]
  }
}

Responses

Responses
StatusBodyWhen
200ProbeResponseThe job ended within the wait, or this Idempotency-Key made it earlier (same endpoint and body).
202ProbeResponseThe job, still queued or running; probe is null.
400Probleminvalid_request (with errors) or command_invalid (with problems)
401Problemauthentication_failed (missing_api_key, invalid_api_key, api_key_revoked, api_key_expired)
402Problemusage_cap_reached or out_of_credits
403Problempermission_denied (account_disabled, token_scope)
404Problemnot_found (upload)
409Problemconflict (idempotency_key_reused)
413Problemlimit_exceeded (request_body_size): the body is larger than 512 KB
415Probleminvalid_request (not_json): the body is not sent as application/json
429Problemrate_limited, with Retry-After in seconds
500Probleminternal_error
503Problemservice_unavailable (temporary): the account's free credits are still being granted, or a part of the service did not answer