Skip to content

Medien (öffentlich) ​

Die öffentlichen Medien-Endpunkte liefern Bilder und Dateien aus der PIM-Mediathek, die für die Website freigegeben sind. Für das CMS mit Token gibt es eigene Endpunkte, siehe Medien für das CMS.

MethodePfadAnmeldung
GET/mediakeine
GET/media/{media}keine
GET/media-folderskeine
GET/image-formatskeine

Was ist öffentlich? ​

Ein Asset erscheint nur, wenn alle Bedingungen erfüllt sind:

  1. Freigabestatus „Freigegeben – uneingeschränkt“ oder „Freigegeben – nur bestimmte Kanäle“ mit dem Kanal Website.
  2. Nicht abgelaufen: „Gültig bis“ ist leer oder liegt in der Zukunft.
  3. Es liegt in einem aktiven Ordner oder in gar keinem Ordner.
  4. Es liegt nicht im Papierkorb.

Felder eines Mediums ​

FeldTypBedeutung
idIntegerInterne ID
nameStringAnzeigename
file_nameStringDateiname
mime_typeStringz. B. image/jpeg, application/pdf
typeStringAsset-Typ: image, datasheet, manual, brochure, three_d_view, view_360, technical_drawing, video, audio, logo, icon, cad, interactive_image
usagesString[]Nur bei Bildern, die über ein Produkt kommen: wofür die Verknüpfung gedacht ist (configurator, price_list, website, catalog)
sizeIntegerDateigröße in Byte
urlString | nullURL der Originaldatei. null, wenn die Datei noch nicht ins PIM übernommen wurde
thumb_urlString | nullURL des Vorschaubilds thumb, falls erzeugt
conversionsObjektErzeugte Bildformate: Schlüssel → { url, width, height, fit }. Leer bei Nicht-Bildern und SVG
srcsetString | nullFertige srcset-Zeile, nach Breite sortiert
altString | nullAlt-Text in der Server-Sprache (Fallback Deutsch)
titleString | nullTitel in der Server-Sprache
captionString | nullBildunterschrift
descriptionString | nullBeschreibung
copyrightString | nullCopyright / Fotograf
licenseString | nullNutzungsrecht / Lizenz
ki_statusString | nullungeprueft_altbestand, ki_generiert oder kein_ki
ki_labelString | nullDeutsche Bezeichnung dazu. Bei ki_generiert muss die Website das Bild sichtbar kennzeichnen
folderObjekt | null{ id, name, slug } des Ordners
created_atDatumHochgeladen am

width/height in conversions sind die Zielmaße des Formats, nicht die exakten Pixel der Datei. Bei fit: "crop" stimmen sie, bei max ist es die Obergrenze. Für srcset und zum Vorab-Bemaßen eines <img> reicht das.


Medien auflisten ​

GET /media

Liefert freigegebene Medien, neueste zuerst, seitenweise.

Query-Parameter ​

ParameterTypBedeutung
typeStringNur dieser Asset-Typ, z. B. image
renderableBoolean (1/0)Nur Bilddateien: JPEG, PNG, WebP, AVIF, GIF, TIFF, HEIC/HEIF und SVG. TIFF und HEIC zeigt ein Browser nicht direkt an; nehmen Sie dafür die URLs aus conversions. Gut für Bild-Auswahlen: erfasst auch Logos, Icons und Zeichnungen
idsInteger[]Nur diese IDs, z. B. alle Bilder einer Seite in einer Anfrage: ids[]=512&ids[]=513. Eine Komma-Liste (ids=512,513) wird nicht verstanden
folderStringSlug eines Ordners
searchStringKatalogsuche in Name, Dateiname, Schlagwörtern und Synonymen
pageIntegerSeite, Standard 1
per_pageIntegerStandard 24, mindestens 1, höchstens 200

Beispiel ​

bash
curl -sS 'https://admin.matev.eu/api/v1/media?renderable=1&folder=winterdienst&per_page=48' \
  -H 'Accept: application/json'
js
const params = new URLSearchParams({ renderable: '1', folder: 'winterdienst', per_page: '48' })
const res = await fetch(`https://admin.matev.eu/api/v1/media?${params}`, {
  headers: { Accept: 'application/json' },
})
const { data: media, links } = await res.json()

// Mehrere IDs auf einmal
const ids = [512, 513, 520].map((id) => `ids[]=${id}`).join('&')
const batch = await (await fetch(`https://admin.matev.eu/api/v1/media?${ids}`)).json()
php
use Illuminate\Support\Facades\Http;

$media = Http::acceptJson()
    ->get('https://admin.matev.eu/api/v1/media', [
        'renderable' => 1,
        'folder' => 'winterdienst',
        'per_page' => 48,
    ])
    ->throw()
    ->json('data');

// Laravel sends arrays as ids[0]=512&ids[1]=513, which PHP reads correctly.
$batch = Http::acceptJson()->get('https://admin.matev.eu/api/v1/media', ['ids' => [512, 513]])->json('data');

Antwort 200 ​

json
{
  "data": [
    {
      "id": 512,
      "name": "SP 250 im Einsatz",
      "file_name": "sp-250-einsatz.jpg",
      "mime_type": "image/jpeg",
      "type": "image",
      "size": 2483112,
      "url": "https://admin.matev.eu/storage/media/512/sp-250-einsatz.jpg",
      "thumb_url": "https://admin.matev.eu/storage/media/512/conversions/sp-250-einsatz-thumb.jpg",
      "conversions": {
        "thumb": { "url": "https://admin.matev.eu/storage/media/512/conversions/sp-250-einsatz-thumb.jpg", "width": 300, "height": 300, "fit": "crop" },
        "tile": { "url": "https://admin.matev.eu/storage/media/512/conversions/sp-250-einsatz-tile.jpg", "width": 480, "height": 480, "fit": "crop" },
        "hero": { "url": "https://admin.matev.eu/storage/media/512/conversions/sp-250-einsatz-hero.jpg", "width": 1920, "height": 1080, "fit": "max" }
      },
      "srcset": "…thumb.jpg 300w, …tile.jpg 480w, …hero.jpg 1920w",
      "alt": "Schneepflug SP 250 räumt einen Hof",
      "title": "SP 250 im Einsatz",
      "caption": null,
      "description": null,
      "copyright": "matev GmbH",
      "license": null,
      "ki_status": "kein_ki",
      "ki_label": "Kein KI",
      "folder": { "id": 7, "name": "Winterdienst", "slug": "winterdienst" },
      "created_at": "2026-02-11T09:14:00+00:00"
    }
  ],
  "links": { "first": "…", "last": "…", "prev": null, "next": null },
  "meta": { "current_page": 1, "per_page": 48, "total": 1, "…": "…" }
}

Fehler ​

StatuscodeWann
405method_not_allowedandere Methode als GET
500server_errorFehler auf dem Server

Ein Medium abrufen ​

GET /media/{media}

Pfad-Parameter ​

ParameterTypBedeutung
mediaInteger oder ext:<ID>Interne ID (512) oder die ID aus dem Quellsystem Pimcore mit Präfix ext: (ext:4711)

Die ext:-Form bleibt über Neu-Importe und zwischen Umgebungen gleich. Inhalte, die auf mehreren Installationen funktionieren sollen (Kirby schreibt z. B. pim://ext:4970), sollten diese Form verwenden.

Beispiel ​

bash
curl -sS https://admin.matev.eu/api/v1/media/ext:4711 \
  -H 'Accept: application/json'
js
const res = await fetch('https://admin.matev.eu/api/v1/media/ext:4711', {
  headers: { Accept: 'application/json' },
})
if (res.status === 404) {
  // nicht vorhanden oder nicht öffentlich freigegeben
}
const { data: asset } = await res.json()
php
use Illuminate\Support\Facades\Http;

$response = Http::acceptJson()->get('https://admin.matev.eu/api/v1/media/ext:4711');
$asset = $response->successful() ? $response->json('data') : null;

Antwort 200 ​

Ein Objekt wie in der Liste, eingepackt in data:

json
{ "data": { "id": 512, "name": "SP 250 im Einsatz", "type": "image", "…": "…" } }

Fehler ​

StatuscodeWann
404not_foundID unbekannt, oder das Asset ist nicht öffentlich (Status, Ablauf, Ordner)
405method_not_allowedandere Methode als GET

Medienordner auflisten ​

GET /media-folders

Liefert den öffentlichen Ordnerbaum: aktive Ordner ohne Rollenbeschränkung, sortiert nach Position und Name. Nicht paginiert.

Die oberste Ebene sind die Wurzelordner. children ist zwei Ebenen tief gefüllt. Auf der dritten Ebene fehlt das Feld children ganz, auch wenn es dort weitere Ordner gibt.

Felder ​

FeldTypBedeutung
idIntegerID
nameStringName
pathStringPfad aus den Namen, z. B. Produkte / Winterdienst
slugStringKennung, für GET /media?folder=…
descriptionString | nullBeschreibung
parent_idInteger | nullÜbergeordneter Ordner
positionIntegerSortierung
childrenOrdner[]Unterordner (siehe oben)

Beispiel ​

bash
curl -sS https://admin.matev.eu/api/v1/media-folders -H 'Accept: application/json'
js
const { data: folders } = await (await fetch('https://admin.matev.eu/api/v1/media-folders', {
  headers: { Accept: 'application/json' },
})).json()
php
use Illuminate\Support\Facades\Http;

$folders = Http::acceptJson()->get('https://admin.matev.eu/api/v1/media-folders')->throw()->json('data');

Antwort 200 ​

json
{
  "data": [
    {
      "id": 2,
      "name": "Produkte",
      "path": "Produkte",
      "slug": "produkte",
      "description": null,
      "parent_id": null,
      "position": 1,
      "children": [
        {
          "id": 7,
          "name": "Winterdienst",
          "path": "Produkte / Winterdienst",
          "slug": "winterdienst",
          "description": "Schneepflüge und Streuer",
          "parent_id": 2,
          "position": 3,
          "children": [
            { "id": 31, "name": "Schneepflüge", "path": "Produkte / Winterdienst / Schneepflüge", "slug": "schneepfluege", "description": null, "parent_id": 7, "position": 1 }
          ]
        }
      ]
    }
  ]
}

Fehler ​

StatuscodeWann
405method_not_allowedandere Methode als GET

Bildformate auflisten ​

GET /image-formats

Liefert die aktiven Bildformate (Renditions), sortiert nach Position. Nicht paginiert. Die Schlüssel (key) sind dieselben wie in conversions und im Parameter format der Vorschau für das CMS.

Fest eingebaut sind thumb (300 × 300, Zuschnitt), mini (120 × 120, Zuschnitt), tile (480 × 480, Zuschnitt), preview (800 × 800, max.) und hero (1920 × 1080, max.). Weitere Formate legt ein Admin in der Mediathek unter „Bildformate“ an.

Felder ​

FeldTypBedeutung
keyStringName des Formats
labelStringBezeichnung
width, heightInteger | nullZielmaße in Pixel
fitStringZuschnitt, z. B. crop, max, contain
qualityInteger | nullJPEG/WebP-Qualität 1–100, null = Standard
positionIntegerSortierung

Beispiel ​

bash
curl -sS https://admin.matev.eu/api/v1/image-formats -H 'Accept: application/json'
js
const { data: formats } = await (await fetch('https://admin.matev.eu/api/v1/image-formats')).json()
php
use Illuminate\Support\Facades\Http;

$formats = Http::acceptJson()->get('https://admin.matev.eu/api/v1/image-formats')->throw()->json('data');

Antwort 200 ​

json
{
  "data": [
    { "key": "thumb", "label": "Thumbnail", "width": 300, "height": 300, "fit": "crop", "quality": null, "position": 1 },
    { "key": "hero", "label": "Hero", "width": 1920, "height": 1080, "fit": "max", "quality": 82, "position": 5 }
  ]
}

Fehler ​

StatuscodeWann
405method_not_allowedandere Methode als GET