Zum Hauptinhalt springen

Ereignisse senden

Ein Ereignis ist etwas, das passiert ist und von Ihrem System in dem Moment eingespielt wird, in dem es passiert ist. Reelwire rendert es mit der Vorlage, die der Stream trägt, für jeden Kanal, der diesen Stream abonniert hat, und übergibt jeden Clip so, wie sein Kanal es sagt: per E-Mail, per Webhook oder über den Plattform-Connector des Kanals, der einzige Weg, auf dem Reelwire selbst veröffentlicht. Was danach geschieht, steht unter Beiträge und Aufträge. Das ist die Integration, die die meisten Kunden zuerst schreiben, und für einen Produzenten oder ein Handelssystem ist sie oft die einzige.

Zwei Routen nehmen Ereignisse entgegen. POST /v1/stream nimmt Ihre eigenen Daten, adressiert über eine Stream-ID, die Sie angelegt haben. POST /v1/ingest/{source}/{format} nimmt die Daten eines mitgelieferten Feeds für Ihr Konto, adressiert über die eigenen Slugs des Feeds. Beide nehmen bis auf die Adresse denselben Umschlag (die mitgelieferte Route nimmt zusätzlich einen origin und, bei manuellen Daten, einen schedule), beide sind idempotent über eventId, und beide haben einen Probelauf neben sich.

MethodePfadBerechtigung
POST/v1/streamingest:write
POST/v1/stream/validateingest:write
GET/v1/streamingest:write
POST/v1/ingest/{source}/{format}ingest:write
POST/v1/ingest/{source}/{format}/validateingest:write
GET/v1/ingest-eventsreceived:read
GET/v1/ingest-events/{id}received:read

ingest ist ein reiner Schreibbereich: Es gibt kein ingest:read, und GET /v1/stream wird ebenfalls mit ingest:write erreicht, sodass ein Produzentenschlüssel zum Senden nichts weiter braucht. Das Protokoll dessen, was ankam, ist der Bereich Aktivität, received:read, der nur lesend ist: Ein Berichtsschlüssel sieht, was gesendet wurde, ohne senden zu können, und nichts kann den Beleg für etwas bearbeiten, was es gesendet hat. Siehe Berechtigungen.

Zwei Helfer auf der Seite Eigene Feeds des Dashboards verkürzen die erste Stunde. Code abrufen schreibt einen funktionierenden Sender für einen Ihrer Streams, in Node.js, Python, PHP, C# oder curl, ausgehend vom Vorlagenbeispiel des Streams. Das Testwerkzeug sendet ein Ereignis als Sie, angemeldet und ohne Schlüssel, an einen Stream: Seine Route, POST /v1/streams/{id}/test, ist allein Sache einer Person, und ein System sendet mit seinem eigenen Schlüssel an POST /v1/stream, wie unten.

Die Streams finden, an die ein Schlüssel senden kann​

Der erste Aufruf, den ein Produzent machen sollte. Er braucht keine Berechtigung über die hinaus, die er schon hat, und antwortet mit der Route und jedem Stream, den der Schlüssel ansprechen darf.

curl http://localhost:4000/v1/stream \
-H "Authorization: Bearer rw_your_key_here"
{
"route": "http://localhost:4000/v1/stream",
"streams": [
{ "streamId": "st_30472168d941", "name": "Enterprise 2 Stream 1", "templateId": "tpl_dd7e6b264fb8", "enabled": true },
{ "streamId": "st_87cdd2aa7d2b", "name": "Enterprise 2 Stream 2", "templateId": "tpl_39bc5fecfa42", "enabled": true },
{ "streamId": "st_696a86f10c8a", "name": "Enterprise 2 Stream 3", "templateId": "tpl_71aae4d0157f", "enabled": true }
]
}

Der Umschlag​

POST /v1/stream nimmt fünf Felder, eines davon optional:

FeldErforderlichWas es ist
streamIdjast_ und zwölf Hexadezimalzeichen. Einer Ihrer eigenen Streams, wie unter Eigene Feeds aufgelistet.
eventIdjaEine ULID, in Crockford-Base32. Der Idempotenzschlüssel, je Workspace.
occurredAtjaEin ISO-8601-Zeitpunkt mit seiner Zeitzone (Z oder ein Offset wie +02:00): wann die Tatsache eintrat, nicht wann Sie sie gesendet haben.
localeneinDie Sprache des Freitexts in data.
datajaEin Objekt. Was hineingehört, ist, was die Vorlage des Streams annimmt.

Es gibt keine weiteren Felder. Ein templateId oder templateVersion im Text wird ignoriert: Der Stream trägt die Vorlage, und ein Kanal, der den Stream abonniert, wählt den Zuschnitt und den Build.

Was in data steht​

Bei jeder Vorlage im Katalog hat data zwei Hälften. clipData ist das, was im Clip gerendert wird, und seine Felder sind die der Vorlage: bei Große Zahl, der Vorlage in den Beispielen auf dieser Seite, ein Kicker, was die Zahl ist (label), die Zahl (value) mit Präfix und Einheit, ihre Veränderung, eine Kontextzeile, weitere Zahlen und eine Quelle. metaData ist das, was der Beitrag neben dem Clip sagt, und wird nie gerendert; es ist bei jeder Vorlage gleich: title, die Beschreibung in vier Längen (captionTiny, captionShort, captionMedium und captionLong, bis zu 200, 500, 1.500 und 4.000 Zeichen) und hashtags. Jeder Kanal veröffentlicht die Länge, die zu seiner Plattform passt, und ein Kanal auf Keine bestimmte Plattform erhält alle vier. Eine weggelassene Länge fällt auf die nächstkürzere zurück, die Sie geschrieben haben, sonst auf die nächstlängere. Ein Ereignis ohne metaData bekommt seinen Beitragstext aus clipData geschrieben. Ein Feld, das die Vorlage nicht hat, ist ein Fehler, der es nennt (ein 400 bei einem mitgelieferten Feed, unmapped bei einem Stream), sodass ein falsch geschriebener Schlüssel nie stillschweigend ungerendert bleibt.

Weitere Sprachen kommen in data.locales. locale nennt die Sprache, in der data geschrieben ist; neben dem Text kann data.locales je Sprachcode und in derselben Form wie der Text nur das enthalten, was in dieser Sprache anders ist, etwa "locales": { "de": { "clipData": { "label": "..." } } }. Ein deutscher Kanal rendert den Text mit dem darübergelegten de-Block, und ein Kanal in einer Sprache, für die das Ereignis keinen Block trägt, rendert den Text, wie er ist. Reelwire übersetzt selbst nichts.

Ein Bild ist eine Datei aus Ihrer Mediathek und sonst nichts. Ein Bildfeld nimmt { "url": "media://...", "alt": "..." }, wobei die URL media:// gefolgt von der ID oder dem Namen der Datei ist. Eine Webadresse wird abgelehnt und nennt das Feld: Bei einem Stream wird das Ereignis als unmapped aufgezeichnet, und der Probelauf antwortet valid: false; bei einem mitgelieferten Feed ist es ein 400. Laden Sie das Bild zuerst in die Mediathek hoch und verweisen Sie dann darauf. Ein Verweis auf eine Datei, die die Mediathek dieses Workspaces nicht enthält, wird als fehlendes Bild gerendert; der Probelauf des Streams schaut nicht in die Mediathek, POST /v1/templates/{templateId}/validate tut es und nennt jedes solche Feld.

Vor dem Senden validieren​

POST /v1/stream/validate nimmt denselben Text, führt dieselbe Zuordnung und Validierung aus und speichert nichts. Schreiben Sie Ihren Produzenten zuerst dagegen und behalten Sie es in Ihrer Testsuite.

Ein Ereignis, das jedem empfangenden Kanal zugeordnet wird, jeweils auf seiner exakten Vorlagenversion, und ein anderes, das abgelehnt wird, bevor etwas gerendert wird, weil ein Feld zu lang ist

curl http://localhost:4000/v1/stream/validate \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"streamId": "st_30472168d941",
"eventId": "01M2SQMKK3G1NVFXV31DCBVB92",
"occurredAt": "2026-09-18T07:55:00Z",
"locale": "en",
"data": {
"clipData": {
"kicker": "At the close",
"label": "Ten-year Bund yield, a three-week high",
"value": 2.41,
"unit": "%",
"change": { "value": 0.06, "unit": "pts", "label": "on the day" },
"source": "Deutsche Finanzagentur"
},
"metaData": {
"title": "Bund yields close at a three-week high",
"captionShort": "The ten-year Bund settled at 2.41 per cent, its highest in three weeks.",
"hashtags": ["bunds", "rates"]
}
}
}'
{
"requestId": "01M2SQMVE23G7M81DJG9NZMAP2",
"streamId": "st_30472168d941",
"templateId": "tpl_dd7e6b264fb8",
"templateVersion": "1.0.0",
"valid": true,
"document": {
"clipData": {
"kicker": "At the close",
"label": "Ten-year Bund yield, a three-week high",
"value": 2.41,
"unit": "%",
"change": { "value": 0.06, "unit": "pts", "label": "on the day" },
"source": "Deutsche Finanzagentur"
},
"metaData": {
"title": "Bund yields close at a three-week high",
"captionShort": "The ten-year Bund settled at 2.41 per cent, its highest in three weeks.",
"hashtags": ["bunds", "rates"]
}
},
"warnings": [],
"errors": [],
"wouldMatch": [
{ "channelId": "01M2985NX4V0WA1GV9MC63DEPJ", "channelName": "Channel 4 de", "subscriptionId": "01M2985P0SKB0JK587C9ZZKRKN", "outputs": 1 },
{ "channelId": "01M2985NXJRXVE5HKCCGKASP8P", "channelName": "Channel 10 en", "subscriptionId": "01M2985P2HZGF9SGQCW7YX6QRC", "outputs": 1 }
]
}

Zwei Dinge sind hier zu lesen. document ist das Ereignis nach dem Durchlauf der Feldzuordnung des Streams: genau das, was der Vorlage übergeben wird. wouldMatch ist jeder Kanal, der einen Clip erhielte; ein leeres Array bedeutet also, dass das Ereignis gültig ist und niemand empfängt.

Eine fehlgeschlagene Validierung antwortet trotzdem mit 200. valid ist das Feld, das sagt, ob es funktioniert hätte, nicht der Statuscode:

{
"requestId": "01M2SQNGZ0NR3GZ9WV2W75XMSZ",
"streamId": "st_30472168d941",
"templateId": "tpl_dd7e6b264fb8",
"templateVersion": "1.0.0",
"valid": false,
"document": { "clipData": { "label": "Ten-year Bund yield", "valeu": 2.41 } },
"warnings": [],
"errors": [
{ "path": "/clipData", "message": "missing value" },
{ "path": "/clipData", "message": "has a field this template does not take: valeu" }
],
"wouldMatch": [
{ "channelId": "01M2985NX4V0WA1GV9MC63DEPJ", "channelName": "Channel 4 de", "subscriptionId": "01M2985P0SKB0JK587C9ZZKRKN", "outputs": 1 },
{ "channelId": "01M2985NXJRXVE5HKCCGKASP8P", "channelName": "Channel 10 en", "subscriptionId": "01M2985P2HZGF9SGQCW7YX6QRC", "outputs": 1 }
]
}

wouldMatch wird auch für ein Dokument aufgelistet, das durchfällt, da es davon abhängt, wer empfängt, und nicht davon, was Sie gesendet haben. Jeder Fehler nennt seine Stelle als JSON Pointer und sagt in Worten, was falsch ist: das Feld, das fehlt, das Feld, das diese Vorlage nicht annimmt, oder, bei einer Auswahl, die Werte, die sie akzeptiert (höchstens zwölf werden aufgelistet).

Ein fehlerhafter Umschlag ist etwas anderes: Eine eventId, die keine ULID ist, oder eine fehlende streamId ist ein 400 mit einem Problem-Umschlag, weil es nichts gibt, wogegen validiert werden könnte. Eine streamId, die dieses Konto nicht hat, ist ein 404 unknown_stream, und ein pausierter Stream ein 409 stream_disabled, im Probelauf wie im echten Aufruf.

Senden​

Derselbe Text, an /v1/stream.

curl http://localhost:4000/v1/stream \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d @event.json
{
"ingestEventId": "01M2SQN507TDA0KNTJJABHBR9A",
"requestId": "01M2SQN4ZJNMXNV98HYXRST0WZ",
"status": "accepted",
"idempotent": false,
"streamId": "st_30472168d941",
"matched": [
{
"channelId": "01M2985NX4V0WA1GV9MC63DEPJ",
"channelName": "Channel 4 de",
"subscriptionId": "01M2985P0SKB0JK587C9ZZKRKN",
"templateId": "tpl_dd7e6b264fb8",
"templateVersion": "1.0.0",
"outputs": 1,
"postGroupId": "01M2SQN50JQFC00PZE93M9E33R"
},
{
"channelId": "01M2985NXJRXVE5HKCCGKASP8P",
"channelName": "Channel 10 en",
"subscriptionId": "01M2985P2HZGF9SGQCW7YX6QRC",
"templateId": "tpl_dd7e6b264fb8",
"templateVersion": "1.0.0",
"outputs": 1,
"postGroupId": "01M2SQN50TAP4BXAYDZRC9WMBC"
}
],
"warnings": [],
"normalized": { "clipData": { "kicker": "At the close", "label": "Ten-year Bund yield, a three-week high", "value": 2.41, "unit": "%", "change": { "value": 0.06, "unit": "pts", "label": "on the day" }, "source": "Deutsche Finanzagentur" }, "metaData": { "title": "Bund yields close at a three-week high", "captionShort": "The ten-year Bund settled at 2.41 per cent, its highest in three weeks.", "hashtags": ["bunds", "rates"] } }
}

202, nicht 201. Das Rendern dauert Dutzende von Sekunden, und der Produzent wird nicht darauf warten. Jede postGroupId ist ein Auftrag, den Sie unter Beiträge und Aufträge verfolgen können: Sie ist dort die id des Kanals, und ingestEventId ist die eigene id des Beitrags (sein postKey), da jeder Kanal, den ein Ereignis erreicht, ein Beitrag ist. Nach dem Rendern wird der Clip jedes Kanals so übergeben, wie der Kanal es sagt, oder wartet zuvor auf einen Prüfer, wo der Kanal einen verlangt.

Die Status​

statusStatuscodeWas passiert ist
accepted202Validiert, mindestens einem Kanal zugeordnet, Arbeit eingereiht.
no_match202Gültig, und kein Kanal nimmt es: Kein aktiviertes Abonnement nennt diesen Stream, oder jeder Kanal, der eines hat, ist pausiert, verwendet eine pausierte Marke oder hat eine Form, die die Vorlage nicht rendert. Gespeichert, nichts gerendert.
unmapped202Das Dokument passt nach der Feldzuordnung des Streams nicht zur Vorlage. Gespeichert, nichts gerendert. mappingErrors sagt warum, Feld für Feld.
duplicate200Diese eventId ist schon gelandet. Das ursprüngliche Ergebnis gilt.
stale202Nur mitgelieferte Feeds: gültig und älter, als der Feed annimmt (sein maxAgeSeconds im Katalog, bei den fertigen Feeds ein Tag). Gespeichert, nichts gerendert.

Nur accepted erzeugt Beiträge. Behandeln Sie no_match und stale als Erfolg, denn das sind sie: Ihr Ereignis war wohlgeformt und wurde gespeichert, es verdiente keinen Beitrag. Behandeln Sie unmapped als den Fehler, der es ist, und fragen Sie /v1/stream/validate, was es will.

Idempotenz: eventId ist der Schlüssel​

eventId ist eine ULID, die Sie einmal für eine Sache erzeugen, die geschehen ist. Sie ist der Idempotenzschlüssel, je Workspace, und macht einen Wiederholungsversuch sicher: Eine Anfrage mit Timeout kann erneut gesendet werden, ohne einen zweiten Beitrag zu erzeugen.

Dieselbe eventId mit demselben Text erneut zu senden ist eine Nulloperation, beantwortet mit 200 und status: "duplicate" und idempotent: true:

{
"ingestEventId": "01M2SQN507TDA0KNTJJABHBR9A",
"requestId": "01M2SQN52VVB9MDKGQ6AQ2TBRH",
"status": "duplicate",
"idempotent": true,
"streamId": "st_30472168d941",
"matched": [],
"warnings": []
}

ingestEventId ist dieselbe wie beim ersten Senden, sodass Sie die Antwort weiterhin der Arbeit zuordnen können. matched ist leer, weil nichts Neues zugeordnet wurde; schlagen Sie das ursprüngliche Ereignis nach, wenn Sie die Liste brauchen.

Dieselbe eventId mit einem anderen Text erneut zu senden wird abgelehnt, weil das immer ein Fehler des Produzenten und kein Wiederholungsversuch ist:

{
"error": {
"type": "https://reelwire.io/errors/idempotency_conflict",
"code": "idempotency_conflict",
"message": "eventId 01M2SQMKK3G1NVFXV31DCBVB92 was already used with a different body",
"requestId": "01M2SQNGWMW5F5P9CEEHDEFM1B",
"details": [
{ "path": "/eventId", "message": "Use a fresh eventId for a different payload, or resend the original body" }
]
}
}

Erzeugen Sie die ID dort, wo das Ereignis erzeugt wird, und tragen Sie sie durch Ihre Wiederholungsversuche. Eine ID, die innerhalb der Wiederholungsschleife erzeugt wird, macht jeden Wiederholungsversuch zu einem neuen Ereignis, und genau diesen Fehler soll das Feld verhindern.

Mitgelieferte Feeds: POST /v1/ingest/{source}/{format}​

Wo ein Feed einer ist, den Reelwire mitbringt, und Sie seine Daten für Ihr eigenes Konto einspielen, ist die Adresse der Source- und Format-Slug des Feeds im Pfad, und der Text hat keine streamId. Er nimmt eventId, occurredAt, origin (shipped, custom oder manual, standardmäßig shipped), eine optionale locale und data. Ein schedule (publishAt und timezone) wird nur mit origin: "manual" akzeptiert; mitgelieferte und eigene Daten gehen hinaus, wenn sie ankommen. Was data enthalten darf, ist die Schlüsselzuordnung der Vorlage, mit der der Feed gerendert wird: Fragen Sie GET /v1/formats/feed/{feedId} danach. Inhalt, der nicht passt, ist ein 400, der das Feld unter /data nennt, im Probelauf wie im echten Aufruf: Anders als der Probelauf des Streams antwortet dieser nicht mit valid: false. Ein Source- oder Format-Slug, den es nicht gibt, ist ein 404 (unknown_source, unknown_format, das die Formate der Source auflistet).

curl http://localhost:4000/v1/ingest/crypto-spot-and-dominance/crypto-board/validate \
-H "Authorization: Bearer rw_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"eventId": "01M2SQMKK3G1NVFXV31DCBVB96",
"occurredAt": "2026-09-18T08:00:00Z",
"data": {
"clipData": {
"title": "The eight largest coins and how they moved in 24 hours",
"items": [
{ "label": "Bitcoin", "value": 85788, "prefix": "$", "change": 0.42 },
{ "label": "Ethereum", "value": 2700.79, "prefix": "$", "change": -0.23 }
]
},
"metaData": { "title": "Crypto board" }
}
}'
{
"requestId": "01M2SQZHQ6K0Y55BA1MK2JG53B",
"valid": true,
"normalized": {
"clipData": {
"title": "The eight largest coins and how they moved in 24 hours",
"items": [
{ "label": "Bitcoin", "value": 85788, "prefix": "$", "change": 0.42 },
{ "label": "Ethereum", "value": 2700.79, "prefix": "$", "change": -0.23 }
]
},
"metaData": { "title": "Crypto board" }
},
"wouldMatch": [
{ "channelId": "01M1VFRWE7EWSY5D7QDQ0KNK1S", "channelName": "Channel 1 en", "subscriptionId": "01M29DSF6S2JYYXQQM4XHJMGK7", "templateId": "tpl_06dc2554e5ac", "templateVersion": "1.0.0", "outputs": 1 },
{ "channelId": "01M2985NX4V0WA1GV9MC63DEPJ", "channelName": "Channel 4 de", "subscriptionId": "01M29DSF7F2JT2N5FXSF126CSF", "templateId": "tpl_06dc2554e5ac", "templateVersion": "1.0.0", "outputs": 1 }
],
"warnings": [],
"stale": false
}

Beachten Sie, dass die Form nicht ganz die des Streams ist: Diese Route antwortet mit normalized statt document und trägt ein Flag stale. wouldMatch ist leer, mit einer Warnung, wenn der Feed für diesen Workspace unter Fertige Feeds ausgeschaltet ist, und normalized entfällt, solange kein Kanal von Ihnen den Feed empfängt. POST /v1/ingest/{source}/{format} selbst antwortet mit 202 und ingestEventId, status, idempotent, matched und normalized, was auch immer der Status ist: Anders als die Stream-Route ist hier auch ein duplicate ein 202, und sein matched listet die Kanäle, die das erste Senden erreicht hat.

Angeben, für welches Konto Sie senden​

Ein Produzent, der mehrere Kunden bedient, kann mit dem Header x-reelwire-account behaupten, für welchen diese Anfrage ist. Der Bearer-Schlüssel entscheidet weiterhin, wo das Ereignis landet; der Header sagt nur, was Sie glauben, und ein Widerspruch wird abgelehnt, statt stillschweigend unter dem abgelegt zu werden, dem der Schlüssel gehört.

curl http://localhost:4000/v1/ingest/crypto-spot-and-dominance/crypto-board \
-H "Authorization: Bearer rw_your_key_here" \
-H "x-reelwire-account: 01M1VFRWE3A35H892VAAEKKDA7" \
-H "Content-Type: application/json" \
-d @event.json
{
"error": {
"type": "https://reelwire.io/errors/forbidden",
"code": "forbidden",
"message": "This credential does not belong to the account this request declares",
"requestId": "01M2SR1WZW7Q0N6A1E039XG2YT",
"details": []
}
}

Ohne den Header schreibt der Griff zum falschen Schlüssel die Daten eines Kunden in den Workspace eines anderen und liefert 202, und der Fehler fällt erst später im Dashboard eines Dritten auf. Der Header kostet nichts und schließt das.

Ein Ereignis zurücklesen​

GET /v1/ingest-events listet auf, was ankam, die neuesten zuerst, paginiert wie jedes Protokoll (siehe Listen und Paginierung).

curl "http://localhost:4000/v1/ingest-events?perPage=1" \
-H "Authorization: Bearer rw_your_key_here"
{
"events": [
{
"id": "01M2SQN507TDA0KNTJJABHBR9A",
"origin": "custom",
"details": "Enterprise 2 Stream 1",
"postTitle": null,
"eventId": "01M2SQMKK3G1NVFXV31DCBVB92",
"status": "ACCEPTED",
"occurredAt": "2026-09-18T07:55:00.000Z",
"receivedAt": "2026-09-18T07:45:50.088Z"
}
],
"total": 1,
"all": 1,
"page": 1,
"perPage": 1,
"facets": { "status": ["ACCEPTED"], "origin": ["custom"] }
}

Es filtert nach status (ACCEPTED, NO_MATCH, UNMAPPED oder STALE) und origin (shipped, custom oder manual) und durchsucht die Namen, die die Zeile ausgibt: den Feed, den Stream oder die Beitragsliste.

GET /v1/ingest-events/{id} liefert ein Ereignis vollständig, mit seinem normalized-Dokument und jeder Beitragsgruppe, die es erzeugt hat.

Was Sie über POST /v1/broadcast wissen sollten​

/v1/broadcast, /v1/broadcast/validate, /v1/broadcast/{id}, /v1/broadcast/pictures, /v1/broadcast/schedules, /v1/broadcast/log und /v1/broadcasts erscheinen in der Routenliste, und sie gehören nicht Ihnen: Sie sind unter „Für API-Schlüssel nicht verfügbar“ aufgelistet. Die ersten beiden sind der Weg, auf dem der eigene Feed-Server von Reelwire die fertigen Feeds liefert, ein Ereignis an jeden Workspace mit einem empfangenden Kanal auf einmal, und sie brauchen eine genau dafür ausgestellte Zugangsberechtigung; ein Workspace-Schlüssel wird abgelehnt:

{
"error": {
"type": "https://reelwire.io/errors/forbidden",
"code": "forbidden",
"message": "This credential lacks the ingest:shipped scope",
"requestId": "01M2SR5FVDBNWWB37MYY9DVABF",
"details": []
}
}

Die anderen beiden sind die eigene Aufzeichnung der Plattform darüber, was ein Broadcast erreicht hat. Bauen Sie nicht darauf auf. Ihr Konto empfängt Broadcasts, indem ein Kanal den Feed abonniert; siehe Kanäle.

Häufige Fehler​

Die eventId innerhalb der Wiederholungsschleife erzeugen. Dann ist jeder Wiederholungsversuch ein neues Ereignis, und ein Netzaussetzer übergibt dieselbe Geschichte dreimal. Erzeugen Sie sie einmal, dort wo die Tatsache entsteht.

occurredAt als „jetzt“ senden. Es ist der Zeitpunkt, zu dem die Tatsache eintrat. Ein Feed mit einem Höchstalter entscheidet damit, ob das Ereignis noch einen Beitrag wert ist, und die Uhrzeit stattdessen zu senden lässt eine zwei Stunden alte Wiederholung frisch aussehen.

Den Text von Hand bauen. Fragen Sie /v1/formats/template/{templateId}, was die Vorlage annimmt, und erzeugen Sie einen Client aus dem jsonSchema, das es liefert. Siehe Vorlagen und Formate.

no_match als Fehlschlag behandeln. Es bedeutet, dass noch kein aktiver Kanal diesen Stream nimmt. Prüfen Sie die Abonnements der Kanäle und ob diese Kanäle pausiert sind, nicht Ihren Produzenten.

Den Statuscode von /v1/stream/validate statt valid lesen. Ein Dokument, das nicht zur Vorlage passt, antwortet dort trotzdem mit 200. (Der Probelauf eines mitgelieferten Feeds ist die Ausnahme: Er antwortet mit 400.)

Eine Stream-ID eines anderen Kontos in den Text schreiben. Sie antwortet mit 404 unknown_stream, genau wie eine ID, die nirgends existiert.