> ## Documentation Index
> Fetch the complete documentation index at: https://docs.streame.gg/llms.txt
> Use this file to discover all available pages before exploring further.

# $(customapi)

> Ruft eine Webadresse ab und setzt die Antwort in den Command ein.

Ruft beim Aufruf des Commands eine **feste Webadresse** ab und setzt die Antwort als Text in die Bot-Nachricht. Damit bindest du fremde Dienste an: deinen Rang in einem Spiel, eine Follower-Zahl, ein eigenes Script oder deine eigene API. Der Bot ruft die Adresse nicht selbst ab, sondern über einen Streame-Proxy.

`$(url URL)` und `$(urlfetch URL)` sind dieselbe Variable unter anderen Namen. So funktionieren Commands, die du von einem anderen Bot übernimmst, ohne Änderung.

| Antwort-Text | Output im Chat (Beispiel) |
| - | - |
| `Wir sind schon $(customapi https://decapi.me/twitch/followcount/whyscarface) Follower!` | `Wir sind schon 1053 Follower!` |
| `Mein Rang: $(url https://api.kyroskoh.xyz/valorant/v1/mmr/EU/Scarface/WHY?show=combo&display=0)` | `Mein Rang: Ascendant 1 - 53RR` |
| `Neues Video: $(urlfetch https://decapi.me/youtube/latest_video?user=@ScarfaceGG)` | `Neues Video: 🇯🇵 Pokémon Center in Parco Shibuya / Tokio! - https://youtu.be/-oVaE8iOsG0` |

***

## So richtest du die Adresse ein

* **Nur im Dashboard.** Trage den Command unter **Chatbot → Commands** ein. Per Chat ([`!add` / `!edit`](/chatbot/twitch-chat/add-edit)) nimmt der Bot keine Adresse an und antwortet mit `❌ $(customapi) kann nur im Dashboard eingerichtet werden.`
* **Nur im Antwort-Text.** In der Antwort bei erneutem Aufruf eines Commands mit [Limit](/chatbot/commands#limit-einmal-pro-stream-oder-pro-zuschauer) ist die Variable nicht erlaubt.
* **Einmal pro Command.** Das Dashboard nimmt nur ein `$(customapi)` pro Command an.
* **Nur in Custom Commands.** In Countern, Timern, Benachrichtigungen und Default Commands funktioniert die Variable nicht.

Das Dashboard prüft die Adresse beim Speichern:

| Regel | Beispiel |
| - | - |
| Beginnt mit `https://` | `http://` wird abgelehnt |
| Domain mit Punkt, keine IP-Adresse | `https://api.example.com/…`, nicht `https://1.2.3.4/…` |
| Kein Port, keine Zugangsdaten | nicht `:8443`, nicht `user:passwort@` |
| Kein Leerzeichen, höchstens 2048 Zeichen | Leerzeichen als `%20` schreiben |
| Keine Variable in der Adresse | `$(customapi https://example.com/$(user))` wird abgelehnt |
| Kein `)` in der Adresse | Die Variable endet an der ersten schließenden Klammer. Schreibe `%29` |

<Note>
  Die Adresse ist **fest**: Zuschauer können nichts anhängen, und `$(user)` oder `$(touser)` lassen sich nicht einbauen. Wer den Command ausgelöst hat, erfährt dein Dienst über die Header (siehe unten).
</Note>

***

## Was dein Dienst bekommt

Der Abruf ist ein GET ohne Body. Die Anfrage kommt von einem Streame-Proxy, nicht von deinem Rechner und nicht von Twitch. Mitgeschickt werden:

| Header | Inhalt |
| - | - |
| `User-Agent` | `Streame Web Proxy (+https://docs.streame.gg)` |
| `Accept` | `text/plain, application/json` |
| `X-Streame-Platform` | `twitch` |
| `X-Streame-Channel-Id` | Twitch-ID deines Kanals |
| `X-Streame-Channel-Login` | Login-Name deines Kanals |
| `X-Streame-User-Id` | Twitch-ID des Zuschauers, der den Command ausgelöst hat |
| `X-Streame-User-Login` | Login-Name dieses Zuschauers |

<Warning>
  **Die Header sind nicht fälschungssicher, und es gibt keinen festen IP-Bereich.** Jeder kann die Header mit einem eigenen Programm nachbauen, und die IP-Adressen des Streame-Proxys können sich ohne Ankündigung ändern. Verlass dich auf beides nicht, um deinen Dienst abzusichern. Soll er nur auf deinen Bot reagieren, lege ein Geheimnis in die Adresse, z.B. `?token=…`, und prüfe es dort.
</Warning>

Damit so ein Geheimnis geheim bleibt:

* Auf deiner **öffentlichen Commands-Seite** steht nur `$(customapi)` mit dem Hinweis "URL ausgeblendet", nie die Adresse.
* Per Chat lässt sich die Adresse weder eintragen noch anzeigen.
* Wer Zugriff auf dein Dashboard hat (auch Mods mit Zugang), sieht die Adresse im Editor.

***

## Was dein Dienst antworten muss

* **Text oder JSON.** Eine Antwort vom Typ `text/…` oder `application/json`. HTML-Seiten, Bilder und Dateien werden abgelehnt. JSON wird so eingesetzt, wie es ankommt, ein einzelnes Feld lässt sich nicht herausgreifen.
* **Status 2xx.** Jeder andere Status landet als Fehlertext im Chat (siehe unten).
* **Schnell.** Nach 10 Sekunden bricht der Abruf ab. Bis zu 3 Weiterleitungen werden mitgegangen, Google Apps Script funktioniert damit.
* **Kurz.** Gelesen werden höchstens die ersten 16 KB, im Chat landen höchstens **400 Zeichen**. Zeilenumbrüche werden zu Leerzeichen.
* Eine **leere** Antwort ergibt nichts, der Rest des Commands wird normal gesendet.

<Info>
  Beginnt die Antwort mit `/`, `.` oder `!`, entfernt der Bot diese Zeichen. So kann eine Antwort weder einen Twitch-Befehl noch einen Command eines anderen Bots auslösen. Variablen in der Antwort werden nicht ausgewertet.
</Info>

***

## Grenzen

Damit der Bot für alle Kanäle schnell bleibt, gelten feste Grenzen:

| Grenze | Wert |
| - | - |
| Abrufe pro Kanal | 30 pro Minute |
| Pause nach Fehlschlägen | Antwortet eine Domain 5 Mal in Folge nicht (Timeout, nicht erreichbar, Zertifikat), wartet der Bot 2 Minuten, bevor er es wieder versucht |
| Dauer | 10 Sekunden pro Abruf |
| Antwort | 400 Zeichen |

Der Cooldown des Commands (Standard 5 Sekunden) gilt auch, wenn der Abruf fehlschlägt. Setze ihn höher, wenn dein Dienst eine eigene Grenze pro Minute hat.

<Note>
  Streame kann die Variable bei Missbrauch für einzelne Dienste oder Kanäle sperren und bei Störungen für alle Kanäle vorübergehend anhalten. Das Dashboard sagt dir beim Speichern, wenn dein Kanal betroffen ist.
</Note>

***

## Fehlertexte im Chat

Schlägt der Abruf fehl, bricht der Command nicht ab. An der Stelle der Variable steht ein kurzer Text, der Rest der Antwort wird normal gesendet:

| Text im Chat | Ursache |
| - | - |
| `[API nicht erreichbar]` | Timeout nach 10 Sekunden, Domain nicht auflösbar, Verbindung oder Zertifikat fehlerhaft, Antwort ist HTML oder eine Datei, zu viele Weiterleitungen, Ziel nicht erlaubt, oder die Domain ist nach 5 Fehlschlägen in Folge pausiert |
| `[API-Fehler 404]` | Dein Dienst hat mit einem Status außerhalb von 2xx geantwortet, mit dem echten Code |
| `[API-Limit erreicht]` | Eine Grenze aus der Tabelle oben greift, oder es laufen gerade zu viele Abrufe gleichzeitig |
| nichts | Leere Antwort, oder Streame hat die Variable vorübergehend angehalten |

<Tip>
  Steht dauerhaft `[API nicht erreichbar]` im Chat, öffne die Adresse im Browser: Antwortet sie mit Text oder JSON, mit `https://` und innerhalb weniger Sekunden? Dann prüfe, ob eine Weiterleitung auf eine HTML-Seite führt.
</Tip>

***

## Datenschutz

Bei jedem Abruf gehen der Login-Name und die Twitch-ID deines Kanals und des Zuschauers, der den Command auslöst, an die eingetragene Adresse. Beides ist auf Twitch öffentlich. Die IP-Adresse des Zuschauers wird nicht übermittelt. Welche Adresse du einträgst und was der Betreiber damit macht, liegt in deiner Verantwortung. Trage nur Dienste ein, denen du vertraust.

***

## Zurzeit nicht möglich

* Variablen oder Zuschauer-Eingaben in der Adresse
* Ein einzelnes Feld aus einer JSON-Antwort herausgreifen
* Einsatz in Timern, Benachrichtigungen und Countern
* Domains mit Umlauten (schreibe sie in der `xn--`-Form) und Ziele, die nur über IPv6 erreichbar sind


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.