Developers

    Query worlds like a database.

    One endpoint. Ten modalities. Search by scene, metadata, or signal type - stream frames directly into your training pipeline with a single API key.

    Read docsAPI · operational
    // app.originlab.ai · web UI · same data as the API

    01/Dashboard
    Browse, filter,
    export.

    Everything the API exposes is also available through our data platform - browse catalogs, filter by metadata, build collections, and track exports.

    app.originlab.ai/library
    Catalogs
    Games 50+
    3D Environments growing
    Modalities
    RGB Video *
    Depth Maps *
    Surface Normals *
    Camera Telemetry *
    UrbanNightRainInteriorCrowdVehicles
    Tactical FPS · 014
    Open-world · 027
    Urban scan · 003
    Survival · 061
    // POST /v1/metadata/search · stream → Zarr | Parquet

    02/API
    One endpoint.
    Every signal.

    Search, filter, and stream datasets programmatically. All responses include schema version, provenance metadata, and rights status.

    Search. Stream. Ship.

    The Origin Lab SDK wraps our REST API with typed models, automatic pagination, and streaming support. Query by any metadata dimension, filter across catalogs, and pipe results directly into your training loop.

    a.
    Typed search filters

    20+ metadata categories as structured query params. No free-text guessing.

    b.
    Streaming ingest

    Zarr and Parquet frames streamed on-demand. No intermediate downloads.

    c.
    Versioned exports

    Pin a dataset version. Re-export anytime with full provenance chain.

    d.
    Provenance in every response

    License ID, rights scope, and source metadata in every API response.

    pipeline.py
    PYTHON
    import originlab
    
    client = originlab.Client(api_key="sk-...")
    
    scenes = client.search(filters={
        "environment.category.eq": "urban_city",
        "weather.condition.eq": "rain",
        "modalities.includes": ["depth_16", "camera_pose"],
    }, limit=50)
    
    for scene in scenes:
        frames = client.stream(scene.id, modalities=["rgb", "depth_16"], format="zarr")
        pipeline.ingest(frames)
    // curl · cursor pagination · schema-versioned responses

    03/API examples
    cURL in, JSON out.

    Query, filter, and export datasets programmatically. All responses include schema version and metadata.

    Search
    search_request.sh
    cURL
    curl -X POST https://app.originlab.ai/api/v1/metadata/search \
      -H "X-API-Key: $ORIGIN_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "filters": {
          "environment.category.eq": "urban_city",
          "weather.weather_condition.eq": "clear",
          "people.crowd_level.in": ["large_group", "crowd"]
        },
        "limit": 10
      }'
    search_response.json
    JSON
    {
      "results": [
        {
          "id": 18842,
          "scene_id": "scn_4821_014",
          "s3_key": "samples/4821/scene-014.mp4",
          "environment": { "category": "urban_city", "setting_era": "contemporary" },
          "weather":     { "condition": "clear", "visibility": "good" },
          "people":      { "crowd_level": "large_group" }
        }
      ],
      "total": 2847,
      "next_cursor": "eyJpZCI6MTg4NDJ9"
    }
    Export
    export_request.sh
    cURL
    curl -X POST https://app.originlab.ai/api/v1/export \
      -H "X-API-Key: $ORIGIN_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "collection_id": 42,
        "format": "csv"
      }'
    export_response.json
    JSON
    {
      "items": [
        {
          "id": 4821,
          "category": "tactical_fps",
          "content_type": "videogame",
          "license_type": "scoped",
          "nb_samples": 142,
          "updated_at": "2026-02-20T14:22:00Z"
        }
      ],
      "total": 312,
      "next_cursor": "eyJpZCI6NDgyMX0="
    }
    // schema · 20 fields · structured, queryable, composable

    04/Metadata
    20 queryable
    categories.

    20 structured categories extracted from every clip. Filter and search across any combination.

    people

    crowd level, individual descriptions, activities, interactions

    animals

    species, behavior, role, size

    flora

    vegetation type, density, seasonal indicators

    transportation

    vehicle types, motion state, camera relationship

    environment

    setting category, era, location type, mood

    weather

    conditions, visibility, intensity, atmospheric effects

    time_of_day

    period, light source, sky condition

    lighting_color

    type, key ratio, color palette, color grade, temperature

    perspective

    shot type, camera angle, movement, lens characteristics

    focus_tracking

    depth of field, tracking, transitions

    occlusion

    detection, type, visibility impact

    visual_style

    composition, framing, texture, editing pace

    text_graphics

    text presence, types, coverage

    conversation

    emotional tone, interaction type, power dynamics

    physical

    interaction type, intensity, contact

    continuity

    transitions, temporal relationships, location changes

    trademarks

    brand detection, product placement context

    audio_design

    ambient sound, dialogue processing, effects

    music_score

    genre, intensity, role, presence

    language

    spoken/subtitle languages, accents

    // stream · msgpack · 60 Hz engine + 50 Hz input, synchronized

    05/Capture data
    Raw signals,
    structured streams.

    Raw input and engine telemetry captured alongside every session. Synchronized, timestamped, and delivered as structured streams.

    input_capture.json
    INPUT
    {
      "header": {
        "version": "TLS-0.005",
        "format":  "msgpack-stream",
        "config":  { "mouse_sample_hz": 50, "key_release": true, "scroll": true },
        "obs":     { "width": 1920, "height": 1080, "fps": 30 }
      },
      "events": [
        { "t": 0.00, "type": "active_window", "category": "tactical_fps" },
        { "t": 0.02, "type": "mouse_move",    "x": 966, "y": 542 },
        { "t": 0.67, "type": "key_down",      "key": "w" },
        { "t": 1.24, "type": "key_down",      "key": "space" }
      ]
    }
    engine_telemetry.json
    TELEMETRY
    {
      "header": {
        "version": "TLE-0.001",
        "config":  { "capture_hz": 60 },
        "engine":  { "type": "unreal", "version": "4.23", "renderer": "d3d12" },
        "title":   { "category": "tactical_fps", "build_id": "build_a14" },
        "camera":  { "coord_system": "unreal", "pos_unit": "cm", "fov_unit": "deg" }
      },
      "events": [
        { "t": 0.0000, "frame": 0, "px": 24510.0, "py": -8835.0, "pz": 1202.7, "yaw": 127.7, "pitch": -3.0, "fov": 90.0 },
        { "t": 0.0167, "frame": 1, "px": 24509.9, "py": -8834.9, "pz": 1202.0, "yaw": 127.6, "pitch": -2.6, "fov": 90.0 }
      ]
    }
    // X-API-Key · 60 req/min · stable error codes · request_id on every response

    06/Quickstart
    Auth, SDKs,
    limits.

    Everything you need to make a first call. Bearer-style API key, predictable error shape, generous limits.

    a.
    Authentication

    Pass X-API-Key on every request. Keys are environment-scoped (sandbox / prod) and rotate without downtime.

    b.
    SDKs

    PythonTypeScriptGoRust · soon

    c.
    Rate limits

    60 req/min on search, 10 concurrent stream sessions, 5 active exports. Lifted on request for production workloads.

    d.
    Errors

    Stable error codes, machine-readable retry hints, and a request_id on every response for support triage.

    error_response.json
    JSON
    {
      "error": {
        "code": "rate_limit_exceeded",
        "message": "60 requests/min exceeded - retry after 12s.",
        "retry_after": 12,
        "request_id": "req_01HZX9F2M4P"
      }
    }

    Start building today.

    Get your API key, explore the docs, and stream your first dataset in minutes. Same-day access for qualified teams.

    Read the docs