API & Integration

agentView API

agentView stellt Displays (TVs, Tablets, Kioske) bereit und macht sie per API steuerbar. Du sendest HTML an ein Display — agentView liefert es in Echtzeit aus.

Drei Integrationswege: REST API mit JWT oder API-Key, MCP mit OAuth 2.1, oder direkt per POST mit tokenisierter URL.

Für KI-Coding-Agenten

Machine-Readable APIs

Diese Seite ist die menschenlesbare Übersicht. Wenn du als KI-Coding-Agent integrierst, lies stattdessen direkt die JSON-Quellen — sie sind die Single Source of Truth und können nicht veralten:

JSON /mcp/manifest Vollständige MCP-Capability-Beschreibung: Tools (mit category, Input/Output-Schemas, Security-Schemes), Prompts, Resources, Auth-Flow.
JSON /swagger/agent/swagger.json OpenAPI 3 für die öffentliche REST-API. Enthält alle Pfade, Parameter, Response-Schemas und tags zur Domänen-Gruppierung.
MD /agent-instructions Markdown-Anleitung speziell für Agenten — Auth-Flow, empfohlene Tool-Reihenfolge, häufige Fehler.
JSON /api/status Health-Check + Discovery-URLs für alle anderen Quellen. Idealer Einstiegspunkt.

Live-Daten werden geladen…

Quick Start

REST API in 3 Schritten

1. Session erstellen (kein Login nötig)

curl -X POST https://agentview.de/api/v1/agent/session/request \
  -H "Content-Type: application/json" \
  -d '{"scope": "content_only"}'

Antwort enthält sessionRequestId, loginUrl und pollUrl. Der Nutzer öffnet die loginUrl im Browser und meldet sich an.


2. Token abholen (nach Login des Nutzers)

curl https://agentview.de/api/v1/agent/session/status?id=SESSION_ID

Gibt "status": "active" und ein agentToken (JWT) zurück, sobald der Nutzer den Zugriff bestätigt hat.


3. HTML an ein Display senden

curl -X POST https://agentview.de/api/v1/agent/displays/ABCD1234/content \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: text/html; charset=utf-8" \
  -d '<html><body style="margin:0;background:#111;color:#fff;
    display:grid;place-items:center;height:100vh;font-family:sans-serif">
    <h1>Hello World</h1></body></html>'

Das Display zeigt den Inhalt sofort an. Für die Display-ID: GET /api/v1/agent/displays.

Authentifizierung

3 Wege

  • Session-Flow (interaktiv): Agent erstellt Session, Nutzer loggt sich im Browser ein, Agent bekommt JWT. Für Chat-Agenten und UIs.
  • API-Key (headless): Langlebiger Key (avk_...) ohne Browser-Login. Für Automationen, CI/CD, Home Assistant.
  • MCP OAuth 2.1: Authorization Code + PKCE über /.well-known/oauth-authorization-server. Für MCP-Clients.

API-Key-Beispiel:

# Key erstellen (erfordert admin-Scope)
curl -X POST https://agentview.de/api/v1/agent/api-keys \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Home Assistant", "scope": "content_only"}'

# Key verwenden
curl -H "X-API-Key: avk_a1b2c3d4e5f6..." \
  https://agentview.de/api/v1/agent/displays

Der rohe Key wird nur einmal angezeigt (SHA-256-Hash gespeichert). Max. 10 Keys pro Nutzer.

Scopes

Berechtigungsmodell

content_only

  • Inhalte senden (HTML, URL)
  • Displays auflisten und inspizieren
  • Organisationen anzeigen
  • SSE-Events empfangen

admin

  • Alles aus content_only
  • Displays erstellen, löschen, sperren, konfigurieren
  • Idle-Inhalte setzen
  • Organisationen verwalten
  • API-Keys erstellen und widerrufen
Standard: content_only. Der Nutzer kann bei der Freigabe einen admin-Request auf content_only herabstufen.
REST API

Endpoint-Referenz

Basis-URL: https://agentview.de — alle Endpoints unter /api/v1/agent/ erfordern Authentifizierung, sofern nicht anders angegeben.

Untenstehender Katalog ist kuratiert. Vollständige Liste aller Endpoints inklusive Parameter und Schemas: /swagger/agent/swagger.json oder interaktiv im Swagger-UI.

Discovery & Status (kein Login)

GET /agent-instructions Maschinenlesbare Anleitung (Markdown)
GET /api/status Health-Check, Version, Discovery-URLs
GET /api/v1/agent/pricing Pläne, Preise, Features
GET /api/v1/agent/public-apis?query=...&category=...&cors_only=...&limit=... 600+ freie APIs durchsuchen (Wetter, News, Bilder, Sport, ...)
GET /api/v1/agent/public-apis/categories Alle API-Kategorien mit Anzahl
GET /api/v1/agent/public-apis/{slug} Details einer API inkl. fetch()-Hint
GET /swagger OpenAPI / Swagger UI

Authentifizierung

POST /api/v1/agent/session/request Login-Session erstellen → loginUrl, pollUrl
GET /api/v1/agent/session/status?id=... Session-Status abfragen → JWT Token
POST /api/v1/agent/api-keys API-Key erstellen (admin)
GET /api/v1/agent/api-keys Eigene API-Keys auflisten
DELETE /api/v1/agent/api-keys/{id} API-Key widerrufen

Account

GET /api/v1/agent/me Name, E-Mail, Plan, Display-Slots

Displays

GET /api/v1/agent/displays Alle Displays auflisten
POST /api/v1/agent/displays Neues Display erstellen (admin)
GET /api/v1/agent/displays/{id} Details inkl. Runtime-Fakten, Hardware-Settings und Verbindungsstatus
PATCH /api/v1/agent/displays/{id} Umbenennen (admin)
DELETE /api/v1/agent/displays/{id} Löschen (admin)
GET /api/v1/agent/displays/{id}/capabilities Aufgelöste Konnektivität: Modus, Whitelist, Herkunft

Content

POST /api/v1/agent/displays/{id}/content HTML oder Base64-HTML senden
POST /api/v1/agent/displays/{id}/url URL per iframe laden
GET /api/v1/agent/displays/{id}/content Aktuellen Content-State abfragen
POST /api/v1/agent/displays/broadcast An mehrere Displays gleichzeitig senden
POST /send/{id}?token=...&duration=300 Direkter Send mit Token (kein Login)

Display-Verwaltung (admin)

POST /api/v1/agent/displays/{id}/lock Display sperren
POST /api/v1/agent/displays/{id}/unlock Sperre aufheben
POST /api/v1/agent/displays/{id}/clear Auf Idle zurücksetzen
POST /api/v1/agent/displays/{id}/default Idle-Content setzen oder löschen (HTML)
POST /api/v1/agent/displays/{id}/configure Kamera, Mikrofon, Geolocation, Cursor, Badge, Watermark
POST /api/v1/agent/displays/{id}/claim Unkonfiguriertes Display uebernehmen

Assets

POST /api/v1/assets Assets hochladen (multipart, 1-20 Dateien, max 10 MB)
GET /api/v1/assets Eigene Assets auflisten (paginiert, Filter nach Typ/Suche)
GET /api/v1/assets/{id} Asset-Metadaten und URL abrufen
PATCH /api/v1/assets/{id} Name und/oder Beschreibung aktualisieren
DELETE /api/v1/assets/{id} Einzelnes Asset löschen
DELETE /api/v1/assets Mehrere Assets löschen (Bulk, max 100)

Data Slots

Mutable JSON storage cells readable by displays via public URLs. Two types: value slots (store JSON verbatim) and JSON collections (type=aggregate, shown as 📦 in the dashboard — combine multiple slots into one read response).

GET /api/v1/data List all data slots (metadata only, paginated)
GET /api/v1/data/quota Check storage quota usage
GET /api/v1/data/{slug} Get a single slot with its content and readUrl
PUT /api/v1/data/{slug}?type=aggregate&label=...&groupId=... Create or update a data slot — body is raw JSON. type=aggregate creates a JSON collection.
DELETE /api/v1/data/{slug} Delete a data slot
GET /data/u/{publicSlug}/{slug}.json Public read URL — personal slot, no auth required
GET /data/g/{groupSlug}/{slug}.json Public read URL — group slot, no auth required

JSON Collections (aggregate slots)

A JSON collection merges multiple value slots into one response, resolved on every fetch. Create with ?type=aggregate and a body listing source slot slugs. The dashboard shows these as 📦.

# Create a value slot
curl -X PUT https://agentview.de/api/v1/data/sensor-a \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"temp": 21.4, "unit": "C"}'

# Create a JSON collection (aggregate slot)
curl -X PUT "https://agentview.de/api/v1/data/all-sensors?type=aggregate&label=All+Sensors" \
  -H "Authorization: Bearer TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"sources":[{"slot":"sensor-a"},{"slot":"sensor-b"}]}'

# Public read (returns merged result, no auth)
# GET /data/u/{publicSlug}/all-sensors.json
# => {"sensor-a":{"temp":21.4,"unit":"C"},"sensor-b":{...}}

Organisationen

GET /api/v1/agent/organizations Eigene Organisationen mit Stats
GET /api/v1/agent/organizations/{orgId} Details mit Mitgliedern und Displays
POST /api/v1/agent/organizations/{orgId}/invite Mitglied einladen (admin)
POST /api/v1/agent/organizations/{orgId}/slots Display-Slots zuweisen (admin)
POST /api/v1/agent/organizations/{orgId}/displays Org-Display erstellen (admin)

Echtzeit

GET /api/v1/agent/events SSE-Stream: display_online, display_offline, content_delivered, content_cleared
Server-Sent Events

Echtzeit-Events statt Polling

curl -N -H "Authorization: Bearer TOKEN" \
  https://agentview.de/api/v1/agent/events
event: connected
data: {"displayIds":["ABCD1234","EFGH5678"],"timestamp":"..."}

event: display_online
data: {"displayId":"ABCD1234","timestamp":"..."}

event: content_delivered
data: {"displayId":"ABCD1234","fileName":"abc.html","timestamp":"..."}

Der Stream filtert automatisch auf Displays, die dem authentifizierten Nutzer gehören. Bei JWT-Ablauf wird der Stream geschlossen — der Client reconnected mit frischem Token.

MCP

Model Context Protocol

Für KI-Clients die MCP sprechen (Claude Desktop, ChatGPT, etc.). Streamable HTTP mit OAuth 2.1 Authorization Code + PKCE.

OAuth 2.1 + PKCE Flow

# 1. Discovery
GET /.well-known/oauth-protected-resource/mcp
GET /.well-known/oauth-authorization-server

# 2. Authorization
GET /authorize?response_type=code&code_challenge=...&code_challenge_method=S256
# User login + consent

# 3. Token
POST /token  (grant_type=authorization_code, code_verifier=...)

# 4. MCP-Calls
POST /mcp
Authorization: Bearer TOKEN
Mcp-Session-Id: SESSION_ID

Tools, Prompts und Resources sind maschinenlesbar unter GET /mcp/manifest verfügbar — nutze diesen Endpoint zur Capability-Discovery anstatt eine statische Liste zu pflegen. Kurzanleitung und Integrationshinweise: /agent-instructions.

Empfohlener Agent-Workflow

  1. Discovery: Lade GET /mcp/manifest (oder lies agentview://public/instructions via fetch) um Tools, Prompts und Resources zu kennen.
  2. Auth: Hat dein Client OAuth 2.1 mit PKCE? Nutze ihn. Sonst: ruf create_auth_session, zeige dem Nutzer die loginUrl, polle get_auth_session, der Server bindet das Token automatisch an die MCP-Session.
  3. Kontext lesen: get_account für Plan/Quota, list_displays für verfügbare Displays, get_display_capabilities für Browser-/Runtime-Limits eines Ziels.
  4. Inhalt finden oder erzeugen: Nutzer-Wunsch → entweder search_store_templates + send_store_template_to_display (vorgefertigte Designs), oder generiere HTML auf Basis des render_premium_display_html-Prompts und sende mit send_html.
  5. Live-Daten: Für mutierbare JSON-Daten nutze set_data_slot — Displays lesen sie über die öffentliche readUrl. Für externe Quellen siehe search_public_apis.

Tool-Katalog

Übersicht der MCP-Tools nach Domäne. Vollständige Schemas, Argumente und Output-Strukturen unter GET /mcp/manifest. GET = read-only, WRITE = mutiert, EDIT = idempotenter Update, DEL = destruktiv/löschend.

Auth & Identität

GET create_auth_session Browser-Login starten → loginUrl, sessionRequestId. Kein Bearer-Header nötig.
GET get_auth_session Login-Status pollen; bei active wird die MCP-Session automatisch authentifiziert.
GET authenticate Vorhandenes JWT auf der Session cachen (Fallback wenn der Client keinen Authorization-Header sendet).
GET logout Cached-Identity der MCP-Session löschen (revoked das JWT nicht).

Discovery, Suche & Public

GET get_public_status Öffentlicher Health-Check, Version, Discovery-URLs.
GET search Volltextsuche über agentView-Resources (Docs, Account, Displays, APIs).
GET fetch Vollständigen Resource-Inhalt per agentview://… URI laden.
GET get_pricing Pläne, Preise, Add-ons (kein Login).
GET search_public_apis 600+ kuratierte freie APIs (Wetter, News, Sport, Bilder, …) inkl. fetch()-Hint.

Account, Orgs & Lizenzen

GET get_account Profil, Plan, Display-Quota, Org-Mitgliedschaften.
GET list_organizations Alle Orgs des Nutzers mit Stats.
GET get_organization Mitglieder, Slots, Displays einer Org.
GET list_org_displays Org-Displays mit Online-Status.
GET get_license_info Premium-Lizenz-Pool und Allokationen.
GET get_billing_url Link zur Abrechnungsseite (Lizenzen kaufen/verwalten).
WRITE create_organization Neue Org anlegen, Nutzer wird Owner. Admin-Scope.
EDIT rename_organization Org umbenennen.
DEL delete_organization Org löschen, Displays freigeben.
WRITE invite_member Invite-Link mit Rolle, optional E-Mail-gebunden, 7 Tage gültig.
EDIT update_member_role Rolle eines Mitglieds ändern.
DEL remove_member Mitglied entfernen, Displays an Nachfolger transferieren.
EDIT allocate_licenses Premium-Lizenzen an Org allokieren (0 deallokiert).
EDIT set_display_grant Nutzer Zugriff (view/control) auf Org-Display geben.
DEL remove_display_grant Zugriff eines Nutzers auf ein Display widerrufen.
DEL remove_display_from_org Display aus Org herausnehmen.
EDIT set_org_connectivity Default-Connectivity-Mode und globale Whitelist der Org setzen.

Display-Verwaltung

GET list_displays Alle erreichbaren Displays inkl. Runtime-Hints.
GET get_display Volldetails eines Displays.
GET get_display_capabilities Browser, Engine, Features, Limitations, recommendedDeliveryMode — vor dem Senden lesen.
WRITE pair_by_code Bevorzugt für physische Geräte: 6-Code vom TV abfragen, in einem Schritt anlegen+pairen.
WRITE create_display Persönliches Display ohne Hardware (Vor-Provisionierung).
WRITE create_org_display Org-Display ohne Hardware. Lizenz benötigt.
WRITE claim_display Guest-/Demo-Display in eigenes Konto übernehmen.
EDIT rename_display Anzeigenamen ändern.
EDIT configure_display Kamera, Mikro, Geo, Sprache, Cursor, Badge, Watermark.
EDIT lock_display / unlock_display Schreibsperre setzen/lösen.
EDIT assign_license / unassign_license Premium-Lizenz zuweisen (entfernt Watermark, +30 MB Storage).
DEL delete_display Display und Inhalte unwiderruflich löschen.

Content-Delivery

WRITE send_html HTML/Base64 an ein Display senden. description (1-1000) ist Pflicht.
WRITE send_url Externe URL im Vollbild-Iframe laden.
WRITE broadcast_content An mehrere Displays gleichzeitig (Liste oder all: true). Locked-Displays werden geskippt.
DEL clear_display Live-Inhalt entfernen, zurück auf Idle.
EDIT set_idle_content Idle-/Default-HTML setzen oder löschen.
GET get_display_content Aktueller Content-State + currentContentDescription.
GET read_display_html Roh-HTML lesen (live oder idle) für Inspect/Edit/Re-Upload.

Assets (Bilder, Fonts, Video, …)

WRITE upload_asset Base64-Files hochladen, stabile URLs zurück. 1-20 Files, max 10 MB pro File.
GET list_assets / get_asset Asset-Inventar durchsuchen, Metadaten holen (URL ändert sich nie).
EDIT update_asset Name/Beschreibung ändern.
DEL delete_asset Ein oder mehrere Assets löschen (max 100).

Data Slots (mutierbarer JSON-Storage)

EDIT set_data_slot Slot anlegen/aktualisieren. type: "aggregate" für JSON-Collections.
GET get_data_slot Inhalt eines Slots inkl. readUrl.
GET list_data_slots Alle Slots (nur Metadaten).
DEL delete_data_slot Slot löschen.

Store Templates (fertige Designs)

GET search_store_templates Designs durchsuchen (Bistro, Wartezimmer, Empfang, …).
GET list_store_categories Alle Kategorien mit Counts (de/en).
GET get_store_template_details Volle Markdown-Beschreibung eines Templates.
GET get_store_template_install_options Erlaubte Ziel-Displays und benötigte Data Slots.
WRITE send_store_template_to_display Template installieren, optional data_slot_overrides direkt mit-baken.

API Keys

WRITE create_api_key Langlebigen avk_…-Key anlegen. Granular: Slot-/Display-Whitelist, Capabilities, read/write.
GET list_api_keys Eigene Keys auflisten (nur Prefix, nie Klartext).
DEL revoke_api_key Key sofort und unwiderruflich deaktivieren.

Prompts

Vorgefertigte Anweisungs-Templates die ein Client per prompts/get abruft, um den Agenten in eine Aufgabe zu lenken.

PROMPT onboard_first_display Schritt-für-Schritt-Anleitung für das erste Display eines Nutzers.
PROMPT recover_mcp_auth Diagnose-Leitfaden für OAuth-/Discovery-/Session-Fehler.
PROMPT render_premium_display_html Creative-Brief für hochwertige Display-HTML aus einem One-Shot-Wunsch.

Resources (agentview://…)

Lesbar via fetch-Tool oder direkt über das MCP resources/read-Verb. Public-Resources brauchen kein Login; account/… und display/… erfordern eine authentifizierte Session.

RES agentview://public/status Server-Health, Version, Discovery-URLs.
RES agentview://public/instructions Maschinenlesbare Agent-Anleitung (Markdown).
RES agentview://public/design-system Creative-Brief und Design-Tokens für Display-HTML.
RES agentview://public/developers Diese Entwickler-Doku als Resource.
RES agentview://public/mcp MCP-spezifische Hinweise (Manifest, Prompts, Resources).
RES agentview://public/oauth OAuth-Discovery-URLs und Flow-Hinweise.
RES agentview://public/support Support-Kanäle und Status-Links.
RES agentview://account/me Profil, Plan, Quota des authentifizierten Nutzers.
RES agentview://account/session Aktuelle MCP-Session-Identität (Scope, Auth-Quelle).
RES agentview://account/displays Live-Index der erreichbaren Displays.
RES agentview://display/{displayId} Live-Status, Settings und Management-URLs eines Displays.

Beispiel: Claude Desktop / generischer MCP-Client

{
  "mcpServers": {
    "agentview": {
      "transport": {
        "type": "streamable-http",
        "url": "https://agentview.de/mcp"
      }
    }
  }
}

Der Client erkennt OAuth automatisch über die WWW-Authenticate: Bearer resource_metadata=… Antwort auf einen ersten POST /mcp ohne Token und löst PKCE eigenständig aus. Für Clients ohne OAuth: create_auth_session-Flow nutzen (siehe oben).

Zum Testen: MCP Inspector.

Content-Format

Was auf dem Display ankommt

Es wird eine einzelne HTML-Datei hochgeladen und in einem Fullscreen-Iframe gerendert. Die Datei darf externe Ressourcen laden (CDN-Fonts, Bilder, Scripts, APIs).

Hinweis: Displays können eingeschränkte Konnektivität haben. Prüfe GET /displays/{id}/capabilities vor dem Senden externer URLs oder komplexer HTML-/JS-Inhalte. Siehe Konnektivität.

POST /api/v1/agent/displays/ABCD1234/content
Authorization: Bearer TOKEN
Content-Type: text/html; charset=utf-8

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="/css/inter.css">
</head>
<body style="margin:0;height:100vh;display:grid;place-items:center;
  background:linear-gradient(135deg,#0a0a2e,#1a1a4e);color:#fff;font-family:Inter,sans-serif">
  <div style="text-align:center">
    <h1 style="font-size:4rem;margin:0">Welcome</h1>
    <p id="clock" style="font-size:2rem;opacity:0.7"></p>
  </div>
  <script>setInterval(()=>document.getElementById('clock').textContent=
    new Date().toLocaleTimeString(),1000)</script>
</body>
</html>

Alternativ: POST /displays/{id}/url für eine beliebige URL im iframe, wenn eine externe Webseite unverändert angezeigt werden soll.

Konnektivität

Advisory Connectivity System

Jedes Display hat ein aufgelöstes Konnektivitätsprofil. Admins deklarieren die Netzwerk-Topologie, und der Agent nutzt diese Info, um Inhalte passend auszuliefern. Zusätzlich meldet das Display konkrete Browser- und Runtime-Fakten wie Fetch, WebSockets, srcdoc, CSS-Fähigkeiten und bekannte Einschränkungen. Das System ist rein informativ — der Server blockt keine Requests.

Drei Modi

  • full-access — Display kann jede URL laden (Standard für private Displays).
  • whitelist-only — Nur URLs die der Whitelist entsprechen. Alles andere als eingebetteten HTML-Payload senden.
  • isolated — Keine externen URLs. Alle Inhalte müssen als Base64/HTML-Payload eingebettet werden.

Vererbung

Einstellungen werden hierarchisch aufgelöst: System-Default → Organisation → Display-Override. Whitelists werden per Union zusammengeführt, es sei denn Strict-Mode ist aktiv.

API-Beispiel

GET /api/v1/agent/displays/ABCD1234/capabilities
Authorization: Bearer TOKEN
{
  "displayId": "ABCD1234",
  "connectivity": {
    "resolvedMode": "whitelist-only",
    "effectiveWhitelist": [
      "*.mycompany.corp",
      "weather-service.io",
      "local-intranet.local"
    ],
    "supportsEmbeddedContent": true
  },
  "runtime": {
    "userAgent": "Mozilla/5.0 (SMART-TV; Linux; Tizen 3.0) AppleWebKit/537.36 Chrome/47.0.2526.69 Safari/537.36",
    "browser": {
      "name": "Chrome",
      "version": "47.0.2526.69",
      "major": 47,
      "source": "user_agent"
    },
    "screen": {
      "width": 1920,
      "height": 1080,
      "resolution": "1920x1080",
      "source": "feature_probe"
    },
    "hasTouch": false,
    "featureSource": "feature_probe",
    "features": {
      "canRenderCustomHtml": true,
      "canRunCustomJavaScript": true,
      "supportsFetch": false,
      "supportsWebSockets": true,
      "supportsIframeSrcdoc": false,
      "supportsCssVariables": true,
      "supportsBackdropFilter": false,
      "supportsModernJsSyntax": false
    },
    "knownLimitations": [
      "Fetch API is unavailable. Prefer inline data or simpler HTML payloads.",
      "iframe srcdoc is unavailable. Prefer file-backed content URLs over inline iframe payloads.",
      "Modern JavaScript syntax is unavailable. Transpile ES6+ code before sending it."
    ],
    "recommendedDeliveryMode": "simple_html"
  },
  "metadata": {
    "inheritedFrom": "Organization-Default"
  }
}
Advisory, not Enforcement: Der Server blockt keine Requests, die gegen die Whitelist verstoßen. Der Agent wird erwartet, die Capabilities zu prüfen und Inhalte entsprechend auszuliefern.
Response-Beispiel

GET /api/v1/agent/displays

{
  "displays": [
    {
      "id": "ABCD1234",
      "name": "Lobby",
      "status": "degraded",
      "isOnline": false,
      "isDegraded": true,
      "isReachable": true,
      "statusHint": "Display is reachable without a live connection. Content changes can arrive with delay.",
      "lastSeen": "2026-03-16T14:23:00Z",
      "lastFallbackPollAt": "2026-03-16T14:24:00Z",
      "locked": false,
      "displayUrl": "https://agentview.de/d/ABCD1234",
      "settings": {
        "allowCamera": false,
        "allowMicrophone": false,
        "allowGeolocation": false,
        "showMouseCursor": false,
        "showBadgeOverlay": true,
        "watermarkPosition": "BottomLeft"
      }
    }
  ],
  "total": 1,
  "remainingSlots": 2
}

Statuswerte: online = aktive Echtzeitverbindung, degraded = erreichbar ohne aktive Echtzeitverbindung, offline = aktuell nicht erreichbar.

Rate Limiting

Response-Headers

Rate-limitierte Endpoints liefern diese Headers in jeder Response:

X-RateLimit-Limit: 100
X-RateLimit-Window: 60
X-RateLimit-Policy: StoragePolicy

Bei Überschreitung: 429 Too Many Requests. Betrifft Login-Endpoints (10/min), Content-Uploads (100/min) und Cancellations (5/10min).