Marken-Asset-API
REST-API (read-only, JSON) für Logos, Icons, Bilder, Texte und Farbpaletten aller Marken. Jede Ressource folgt demselben Schema: GET /v1/{brand}/{asset-key}. Marke wechseln = Slug tauschen, Code bleibt gleich.
Quickstart
- API-Key bei den Plattform-Administratoren anfordern (Bereich „API-Zugänge“). Der Key gehört auf Ihren Server, nie in ausgelieferten Browser-Code.
- Authentifizieren: Header
Authorization: Bearer <key>— für<img>-URLs alternativ?api_key=<key>. - Request:
GET /api/public/v1/{brand}/{asset-key}. Marke wechseln = Slug tauschen.
Verfügbare Marken (Slugs)
Marken werden geladen … Slug suchen und auswählen – er wird in alle Beispiele und die Konsole übernommen. Komplette Liste per GET /api/public/v1/brands.
Ihr erster Aufruf
curl "https://brand.co-red.de/api/public/v1/waz/logo-farbig" \
-H "Authorization: Bearer bp_live_xxxxxxxxxxxxxxxx"Antwort (gekürzt)
{
"data": {
"key": "logo-farbig",
"brand": "waz",
"files": { "svg": { "url": "https://…/logo.svg?v=8f2a1c9e" } }
}
}Eine Adresse für alle Marken
const logo = (brand) =>
`https://brand.co-red.de/api/public/v1/${brand}/logo-farbig.svg?api_key=${KEY}`;
<img src={logo("waz")} alt="WAZ" />
<img src={logo("nrz")} alt="NRZ" />Konsole
Key eintragen, Marke und Endpunkt wählen, senden. Der Key bleibt im Browser-Tab und wird nicht gespeichert.
GET /api/public/v1/waz/logo-farbigAsset-Keys
Die Liste ist die Live-Antwort von GET /api/public/v1/{brand} für die gewählte Marke – alle Schlüssel, die der Key dort sieht. Klick kopiert den Key.
Live-Liste: API-Schlüssel erforderlich
Die Schlüssel liefert die API selbst. Schlüssel oben in der Konsole eintragen – die Liste lädt dann automatisch für die gewählte Marke.
Endpunkte
Basis-URL: https://brand.co-red.de/api/public/v1 — alle Endpunkte sind reine Lesezugriffe (GET). Details bei Bedarf aufklappen.
Farben für Digital und Print
Alle Varianten einer Marke
curl "https://brand.co-red.de/api/public/v1/waz/colors" \
-H "Authorization: Bearer bp_live_…"
// Nur Bildschirmfarben oder nur Druckangaben:
GET /api/public/v1/waz/colors?medium=digital
GET /api/public/v1/waz/colors?medium=digital&theme=dark
GET /api/public/v1/waz/colors?medium=print- Digital: HEX, RGB (0–255), HSL (Grad / Prozent) im sRGB-Farbraum unter
digital.lightunddigital.dark. Dunkle Varianten werden nur geliefert, wenn sie hinterlegt und aktiviert sind; ihre Herkunft steht insource. - Verläufe:
gradientsenthält Art, Winkel und geordnete Farbstopps mit Positionen von 0–100 %. Diese Bildschirmdefinition ist keine verbindliche Druckvorlage. - Print: Gespeicherte CMYK-Prozentwerte sowie Pantone, HKS und RAL einschließlich aller hinterlegten Zusätze. RAL bezeichnet eine Lack-/Beschichtungsreferenz, keine CMYK-Umrechnung.
- Druckverbindlichkeit: CMYK wird nicht neu aus HEX berechnet. Bestehende Werte können im Editor automatisch entstanden sein;
cmyk_sourcekennzeichnet sie deshalb als gespeichert, nicht profilverifiziert.icc_profile: nullbedeutet: kein geprüftes Ausgabeprofil hinterlegt. Papier, Druckverfahren, ICC-Profil und Sonderfarben mit der Druckerei abstimmen; Anwendungshinweise stehen inusage. - Fehlende Angaben:
nullbedeutet nicht hinterlegt. Keine stille Ersetzung durch andere Farben;themezusammen mitmedium=printliefert HTTP 400.
Serverseitig laden und lokal speichern
const response = await fetch(
`https://brand.co-red.de/api/public/v1/${brand}/colors`,
{ headers: { Authorization: `Bearer ${API_KEY}` } }
);
if (!response.ok) throw new Error(`Color API: ${response.status}`);
const { data } = await response.json();
const primary = data.palettes.flatMap(p => p.colors)
.find(color => color.category === "primary");
const hex = primary?.digital?.light?.hex;Farbwerte im eigenen Projekt speichern und einmal täglich per ETag abgleichen. Der Asset-Manifest-Abgleich umfasst keine Farbpaletten; dafür /{brand}/colors separat prüfen. API-Schlüssel nur auf dem eigenen Server verwenden, nicht im ausgelieferten Browsercode.
Caching & Sync
Assets ändern sich selten. Nicht pro Seitenaufruf abfragen, sondern lokal cachen (Server, CDN, Build) und synchronisieren:
- Initial-Sync:
GET /manifestpaginiert abrufen (nextfolgen, bisnull) und benötigte Dateien speichern. Datei-URLs sind über?v=…versioniert und unbegrenzt cachebar. - Delta-Sync (1× täglich):
GET /manifest?since=<ISO-8601>liefert nur seitdem geänderte Assets. Nur diese Dateien neu laden, Zeitstempel des Laufs speichern. - Conditional Requests:
ETagspeichern und alsIf-None-Matchmitsenden – unverändert antwortet die API mit304ohne Body.
Sync-Job (Node 18+, z. B. als täglicher Cron)
const BASE = "https://brand.co-red.de/api/public/v1";
const headers = { Authorization: `Bearer ${process.env.BRAND_API_KEY}` };
export async function sync(lastRun?: string) {
let url = `${BASE}/manifest${lastRun ? `?since=${lastRun}` : ""}`;
const startedAt = new Date().toISOString();
while (url) {
const res = await fetch(url, { headers });
if (res.status === 429) { await new Promise(r => setTimeout(r, 5000)); continue; }
if (!res.ok) throw new Error(`Brand API ${res.status}`);
const page = await res.json();
for (const asset of page.data) await saveLocally(asset); // eigene Implementierung
url = page.next ? new URL(page.next, BASE).toString() : "";
}
return startedAt; // als lastRun für den nächsten Lauf speichern
}Empfehlung
Assets ausschließlich aus Ihrem Cache/CDN ausliefern, nicht live pro Seitenaufruf über die API. Das hält Latenz niedrig, macht Ihre Anwendung unabhängig von API-Ausfällen und vermeidet 429.
Fehler & Limits
Erfolg: JSON mit data. Fehler: einheitliches error-Objekt mit maschinenlesbarem code, message und – bei unbekannten Keys – einem hint mit ähnlichen gültigen Keys.
Fehlerformat
{
"error": {
"code": "not_found",
"message": "No asset registered for key 'logo-gruen' on brand 'waz'.",
"hint": "Meinten Sie: logo-farbig, logo-schwarz?"
}
}| Status | Bedeutung |
|---|---|
200 | Erfolg — Antwort enthält data |
302 | Weiterleitung auf die Datei (Pfad mit Endung) |
304 | Unverändert — Ihr Cache ist aktuell (ETag) |
401 | API-Schlüssel fehlt oder ist ungültig |
404 | Marke, Schlüssel oder Format unbekannt |
400 | Ungültige Parameter-Kombination |
429 | Rate-Limit erreicht — mit exponentiellem Backoff erneut versuchen |
- ETag / 304: Jede JSON-Antwort enthält einen
ETag. Senden Sie ihn alsIf-None-Matchmit, erhalten Sie bei unveränderten Daten ein schlankes304. - Datei-URLs sind versioniert: Der Parameter
?v=…ändert sich bei jedem Austausch. Dateien dürfen daher dauerhaft (immutable) zwischengespeichert werden. - Fallback: Mit
?fallback=1liefert die API eine verfügbare Variante statt eines Fehlers und kennzeichnet dies im Feldfallback_from. - Rate-Limit: Standardmäßig 600 Anfragen pro Minute und Schlüssel. Bei Überschreitung antwortet die API mit
429. - Nur lesen: Schreiboperationen sind nicht vorgesehen.
Fragen oder Wünsche zur API? Wenden Sie sich an das Marken-Team.