Skip to content

Mediafiles

Productions can have mediafiles attached: posters, scene images, trailers, technical riders, and more. Each mediafile has a category (mediafile_type) and one or more downloadable files.

Fetch mediafiles for a production

http
POST /entities/filter
Content-Type: application/json
json
[
  { "type": "type", "value": "mediafile" },
  {
    "type": "selection",
    "key": ["podiumnet:1|properties.ref_productions.value"],
    "value": "{production_id}",
    "match_exact": true
  }
]

Filter by category

json
[
  { "type": "type", "value": "mediafile" },
  {
    "type": "selection",
    "key": ["podiumnet:1|properties.ref_productions.value"],
    "value": "{production_id}",
    "match_exact": true
  },
  {
    "type": "selection",
    "key": ["podiumnet:1|properties.mediafile_type.value"],
    "value": "poster",
    "match_exact": true
  }
]

Response structure

json
{
  "count": 3,
  "results": [
    {
      "id": "MF-ABC123",
      "_id": "uuid-here",
      "type": "mediafile",
      "metadata": [
        { "key": "mediafile_type", "value": "scene_images" },
        { "key": "title", "value": "Rehearsal image 1" },
        { "key": "description", "value": "Photo from the dress rehearsal" },
        { "key": "copyright", "value": "© Jan Photographer" }
      ],
      "relations": [
        { "key": "PR-ABC123", "type": "refProductions" }
      ],
      "identifiers": ["uuid-here", "MF-ABC123", "rehearsal-image-1.jpg"],
      "display_filename": "transcoded-rehearsal-image-1.jpg",
      "audit": {
        "created": { "at": "2026-05-20T16:54:48Z", "by": "user@example.com" },
        "updated": { "at": "2026-05-20T16:58:32Z", "by": "user@example.com" }
      }
    }
  ],
  "skip": 0,
  "limit": 20
}

Fields

FieldDescription
idHuman-readable mediafile ID (e.g. MF-ABC123)
metadata[mediafile_type]Category (see table below)
metadata[title]Title of the mediafile
metadata[description]Description
metadata[copyright]Copyright notice
relations[refProductions]ID of the linked production
identifiersIncludes the original filename
display_filenameFilename of the transcoded version

Category types

mediafile_typeCategory
posterPoster (Affiche)
scene_imagesScene images (Scenebeelden)
trailerTrailer
reviewReviews (Recensies)
riderTechnical info (Technische info)
social_mediaSocial media posts
music_fragmentsMusic fragments (Muziekfragmenten)
framingFraming (Omkadering)

Multiple files per category

A production can have multiple mediafiles with the same mediafile_type. This is intentional — for example, under rider both a technical rider and a venue sheet may be present. All files are returned.


Get a download URL

Use the following endpoint to obtain signed download URLs for both the original and transcoded file:

http
GET __API_BASE_URL__/mediafiles/{id}/download-urls
Authorization: Bearer {token}
X-tenant-id: podiumnet

Response:

json
{
  "original_file_location": "https://storage.example.com/download-with-ticket/{filename}?ticket_id={uuid}",
  "transcode_file_location": "https://storage.example.com/download-with-ticket/{display_filename}?ticket_id={uuid}"
}
FieldDescription
original_file_locationSigned URL to the original uploaded file
transcode_file_locationSigned URL to the transcoded version (JPEG for images, same as original for PDFs)

Download the file

Download directly from the URL — no extra Authorization header needed (the ticket is embedded in the URL):

http
GET {original_file_location}

URL lifetime

Signed URLs expire after ~1 hour. Do not store them — request a fresh URL from /mediafiles/{id}/download-urls each time you need the file.


Complete integration flow

The full flow for fetching and downloading mediafiles from a production:

Step 1 — Authenticate

Obtain an OAuth token or use a static JWT. See Authentication.

Step 2 — Find the production

http
POST __API_BASE_URL__/entities/filter?limit=20
Content-Type: application/json

[
  { "type": "type", "value": "production" },
  { "type": "text", "key": ["podiumnet:1|properties.title.value"], "value": "Hamlet*" },
  { "type": "selection", "key": ["podiumnet:1|properties.ref_venues.value"], "value": "{venue_id}", "match_exact": true }
]

Note the id of the desired production from the results (e.g. PR-ABC123).

Step 3 — Check media availability

Fetch the production and inspect the status fields in metadata (e.g. posters_status). See Productions.

Step 4 — Fetch mediafiles by category

http
POST __API_BASE_URL__/entities/filter?limit=20
Content-Type: application/json

[
  { "type": "type", "value": "mediafile" },
  { "type": "selection", "key": ["podiumnet:1|properties.ref_productions.value"], "value": "PR-ABC123", "match_exact": true },
  { "type": "selection", "key": ["podiumnet:1|properties.mediafile_type.value"], "value": "poster", "match_exact": true }
]

Step 5 — Get the download URL

http
GET /mediafiles/{id}/download-urls

Step 6 — Download the file

http
GET {original_file_location}

Powered by Elody - Open Source Semantic Data Platform