HTTP-API für Log-Ingest: JSON-Lines mit curl

Jede Integration auf dieser Website landet bei einem von fünf HTTP-Endpoints. Diese Seite ist die Referenz für den einfachsten davon, /v1/ingest/jsonline: ein JSON-Objekt pro Zeile, beliebige Keys. Nutz ihn aus Skripten, Cron-Jobs, CI-Pipelines oder einer Logging-Library mit HTTP-Transport.

Endpunkt: https://logs.uptimeeye.com/v1/ingest/jsonline

1.Die ersten Zeilen senden

shell
curl -sS -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline?_stream_fields=service,env" \
  -H "Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -H "Content-Type: application/x-ndjson" \
  --data-binary @- <<'JSON'
{"_time":"2026-09-04T11:42:08.877Z","_msg":"deploy finished","service":"ci","env":"prod","level":"info","version":"1.42.0"}
{"_msg":"cache warmed in 1.2s","service":"ci","env":"prod","level":"debug","duration_ms":1200}
JSON
Note: _msg ist die Nachricht, _time die Zeit des Events (RFC 3339; lässt du es weg, gilt die Ankunftszeit). Alles andere ist ein Feld, nach dem du filtern kannst.

2.Große Batches komprimieren

Angenommen werden Bodies bis 16 MiB unkomprimiert; gzip wird beim Eingang entpackt, abgerechnet werden die unkomprimierten Bytes.

shell
gzip -c events.ndjson | curl -sS -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline?_stream_fields=service,env" \
  -H "Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -H "Content-Type: application/x-ndjson" \
  -H "Content-Encoding: gzip" \
  --data-binary @-

3.Eigene Feldnamen zuordnen

Nutzt dein JSON schon message und @timestamp, sag das dem Endpoint, statt deine Events umzuschreiben.

shell
curl -sS -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline?_msg_field=message&_time_field=@timestamp&_stream_fields=service,env" \
  -H "Authorization: Bearer ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  --data-binary @events.ndjson

4.Basic Auth statt Bearer-Token

Für Tools, die nur Benutzer und Passwort kennen: ein beliebiger Benutzername und der Key als Passwort.

shell
curl -sS -u "key:ue_ingest_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -X POST "https://logs.uptimeeye.com/v1/ingest/jsonline" --data-binary @events.ndjson

Tipps

  • Bündeln: Eine Anfrage pro Zeile ist der langsamste Weg, Logs zu senden. Peil Batches von einigen hundert Zeilen oder ein paar Sekunden an.
  • Verschachtelte Objekte werden zu Keys mit Punkten flachgeklopft (http.status → Feld http.status).
  • Feldnamen unterscheiden Groß- und Kleinschreibung; Level und level sind zwei Felder.

FAQ

Welche Antwortcodes kann ich bekommen?

200 angenommen · 400 fehlerhaftes JSON oder fehlerhafte Kompression · 401 Key fehlt oder ist unbekannt · 403 Plan ohne Logs · 413 Body über 16 MiB · 415 nicht unterstütztes Content-Encoding · 429 Monatskontingent aufgebraucht (siehe Retry-After) · 502/503 Speicher oder Key-Auflösung vorübergehend nicht verfügbar – mit Backoff erneut versuchen.

Gibt es einen Elasticsearch-kompatiblen Endpoint?

Ja: POST /v1/ingest/elasticsearch/_bulk nimmt das Bulk-Format an, das Filebeat, Vector und der es-Output von Fluent Bit erzeugen. GET /v1/ingest/elasticsearch/ beantwortet den Versions-Handshake.

Wo bekomme ich den Ingest-Key?

In der App unter API-Keys → Neuer API-Key → Typ „Log-Ingest“. Der Key beginnt mit ue_ingest_ und wird nur einmal angezeigt. Management-Keys (ue_live_) lehnt der Ingest-Endpoint ab.

Wie sehe ich, ob Logs ankommen?

Öffne Logs in der App, wähl den Zeitraum „15 Min.“ und such nach service:=<your service>. Neue Zeilen sind nach etwa einer Sekunde durchsuchbar; Live-Tail zeigt sie mit etwa 6 s Verzögerung.