Blastack

Entwickler

Die API und die drei Werkzeuge, die daran andocken

Siebzehn Operationen auf zehn Pfaden, fünf ausgehende Ereignisse und eine öffentliche OpenAPI-3.1-Spezifikation, die Make und n8n von allein importieren. Hier steht alles: jeder Parameter einzeln, Beispiele, die so wie sie dastehen funktionieren, und die Liste dessen, was die API nicht kann.

Fügen Sie die erste Adresse in den Importer von n8n oder Make ein, und die Knoten entstehen von selbst. Zapier liest kein OpenAPI: genau deshalb stehen seine Schritte weiter unten getrennt.

Auf einen Blick

Was der erste Aufruf braucht

Acht Angaben. Damit lässt sich die Anfrage schreiben, ohne weiterzulesen.

WasWertHinweis
Wurzel der APIhttps://app.blastack.com/api/v1Sie liegt in der Anwendung, nicht auf dieser Website. Eine einzige Adresse, und sie ändert sich nicht.
Spezifikationhttps://app.blastack.com/api/openapi.jsonÖffentlich und ohne Schlüssel, damit ein Importer sie lesen kann, bevor es überhaupt Zugangsdaten gibt.
AuthentifizierungAuthorization: Bearer blsk_<prefix>_<secret>Im Kopfzeilenfeld, nie in der Adresse. Adressen landen im Protokoll des Servers, in dem des vorgelagerten Proxys und in der Historie dessen, der sie von Hand ausprobiert hat.
Formatapplication/json; charset=utf-8JSON hin wie zurück. Kein XML und keine Formulardaten.
Grenze120 req/min · RateLimit-RemainingPro Schlüssel und Minute. Jede Antwort sagt, wie viele übrig sind und wann der Zähler neu beginnt.
Seitenpage=1 · per_page=50 · ≤ 200Die erste Seite ist die 1, nicht die 0. Mehr als zweihundert wird gekappt statt abgelehnt.
Fehler{ error: { status, code, message } }Immer dasselbe Objekt, mit einem stabilen Code, auf den man eine Bedingung schreiben soll.
Testumgebung—Gibt es nicht. Gearbeitet wird gegen die Produktion, weshalb es sich lohnt, mit einem Nur-Lese-Schlüssel anzufangen.
curl https://app.blastack.com/api/v1/people?per_page=1 \
  -H "Authorization: Bearer blsk_a1b2c3d4e5f6_YOUR_SECRET"

Was es gibt

Drei Flächen, und keine halb fertig

Alle drei laufen. Was fehlt, steht weiter unten in einem eigenen Abschnitt und wird beim Namen genannt.

SCIM-2.0-Provisionierung

Damit Ihr HR-System Personen anlegt, die Abteilung wechselt und deaktiviert, ohne dass es jemand von Hand abtippt. Das ist die Hälfte, auf die es der IT wirklich ankommt: an dem Tag, an dem Sie sich von jemandem trennen, deaktiviert sich das Konto von selbst.

Filter über userName und externalId, Seiten und teilweise Änderung. Abteilung und Arbeitsadresse werden gelesen, wer hier hereinkommt, hat Abteilung und Standort also von Anfang an gesetzt. Der Austritt deaktiviert, er löscht nicht.

Single Sign-on (OpenID Connect)

Mit dem Firmenkonto aus Entra ID, Google Workspace oder Okta hereinkommen. Das steht neben dem Beitrittscode, über den der Teil der Belegschaft ohne Firmen-E-Mail hereinkommt.

Wird eingerichtet, indem man die Discovery-Adresse des Anbieters einfügt, und vor dem Speichern gegen ihn geprüft. E-Mail-Domänen werden per DNS bestätigt. SAML und LDAP gibt es nicht.

Blastack-API

Aus dem Programm heraus veröffentlichen, das ohnehin weiß, dass Linie 3 am Donnerstag stillsteht, wer aus dem HR-System ausscheidet deaktivieren, und von uns angerufen werden, wenn etwas passiert, statt alle fünf Minuten fragen zu müssen.

JSON über HTTPS, ein API-Schlüssel im Kopfzeilenfeld, Bereiche pro Schlüssel, Fehler mit stabilem Code und signierte ausgehende Ereignisse. Das dokumentiert der Rest dieser Seite.

Automatisierung

Zapier, Make und n8n, Schritt für Schritt

Die drei baut man nicht gleich auf, und das zu sagen spart den Nachmittag, an dem man es sonst herausfindet. Make und n8n lesen die Spezifikation und richten sich fast von selbst ein; Zapier liest sie nicht, dort wird jeder Aufruf von Hand geschrieben. Alle drei funktionieren; die Arbeit ist nicht dieselbe.

WerkzeugLiest es die Spezifikation?Empfohlener Auslöser
n8nJa, vollständigKnoten «Webhook» + POST /webhooks
MakeJa, im Editor für eigene Apps«Custom webhook» + POST /webhooks
ZapierNein«Catch Hook» + POST /webhooks

n8n

Der kürzeste der drei Wege. Man legt eine Header-Zugangsdatei an, fügt die Adresse der Spezifikation in den Importer ein, und übrig bleibt ein Knoten pro Operation mit bereits gesetzten Parametern.

Schritte

  1. 01Credentials → neu → «Header Auth». Der Name der Kopfzeile ist Authorization, der Wert ist Bearer, ein Leerzeichen und Ihr Schlüssel.
  2. 02Knoten «HTTP Request», Authentifizierung «Generic Credential Type» → «Header Auth» und dann die eben angelegte Zugangsdatei. Methode und Pfad stehen in der Endpunkttabelle.
  3. 03Damit die Parameter nicht von Hand getippt werden müssen, geben Sie dem Importer die Adresse der Spezifikation: sie beschreibt jeden Endpunkt mit seinen zulässigen Werten, das Erzeugte kommt also mit Auswahllisten statt mit freien Textfeldern.
  4. 04Zum Auslösen: Knoten «Webhook», seine Produktionsadresse kopieren und mit POST /webhooks samt der gewünschten Ereignisse registrieren. Alle fünf Minuten nachfragen erübrigt sich.

Zu beachten

Der Webhook-Knoten antwortet mit 200, bevor der restliche Ablauf läuft, und genau das braucht es hier: nach zehn Sekunden geben wir auf, und das zählt als Fehlschlag.

Make

Das allgemeine HTTP-Modul reicht für alles, und wer viele Szenarien bauen will, kann die Spezifikation in den Editor für eigene Apps laden und bekommt ein Modul pro Operation.

Schritte

  1. 01Modul «HTTP» → «Make an API Key Auth request». In der Verbindung heißt der Schlüssel Authorization, der Wert ist Bearer plus Ihr Schlüssel, und er gehört in die Kopfzeile.
  2. 02Methode, Pfad und Rumpf stehen in der Endpunkttabelle und in den Beispielen weiter unten. Der Inhaltstyp ist application/json.
  3. 03Wer mehrere Szenarien baut: der Editor für eigene Apps nimmt die Spezifikation an und erzeugt ein Modul pro Operation. Weniger von Hand geschriebene Szenarien und weniger Tippfehler in Filternamen.
  4. 04Zum Auslösen: Modul «Webhooks» → «Custom webhook», Adresse kopieren und mit POST /webhooks registrieren. Make antwortet sofort und verarbeitet danach, was hier die richtige Reihenfolge ist.

Zu beachten

Make rechnet pro Operation ab: ein Szenario, das alle fünf Minuten nachfragt, verbrennt achttausend Operationen im Monat, um fast nichts zu finden. Mit dem Webhook ist es eine pro Ereignis.

Zapier

Zapier importiert kein OpenAPI. Gebaut wird mit den allgemeinen Webhook-Schritten oder als private Integration auf ihrer Entwicklerplattform, wo jeder Endpunkt von Hand deklariert wird.

Schritte

  1. 01Auslöser: «Webhooks by Zapier» → «Catch Hook». Die genannte Adresse kopieren und mit POST /webhooks samt der gewünschten Ereignisse registrieren.
  2. 02Aktion: «Webhooks by Zapier» → «Custom Request». Methode und Adresse aus der Tabelle, Kopfzeilen Authorization mit Bearer plus Ihrem Schlüssel und Content-Type mit application/json, und das JSON im Datenfeld.
  3. 03Fügen Sie einen Schritt «Code by Zapier» ein, der zuerst die Signatur prüft. Zapier prüft sie nicht für Sie, und die Adresse des Auslösers ist öffentlich: ohne diesen Schritt kann sich jeder, der sie findet, einen Linienstillstand ausdenken.
  4. 04Wer statt allgemeiner Anfragen benannte Knoten will, muss eine private Integration bauen und dort jeden Endpunkt mit seinen Feldern deklarieren. Das ist mehr Arbeit, und die Spezifikation nimmt davon nichts ab.

Zu beachten

Ihre abfragenden Auslöser verbrauchen bei jedem Durchgang eine Aufgabe, ob sie etwas finden oder nicht. Der «Catch Hook» verbraucht nur, wenn wirklich etwas passiert ist.

Schlüssel

Ein Schlüssel pro Integration, mit genau dem Nötigen

Heute geben wir sie von Hand aus und sagen Ihnen, welche Bereiche sie tragen. Es gibt keinen Selbstbedienungsbildschirm, und das steht weiter unten bei dem, was fehlt. Jeder Schlüssel hängt an genau einer Firma, und keine Route liest eine Firmenkennung aus der Anfrage: es gibt keine Stelle, an der man sich vertun könnte.

  1. 01

    Fragen Sie uns nach dem Schlüssel

    Sagen Sie uns, wofür er ist und was er können muss, und wir geben ihn mit genau diesen Bereichen aus und keinem weiteren. Er wird einmal gezeigt: wir behalten nur eine Prüfsumme, ein verlorener Schlüssel wird also gesperrt und neu ausgegeben.

  2. 02

    Schicken Sie ihn bei jeder Anfrage mit

    In der Autorisierungskopfzeile, nie in der Adresse. Adressen landen im Protokoll des Servers, in dem des vorgelagerten Proxys und in der Historie dessen, der sie von Hand ausprobiert hat.

  3. 03

    Legen Sie ihn dorthin, wo die anderen liegen

    In Ihre Geheimnisverwaltung, nicht ins Repository. Er beginnt mit einem erkennbaren Präfix, gerade damit Secret-Scanner ihn erwischen, falls er entwischt.

Die API gehört zum Modul Unternehmensidentität, demselben, das auch Single Sign-on und die Provisionierung öffnet. Hat die Firma es nicht gebucht, sagt die Antwort das mit diesen Worten und nicht mit einem allgemeinen Fehler.

Die Bereiche, einer nach dem anderen

BereichWas er öffnet
people:readDie Belegschaft lesen sowie die Abteilungen und Standorte, an die sich ein Aushang richten kann. Mehr braucht ein Dashboard nicht.
people:writePersonen anlegen, ändern und deaktivieren. Deaktivieren schließt ihre Sitzungen, das kommt also nicht als Zugabe zum Lesen.
announcements:readLesen, was veröffentlicht wurde, und wer eine Pflichtlektüre bestätigt hat. Getrennt vom Personenbereich: eine Liste von Namen und Positionen ist das Verzeichnis, der Text der Aushänge ist es nicht.
announcements:writeAm Schwarzen Brett veröffentlichen. Die Freigabe-Warteschlange der Firma wird eingehalten, ein Schlüssel überspringt also niemandes Freigabeweg.
metrics:readDie zusammengefassten Kennzahlen. Hier wird niemand namentlich genannt.
webhooks:readDie registrierten Adressen und das Zustellprotokoll ansehen. Das beantwortet «warum kommt nichts an», ohne ein Ticket zu öffnen.
webhooks:writeAdressen für ausgehende Ereignisse registrieren, ändern und löschen. Der heikelste der Liste: er entscheidet, an welchen Server im Internet wir den Inhalt Ihrer Aushänge schicken.

Endpunkte

Siebzehn Operationen auf zehn Pfaden

Nach Familien gruppiert. Die Bereichsspalte ist die, auf die es beim Anfordern des Schlüssels ankommt: fehlt er, sagt die Antwort, welcher nötig war und welche Ihrer trägt.

MethodePfadBereichWas er tut
GET/peoplepeople:readDie Belegschaft, mit Abteilung, Standort und der Kennung, die jede Person in Ihrem HR-System trägt. Siebzehn Parameter, darunter der Filter auf das Datum der letzten Änderung — der, mit dem man alle Viertelstunde abgleichen kann, ohne alles neu zu holen.
GET/people/{id}people:readEine einzelne Person, gesucht über unsere Kennung oder über Ihre. Damit lässt sich ein Datensatz auffrischen, ohne die ganze Liste durchzugehen.
POST/peoplepeople:writeLegt jemanden an. Für den Fall, dass Ihr HR-System kein SCIM spricht; spricht es SCIM, nehmen Sie besser SCIM, das auch Austritte erledigt. Abteilung und Standort werden über den Namen angegeben und angelegt, falls es sie noch nicht gibt.
PATCH/people/{id}people:writeÄndert nur die Felder, die Sie schicken. Ein weggelassenes Feld wird nicht angefasst: ein Abgleich, der nur die Position kennt, kann niemandem den Standort löschen.
DELETE/people/{id}people:writeDeaktiviert; löscht nie. Die Sitzungen werden sofort geschlossen, wer also am Freitag geht, ist am Freitag draußen. Was die Person veröffentlicht hat, bleibt.
GET/audiencespeople:readDie Abteilungen und Standorte, die es gibt, mit der Zahl der Personen in jedem. Von hier kommen die Namen, an die sich ein Aushang richten kann, und der Filter auf leere Gruppen ist der, der eine kaputte Provisionierungszuordnung findet.
GET/announcementsannouncements:readAlles Veröffentlichte, mit den Lesungen und Bestätigungen jedes Stücks. Entwürfe und Abgelehntes sind enthalten, damit ein Dashboard den ganzen Trichter zeichnen kann.
GET/announcements/{id}announcements:readEin einzelner Aushang. Der nächste Schritt nach der Kennung, die eine Veröffentlichung zurückgibt oder ein ausgehendes Ereignis mitbringt.
POST/announcementsannouncements:writeVeröffentlicht am Schwarzen Brett. Sie müssen sagen, wer unterschreibt, einen Standardwert gibt es nicht. Darf diese Person nicht ohne Freigabe veröffentlichen, landet der Aushang in der Warteschlange und die Antwort sagt es.
GET/announcements/{id}/acknowledgementsannouncements:readWer eine Pflichtlektüre bestätigt hat und wer nicht, mit Namen und Uhrzeit. Die einzige namentliche Liste der ganzen API, und sie ist es, weil genau das der Sinn der Pflichtlektüre ist: eine freiwillige, unterschriebene und datierte Handlung, die man einer Prüfung zeigen kann.
GET/metricsmetrics:readDie heutige Belegschaft, die Zugänge, die Veröffentlichungen und die Reichweite pro Aushang und pro Abteilung. Dieselben Zahlen wie der Auswertungsbildschirm, vom selben Code berechnet.
GET/webhookswebhooks:readIhre registrierten Adressen, jede mit ihrem Zustand: aufeinanderfolgende Fehlschläge, was Ihr Server zuletzt geantwortet hat und, falls wir sie pausiert haben, warum.
POST/webhookswebhooks:writeRegistriert eine Adresse und die Ereignisse, die sie will. Die Antwort bringt das Signaturgeheimnis mit, und das ist das einzige Mal, dass es zu sehen ist.
GET/webhooks/{id}webhooks:readEine einzelne Adresse, mit ihrem Zustand.
PATCH/webhooks/{id}webhooks:writeÄndert, was Sie schicken. Die Adresse wieder auf aktiv zu setzen hebt auch eine Pause auf, die wir nach wiederholten Fehlschlägen verhängt haben, und setzt den Zähler zurück.
DELETE/webhooks/{id}webhooks:writeLöscht sie samt Verlauf. Wer eine Weile nichts empfangen will, ohne den Verlauf zu verlieren, schaltet sie besser ab.
GET/webhooks/{id}/deliverieswebhooks:readAlles, was wir Ihnen zu schicken versucht haben: Versuche, was Sie geantwortet haben und wann der nächste ansteht. Die Kennung ist dieselbe, die in der Kopfzeile mitreiste, sie lässt sich also mit Ihren eigenen Protokollen abgleichen.

Parameter

Alle, Endpunkt für Endpunkt

Keine Liste hier ist gekürzt: es sind dieselben, die der Server prüft. Ein Parameter, der hier fehlt, existiert nicht, und ihn zu schreiben liefert einen Fehler, der die von diesem Endpunkt akzeptierten aufzählt, statt ihn stillschweigend zu verwerfen.

Die rechte Spalte ist mit Absicht auf Englisch. Sie kommt aus dem Katalog, aus dem auch die Spezifikation erzeugt wird, ist also Wort für Wort das, was n8n und Make in ihren Knoten anzeigen. Sie hier zu übersetzen hieße zwei Fassungen zu haben, die eines Tages Verschiedenes sagen.

GET /people

people:read

Die Belegschaft, mit Abteilung, Standort und der Kennung, die jede Person in Ihrem HR-System trägt. Siebzehn Parameter, darunter der Filter auf das Datum der letzten Änderung — der, mit dem man alle Viertelstunde abgleichen kann, ohne alles neu zu holen.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
pageGanzzahlmin. 112Page to return. The first page is 1, not 0.
per_pageGanzzahlmin. 1 · max. 200 · außerhalb des Bereichs wird gekappt statt abgelehnt50100How many items per page. Anything above 200 is clamped to 200 rather than rejected: asking for more is a reasonable thing to want.
sortTextcreated_at · updated_at · name · emailcreated_atField to sort by. Defaults to created_at.
orderTextasc · descascSort direction.
fieldsText · mehrere, durch Kommas getrenntexternal_id · email · name · job_title · department · center · role · status · language · created_at · updated_atexternal_id,department,statusComma-separated list of fields to return. `id` is always included. Use it to avoid pulling personal data you do not need.
statusText · mehrere, durch Kommas getrenntactive · invited · disabledactiveOnly people in these states. Several may be given.
roleText · mehrere, durch Kommas getrenntowner · admin · gestor_personas · responsable_local · informatico · editor · revisor · analista · employeeOnly people with these roles. Several may be given.
departmentText · mehrere, durch Kommas getrenntMaintenance,QualityDepartment name, or several separated by commas. Case-insensitive: your directory writing MANTENIMIENTO is not an error.
centerText · mehrere, durch Kommas getrenntSite name, or several separated by commas. Case-insensitive.
no_departmentWahrheitswertOnly people with no department. These are the ones who never see a targeted announcement, so this is the filter that finds a broken provisioning mapping.
languageText · mehrere, durch Kommas getrenntes · ca · en · pt · fr · it · de · sv · nl · pl · ro · csOnly people who picked this reading language.
emailTextExact email address, case-insensitive.
external_idTextExact external_id, as sent by your HR system over SCIM.
qTextgarciaFree text over name, email and job title. Case-insensitive, matches anywhere in the value.
updated_sinceDatum ISO 86012026-08-01T00:00:00ZOnly people changed at or after this instant. This is the one that lets you sync every fifteen minutes without pulling two thousand rows every time.
created_sinceDatum ISO 8601Only people added at or after this instant.
created_untilDatum ISO 8601Only people added before this instant.

GET /people/{id}

people:read

Eine einzelne Person, gesucht über unsere Kennung oder über Ihre. Damit lässt sich ein Datensatz auffrischen, ohne die ganze Liste durchzugehen.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTexta3f1…Blastack id (a uuid) or the person's external_id from your HR system. A Blastack id is always a uuid and yours almost never is, so they cannot be confused; if one ever were, ours wins.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
fieldsText · mehrere, durch Kommas getrenntexternal_id · email · name · job_title · department · center · role · status · language · created_at · updated_atexternal_id,department,statusComma-separated list of fields to return. `id` is always included. Use it to avoid pulling personal data you do not need.

POST /people

people:write

Legt jemanden an. Für den Fall, dass Ihr HR-System kein SCIM spricht; spricht es SCIM, nehmen Sie besser SCIM, das auch Austritte erledigt. Abteilung und Standort werden über den Namen angegeben und angelegt, falls es sie noch nicht gibt.

Im Rumpf

ParameterTypZulässige WerteStandardBeispielWas er tut
namePflichtTextmax. Länge 120Ana GarcíaFull name, as it should appear on the wall.
emailTextmax. Länge 200Work email. Optional: most of the workforce this product is for has none, and they get in with an invite code instead. Unique within the company.
external_idTextmax. Länge 200EMP-0042The id this person has in your system. Store it and you can cross both lists later without matching names.
job_titleTextmax. Länge 120Job title.
departmentTextmax. Länge 80Department name. Created if it does not exist. Without one, this person only ever sees company-wide announcements.
centerTextmax. Länge 80Site name. Created if it does not exist.
roleTextadmin · gestor_personas · responsable_local · informatico · editor · revisor · analista · employeeemployeeWhat they can do. `owner` cannot be given from the API: a key pasted in a cron job must not be able to mint an account that can cancel the subscription.
statusTextactive · invited · disabledactive`active` can sign in; `invited` is created but not counted as signed up yet; `disabled` is created already deactivated, which is what a backfill of former staff needs.
languageTextes · ca · en · pt · fr · it · de · sv · nl · pl · ro · csReading language. Leave it out and they read in the company's, which is what you want unless you actually know.

PATCH /people/{id}

people:write

Ändert nur die Felder, die Sie schicken. Ein weggelassenes Feld wird nicht angefasst: ein Abgleich, der nur die Position kennt, kann niemandem den Standort löschen.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTexta3f1…Blastack id (a uuid) or the person's external_id from your HR system. A Blastack id is always a uuid and yours almost never is, so they cannot be confused; if one ever were, ours wins.

Im Rumpf

ParameterTypZulässige WerteStandardBeispielWas er tut
nameTextmax. Länge 120Full name.
emailTextmax. Länge 200Work email.
external_idTextmax. Länge 200The id this person has in your system.
job_titleTextmax. Länge 120Job title.
departmentTextmax. Länge 80Department name. Created if it does not exist.
centerTextmax. Länge 80Site name. Created if it does not exist.
roleTextadmin · gestor_personas · responsable_local · informatico · editor · revisor · analista · employeeWhat they can do. `owner` cannot be given from the API.
statusTextactive · invited · disabledTheir state. `disabled` also closes their sessions.
languageTextes · ca · en · pt · fr · it · de · sv · nl · pl · ro · csReading language.

DELETE /people/{id}

people:write

Deaktiviert; löscht nie. Die Sitzungen werden sofort geschlossen, wer also am Freitag geht, ist am Freitag draußen. Was die Person veröffentlicht hat, bleibt.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTexta3f1…Blastack id (a uuid) or the person's external_id from your HR system. A Blastack id is always a uuid and yours almost never is, so they cannot be confused; if one ever were, ours wins.

GET /audiences

people:read

Die Abteilungen und Standorte, die es gibt, mit der Zahl der Personen in jedem. Von hier kommen die Namen, an die sich ein Aushang richten kann, und der Filter auf leere Gruppen ist der, der eine kaputte Provisionierungszuordnung findet.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
typeTextall · departments · centersallReturn only departments, only sites, or both.
qTextFree text over the name. Case-insensitive.
with_peopleWahrheitswertOnly groups that have at least one active person. A department with nobody in it is almost always an old name left behind, and it is the usual cause of an announcement that reaches no one.
sortTextname · peoplenameField to sort by. Defaults to name.
orderTextasc · descascSort direction.

GET /announcements

announcements:read

Alles Veröffentlichte, mit den Lesungen und Bestätigungen jedes Stücks. Entwürfe und Abgelehntes sind enthalten, damit ein Dashboard den ganzen Trichter zeichnen kann.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
pageGanzzahlmin. 112Page to return. The first page is 1, not 0.
per_pageGanzzahlmin. 1 · max. 200 · außerhalb des Bereichs wird gekappt statt abgelehnt50100How many items per page. Anything above 200 is clamped to 200 rather than rejected: asking for more is a reasonable thing to want.
sortTextpublished_at · created_at · updated_at · titlepublished_atField to sort by. Defaults to published_at.
orderTextasc · descascSort direction.
fieldsText · mehrere, durch Kommas getrennttitle · body · status · kind · language · audience · community · section · author · notify · comments_enabled · pinned · acknowledgements · reads · published_at · created_at · updated_at · urlexternal_id,department,statusComma-separated list of fields to return. `id` is always included. Use it to avoid pulling personal data you do not need.
statusText · mehrere, durch Kommas getrenntdraft · pending_review · published · rejected · scheduled · archivedpublished,scheduledOnly these states. Several may be given. `scheduled` means it is written and waiting for its hour.
authorTextWho signs it: our id, their email or their external_id. Any of the three.
audience_typeTextall · departments · centersOnly announcements aimed this way.
departmentText · mehrere, durch Kommas getrenntOnly announcements aimed at these departments, by name. Several may be given.
centerText · mehrere, durch Kommas getrenntOnly announcements aimed at these sites, by name.
communityTextOnly announcements in this community, by id or by name.
requires_acknowledgementWahrheitswertOnly required reading, or only the rest. This is the filter a compliance report is built on.
pinnedWahrheitswertOnly pinned announcements, or only the rest.
qTextFree text over title and body. Case-insensitive.
published_sinceDatum ISO 8601Published at or after this instant.
published_untilDatum ISO 8601Published before this instant.
created_sinceDatum ISO 8601Written at or after this instant.
updated_sinceDatum ISO 8601Changed at or after this instant.

GET /announcements/{id}

announcements:read

Ein einzelner Aushang. Der nächste Schritt nach der Kennung, die eine Veröffentlichung zurückgibt oder ein ausgehendes Ereignis mitbringt.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTextThe announcement id.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
fieldsText · mehrere, durch Kommas getrennttitle · body · status · kind · language · audience · community · section · author · notify · comments_enabled · pinned · acknowledgements · reads · published_at · created_at · updated_at · urlexternal_id,department,statusComma-separated list of fields to return. `id` is always included. Use it to avoid pulling personal data you do not need.

POST /announcements

announcements:write

Veröffentlicht am Schwarzen Brett. Sie müssen sagen, wer unterschreibt, einen Standardwert gibt es nicht. Darf diese Person nicht ohne Freigabe veröffentlichen, landet der Aushang in der Warteschlange und die Antwort sagt es.

Im Rumpf

ParameterTypZulässige WerteStandardBeispielWas er tut
bodyPflichtTextmax. Länge 8000The text. Plain text; line breaks are kept.
authorPflichtTextEMP-0042Who signs it: our id, their email or their external_id. Must be an active person in this company.
titleTextmax. Länge 160Headline.
audienceObjektWho it goes to. Leave it out and it goes to everyone. Names work as well as ids, case-insensitively, because your ERP has 'Maintenance' and not a uuid of ours. Nothing is created here: an unknown name is a typo in a script, and the reply tells you which one it was.
audience.typeTextall · departments · centersallAim at everyone, at departments or at sites.
audience.idsListe["Maintenance","Quality"]Department or site names, or their ids. Required unless type is `all`.
communityTextWhich community it belongs to, by id or by name. Leave it out and it goes on the main wall, which everybody sees. The author has to belong to the community, or be posting to the default one: an API key is not a way into a community its signer is not in.
sectionTextWhich section it belongs to, by id or by name. It must belong to the same community.
publish_atDatum ISO 86012026-09-01T06:00:00ZPublish later, at this instant. It must be in the future. The reply comes back with `status: scheduled` and the wall shows it when the hour arrives. Leave it out to publish now. Note this means two clocks are involved — yours and ours — so if your system already schedules, prefer calling us at the right moment.
requires_acknowledgementWahrheitswertfalseRequired reading: everyone it reaches gets a notification with a confirm button, and who confirmed is on record. Only signers who can publish without review may ask for it.
notifyWahrheitswerttrueWhether it makes a sound. Written the right way round on purpose: the screen has a 'publish without notifying' checkbox because a form that loses a field should still notify, but here you write the whole JSON and a field called `silent` reads wrong at three in the morning. Default is true.
comments_enabledWahrheitswerttrueWhether people can comment on it.
pinnedWahrheitswertfalseKeep it at the top of the wall.
languageTextes · ca · en · pt · fr · it · de · sv · nl · pl · ro · csWhat language the text is written in. Leave it out and the company's is used. Getting this right matters: a Catalan original labelled as Spanish is shown to a Spanish reader without the 'not translated' notice that tells them nothing is broken.

GET /announcements/{id}/acknowledgements

announcements:read

Wer eine Pflichtlektüre bestätigt hat und wer nicht, mit Namen und Uhrzeit. Die einzige namentliche Liste der ganzen API, und sie ist es, weil genau das der Sinn der Pflichtlektüre ist: eine freiwillige, unterschriebene und datierte Handlung, die man einer Prüfung zeigen kann.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTextThe announcement id.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
pageGanzzahlmin. 112Page to return. The first page is 1, not 0.
per_pageGanzzahlmin. 1 · max. 200 · außerhalb des Bereichs wird gekappt statt abgelehnt50100How many items per page. Anything above 200 is clamped to 200 rather than rejected: asking for more is a reasonable thing to want.
stateTextall · acknowledged · pendingallEveryone, only those who confirmed, or only those still pending.
departmentText · mehrere, durch Kommas getrenntOnly people in these departments, by name.
centerText · mehrere, durch Kommas getrenntOnly people at these sites, by name.
sortTextname · acknowledged_atnameField to sort by. Defaults to name.
orderTextasc · descascSort direction.

GET /metrics

metrics:read

Die heutige Belegschaft, die Zugänge, die Veröffentlichungen und die Reichweite pro Aushang und pro Abteilung. Dieselben Zahlen wie der Auswertungsbildschirm, vom selben Code berechnet.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
period_daysGanzzahlmin. 1 · max. 3653090How many days back the period covers. Applies to every figure with a period, including the reach lists.
includeText · mehrere, durch Kommas getrenntworkforce · announcements · reach_by_announcement · reach_by_departmentworkforce,announcementsWhich blocks to compute, comma-separated. Leave it out for all of them. `reach_by_announcement` is the expensive one: skip it if your dashboard only draws the headline figures.

GET /webhooks

webhooks:read

Ihre registrierten Adressen, jede mit ihrem Zustand: aufeinanderfolgende Fehlschläge, was Ihr Server zuletzt geantwortet hat und, falls wir sie pausiert haben, warum.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
pageGanzzahlmin. 112Page to return. The first page is 1, not 0.
per_pageGanzzahlmin. 1 · max. 200 · außerhalb des Bereichs wird gekappt statt abgelehnt50100How many items per page. Anything above 200 is clamped to 200 rather than rejected: asking for more is a reasonable thing to want.
eventTextannouncement.published · announcement.pending_review · announcement.acknowledged · person.created · person.deactivatedOnly endpoints subscribed to this event.
activeWahrheitswertOnly live endpoints, or only the switched-off and paused.

POST /webhooks

webhooks:write

Registriert eine Adresse und die Ereignisse, die sie will. Die Antwort bringt das Signaturgeheimnis mit, und das ist das einzige Mal, dass es zu sehen ist.

Im Rumpf

ParameterTypZulässige WerteStandardBeispielWas er tut
urlPflichtTextmax. Länge 500https://hooks.example.com/blastackWhere we POST. https only, no credentials, no fragment.
eventsPflichtListeannouncement.published · announcement.pending_review · announcement.acknowledged · person.created · person.deactivated["announcement.published"]Which events this endpoint wants. At least one.
nameTextmax. Länge 120Zapier · switchboardWhat it is for, in your words. It is the only thing that lets you delete the right one six months from now.
secretTextmax. Länge 200Your own signing secret, if you would rather set it than have one generated. At least 32 characters.
activeWahrheitswerttrueStart delivering straight away.

GET /webhooks/{id}

webhooks:read

Eine einzelne Adresse, mit ihrem Zustand.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTextThe webhook endpoint id.

PATCH /webhooks/{id}

webhooks:write

Ändert, was Sie schicken. Die Adresse wieder auf aktiv zu setzen hebt auch eine Pause auf, die wir nach wiederholten Fehlschlägen verhängt haben, und setzt den Zähler zurück.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTextThe webhook endpoint id.

Im Rumpf

ParameterTypZulässige WerteStandardBeispielWas er tut
urlTextmax. Länge 500Where we POST. https only.
eventsListeannouncement.published · announcement.pending_review · announcement.acknowledged · person.created · person.deactivatedWhich events this endpoint wants. At least one.
nameTextmax. Länge 120What it is for.
activeWahrheitswertSwitch delivery on or off. Turning it on clears a pause.
rotate_secretWahrheitswertGenerate a new signing secret and return it once in this reply.

DELETE /webhooks/{id}

webhooks:write

Löscht sie samt Verlauf. Wer eine Weile nichts empfangen will, ohne den Verlauf zu verlieren, schaltet sie besser ab.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTextThe webhook endpoint id.

GET /webhooks/{id}/deliveries

webhooks:read

Alles, was wir Ihnen zu schicken versucht haben: Versuche, was Sie geantwortet haben und wann der nächste ansteht. Die Kennung ist dieselbe, die in der Kopfzeile mitreiste, sie lässt sich also mit Ihren eigenen Protokollen abgleichen.

Im Pfad

ParameterTypZulässige WerteStandardBeispielWas er tut
idPflichtTextThe webhook endpoint id.

In der Abfrage

ParameterTypZulässige WerteStandardBeispielWas er tut
pageGanzzahlmin. 112Page to return. The first page is 1, not 0.
per_pageGanzzahlmin. 1 · max. 200 · außerhalb des Bereichs wird gekappt statt abgelehnt50100How many items per page. Anything above 200 is clamped to 200 rather than rejected: asking for more is a reasonable thing to want.
statusTextpending · delivered · given_upOnly deliveries in this state.
eventTextannouncement.published · announcement.pending_review · announcement.acknowledged · person.created · person.deactivatedOnly deliveries of this event type.
sinceDatum ISO 8601Only events that happened at or after this instant.

Beispiele

Drei Dinge, die eine Fabrik im ersten Monat automatisiert

Mit der vollständigen Anfrage und der vollständigen Antwort. Tauschen Sie Schlüssel und Namen aus; der Rest funktioniert so, wie er dasteht.

Wenn die Instandhaltung den Stillstandsauftrag schließt

Das ERP verbucht einen Linienstillstand, und das Schwarze Brett erfährt es von allein

Der Fall, nach dem immer gefragt wird. Ihr System weiß längst, dass Linie 3 am Donnerstag stillsteht; mit diesem Aufruf veröffentlicht es das selbst, gerichtet an die betroffenen Abteilungen und mit Bitte um Lesebestätigung, ohne dass jemand irgendetwas zweimal tippt.

Anfrage

curl -X POST https://app.blastack.com/api/v1/announcements \
  -H "Authorization: Bearer blsk_a1b2c3d4e5f6_YOUR_SECRET" \
  -H "Content-Type: application/json" \
  -d '{
       "author": "EMP-0042",
       "title": "Linie 3 steht am Donnerstag still",
       "body": "Am Donnerstag, dem 4., steht Linie 3 ab 06:00 Uhr wegen geplanter Instandhaltung still. Die Frühschicht fängt wie immer an und wechselt auf Linie 2.",
       "audience": {
         "type": "departments",
         "ids": [
           "Instandhaltung",
           "Qualität"
         ]
       },
       "requires_acknowledgement": true,
       "notify": true,
       "language": "de"
     }'

Antwort · 201

{
  "id": "6b1f0f1e-0c2a-4c5e-9a3d-2f5b8c7d1e40",
  "title": "Linie 3 steht am Donnerstag still",
  "body": "Am Donnerstag, dem 4., steht Linie 3 ab 06:00 Uhr wegen geplanter Instandhaltung still. Die Frühschicht fängt wie immer an und wechselt auf Linie 2.",
  "status": "published",
  "kind": "news",
  "language": "de",
  "audience": {
    "type": "departments",
    "ids": [
      "9c1d7e5f-2a3b-4c5d-8e9f-0a1b2c3d4e5f",
      "44ab7e5f-2a3b-4c5d-8e9f-0a1b2c3d4e5f"
    ],
    "names": [
      "Instandhaltung",
      "Qualität"
    ]
  },
  "community": null,
  "section": null,
  "author": {
    "id": "3f2a1b0c-9d8e-4f7a-8b6c-5d4e3f2a1b0c",
    "name": "Ana García",
    "email": "ana.garcia@empresa.com",
    "external_id": "EMP-0042"
  },
  "notify": true,
  "comments_enabled": true,
  "pinned": false,
  "acknowledgements": {
    "required": true,
    "confirmed": 0
  },
  "reads": 0,
  "published_at": "2026-09-01T06:00:00.000Z",
  "created_at": "2026-09-01T06:00:00.000Z",
  "updated_at": "2026-09-01T06:00:00.000Z",
  "url": "https://app.blastack.com/inicio#post-6b1f0f1e-0c2a-4c5e-9a3d-2f5b8c7d1e40"
}

Das Ziel wird über den Namen angegeben und nicht über eine Kennung, weil der Name das ist, was Ihr System zur Hand hat. Gibt es den Namen nicht, sagt die Antwort welchen, und es wird nichts veröffentlicht: ein halber Aushang wäre schlimmer.

Wenn das HR-System den Austritt setzt

Jemand scheidet aus dem HR-System aus und ist am selben Tag draußen

Spricht Ihr System SCIM, passiert das schon von allein und dieser Aufruf erübrigt sich. Spricht es kein SCIM — in einer Fabrik der Normalfall —, genügt eine Zeile, um die Person zu deaktivieren und ihre Sitzungen sofort zu schließen. Der Pfad nimmt Ihre eigene Kennung an, eine Zuordnungstabelle ist also nicht nötig.

Anfrage

curl -X DELETE https://app.blastack.com/api/v1/people/EMP-0042 \
  -H "Authorization: Bearer blsk_a1b2c3d4e5f6_YOUR_SECRET"

Antwort · 200

{
  "id": "3f2a1b0c-9d8e-4f7a-8b6c-5d4e3f2a1b0c",
  "external_id": "EMP-0042",
  "email": "ana.garcia@empresa.com",
  "name": "Ana García",
  "job_title": "Schichtleiterin",
  "department": "Instandhaltung",
  "center": "Halle 2",
  "role": "editor",
  "status": "disabled",
  "language": null,
  "created_at": "2026-02-11T08:14:00.000Z",
  "updated_at": "2026-09-01T07:40:22.000Z"
}

Es deaktiviert; es löscht nicht. Was die Person veröffentlicht hat, bleibt, denn ein Brett voller Lücken hilft niemandem. Zweimal aufzurufen ist kein Fehler.

Jeden Morgen, oder am Tag vor einer Prüfung

Wer das Protokoll bestätigt hat, in eine Tabelle

Ein Make-Szenario oder ein n8n-Ablauf, der die Offenen abfragt und in ein Blatt schreibt: Name, Abteilung und ob bestätigt wurde. Das ist der Bericht, den eine Prüfung verlangt, und der, der einem das Hinterherlaufen auf dem Flur erspart.

Anfrage

curl -G https://app.blastack.com/api/v1/announcements/6b1f0f1e-0c2a-4c5e-9a3d-2f5b8c7d1e40/acknowledgements \
  --data-urlencode "state=pending" \
  --data-urlencode "department=Instandhaltung" \
  --data-urlencode "per_page=200" \
  -H "Authorization: Bearer blsk_a1b2c3d4e5f6_YOUR_SECRET"

Antwort · 200

{
  "announcement": {
    "id": "6b1f0f1e-0c2a-4c5e-9a3d-2f5b8c7d1e40",
    "title": "Linie 3 steht am Donnerstag still"
  },
  "summary": {
    "recipients": 34,
    "acknowledged": 27,
    "pending": 7
  },
  "data": [
    {
      "person": {
        "id": "3f2a1b0c-9d8e-4f7a-8b6c-5d4e3f2a1b0c",
        "name": "Ana García",
        "email": "ana.garcia@empresa.com",
        "external_id": "EMP-0042",
        "department": "Instandhaltung",
        "center": "Halle 2"
      },
      "acknowledged": false,
      "acknowledged_at": null
    }
  ],
  "page": 1,
  "per_page": 200,
  "total": 7
}

Die Zusammenfassung zählt über die ganze Grundgesamtheit und nicht über die Seite oder den Filter, damit das «12 von 30» weiter etwas bedeutet. Die Uhrzeit der Bestätigung ist die des ersten Mals und wird nie wieder angefasst.

Ausgehende Ereignisse

Wir rufen an, in unter einer Minute

Das ist es, was die Sache wirklich anschlussfähig macht. Ohne ausgehende Ereignisse muss der Auslöser Ihres Szenarios «alle fünf Minuten nachfragen» heißen, und das ist langsam, wird pro Durchgang abgerechnet und findet fast nie etwas.

EreignisWann es losgeht
announcement.publishedEtwas ist am Brett erschienen, auf welchem Weg auch immer: der Schnelleditor, der vollständige Editor, diese API, die Freigabe-Warteschlange oder ein geplanter Aushang, der seine Stunde erreicht. Die Art reist mit, falls Sie nur schlichte Aushänge wollen und keine Umfragen oder Veranstaltungen.
announcement.pending_reviewEin Aushang wartet auf Freigabe. Geht nur in Firmen los, bei denen die Freigabe-Warteschlange eingeschaltet ist.
announcement.acknowledgedJemand hat eine Pflichtlektüre bestätigt. Ein Ereignis pro Person, mit wer und wann.
person.createdJemand wurde angelegt, gleich auf welchem Weg: Provisionierung, Beitrittscode, Single Sign-on, Verwaltungsbildschirm oder diese API.
person.deactivatedJemand wurde deaktiviert. Da hier niemand gelöscht wird, ist das das Austrittssignal.

Der Umschlag, bei allen fünf derselbe

{
  "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
  "type": "announcement.published",
  "occurred_at": "2026-09-01T06:00:00.000Z",
  "organization_id": "0a9b8c7d-6e5f-4a3b-8c9d-0e1f2a3b4c5d",
  "data": {
    "announcement": {
      "id": "6b1f0f1e-0c2a-4c5e-9a3d-2f5b8c7d1e40",
      "title": "Parada de la línea 3 el jueves",
      "body": "El jueves 4 a las 06:00 para la línea 3 por mantenimiento programado.",
      "kind": "news",
      "language": "es",
      "requires_acknowledgement": true,
      "audience": {
        "type": "departments",
        "names": [
          "Mantenimiento",
          "Calidad"
        ]
      },
      "community": "Planta de Getafe",
      "author": {
        "id": "3f2a1b0c-9d8e-4f7a-8b6c-5d4e3f2a1b0c",
        "name": "Ana García",
        "email": "ana.garcia@empresa.com",
        "external_id": "EMP-0042"
      },
      "url": "https://app.blastack.com/inicio#post-6b1f0f1e-0c2a-4c5e-9a3d-2f5b8c7d1e40",
      "status": "published"
    }
  }
}

Der Inhalt ändert sich mit dem Ereignis; der Umschlag nicht. Die Kennung ändert sich zwischen Wiederholungen nicht, ein Duplikat zu verwerfen ist auf Ihrer Seite also eine einzige Bedingung.

Die Kopfzeilen jeder Zustellung

KopfzeileWofür
blastack-eventWas passiert ist. Der Wert, auf den man verzweigt.
blastack-event-idDie Ereigniskennung. Sie ändert sich zwischen Wiederholungen nicht: die, auf die man abstellt, um nie zweimal dasselbe auszuführen.
blastack-delivery-attemptDer wievielte Versuch das ist, beginnend beim ersten.
blastack-signatureDie Signatur. Das Einzige, was eine Zustellung von uns von einer unterscheidet, die sich jemand ausgedacht hat, der Ihre Adresse findet.

Die Signatur prüfen

Die Signatur ist HMAC-SHA256 über den Zeitstempel, einen Punkt und den rohen, nicht geparsten Rumpf. Dasselbe Format, das die Zahlungsanbieter verwenden, also das, das Sie vermutlich schon einmal geschrieben haben.

import { createHmac, timingSafeEqual } from "node:crypto";

export function verify(rawBody, headers, secret) {
  const sent = headers["blastack-signature"] ?? "";
  const t = /t=(\d+)/.exec(sent)?.[1];
  const v1 = /v1=([0-9a-f]+)/.exec(sent)?.[1];
  if (!t || !v1) return false;

  const mine = createHmac("sha256", secret)
    .update(`${t}.${rawBody}`, "utf8")
    .digest("hex");

  if (v1.length !== mine.length) return false;
  if (!timingSafeEqual(Buffer.from(v1, "hex"), Buffer.from(mine, "hex"))) {
    return false;
  }
  return Math.abs(Date.now() / 1000 - Number(t)) < 300;
}

Vergleichen Sie in konstanter Zeit und weisen Sie alles ab, dessen Zeitstempel älter als ein paar Minuten ist. Ohne diese zweite Prüfung kann Ihnen eine Kopie einer alten Zustellung jahrelang erneut geschickt werden, und die Signatur stimmt weiterhin.

Wiederholungen, Pause und warum nichts ankommt

  • Jede 2xx-Antwort genügt. Wir lesen den Rumpf nicht: antworten Sie schnell und arbeiten Sie danach, denn nach zehn Sekunden geben wir auf, und das zählt als Fehlschlag.
  • Sechs Versuche mit wachsender Wartezeit — eine Minute, fünf, fünfzehn, eine Stunde, drei und sechs — verteilt über etwa zehneinhalb Stunden. Das deckt ein nächtliches Deployment und eine Wartung am Wochenende ab.
  • Dreißig Fehlschläge hintereinander pausieren die Adresse, und der Grund wird festgehalten. Aufgehoben wird die Pause, indem man sie wieder auf aktiv setzt, was auch den Zähler zurücksetzt.
  • Wir rufen nur öffentliche https-Adressen an. Geprüft wird beim Registrieren und noch einmal vor jeder Zustellung, denn ein Name, der heute ins öffentliche Internet auflöst, kann morgen in Ihr internes Netz auflösen.
  • Eine heute registrierte Adresse bekommt nicht das von gestern: ein Abonnement zählt ab seiner Anlage, damit das erste Szenario nicht sofort vierzig Ausführungen auslöst.

Fehler

Immer dieselbe Form

Jeder Fehler liefert dasselbe Objekt, mit einem Code, auf den man eine Bedingung schreiben soll. Codes werden nie umbenannt: es kommen welche hinzu. Die Meldung daneben ist für den, der das Protokoll liest, und die darf sich ändern.

{
  "error": {
    "status": 403,
    "code": "insufficient_scope",
    "message": "This API key does not have the \"metrics:read\" scope.",
    "required_scope": "metrics:read",
    "granted_scopes": [
      "people:read"
    ]
  },
  "documentation": "https://blastack.com/en/developers"
}

Ein unbekannter Parameter wird abgelehnt, nicht ignoriert. Ein stillschweigend verworfener Filter liefert Ihnen mehr Daten, als Sie angefordert haben, und nichts weist Sie darauf hin.

RateLimit-Limit · RateLimit-Remaining · RateLimit-Reset · Retry-After

CodeWann er kommt
invalid_token401 · Der Schlüssel fehlt, ist falsch geschrieben oder wurde gesperrt. Welches der drei, sagen wir nicht.
insufficient_scope403 · Der Schlüssel ist gültig, trägt aber nicht den Bereich, den dieser Aufruf braucht. Die Antwort sagt, welcher nötig war und welche er hat.
module_required403 · Die Firma hat das Modul Unternehmensidentität nicht gebucht, zu dem die API gehört.
read_only403 · Die kostenlose Testphase ist vorbei und die Firma ist im Nur-Lese-Zustand. Betrifft nur, was schreibt.
rate_limited429 · Mehr Anfragen als erlaubt in einer Minute. Die Antwort sagt, wie viele Sekunden zu warten sind.
invalid_request400 · Ein Feld fehlt, ist zu viel oder wird nicht verstanden. Die Meldung nennt den genauen Parameter und zählt die zulässigen Werte auf.
not_found404 · Nichts von Ihnen mit dieser Kennung. Dasselbe bekommt man für etwas, das einer anderen Firma gehört: die beiden zu unterscheiden wäre ein Weg herauszufinden, was anderswo existiert.
conflict409 · Es kollidiert mit etwas Bestehendem: zwei Personen mit derselben E-Mail, zwei gleiche Ereignisadressen. Die Antwort bringt die Kennung dessen mit, womit es kollidierte, damit man weitermachen kann.
server_error500 · Bei uns ist etwas kaputtgegangen. Nichts davon steht in der Antwort; vollständig bleibt es in unserem Protokoll.

Grenzen

Was man wissen sollte, bevor man die Schleife schreibt

  • Hundertzwanzig Anfragen pro Minute und Schlüssel. Jede Antwort trägt, wie viele übrig sind und in wie vielen Sekunden der Zähler neu beginnt; eine 429 trägt zusätzlich die Wartezeit.
  • Listen kommen zu fünfzig und nehmen bis zu zweihundert pro Seite. Die erste Seite ist die 1, nicht die 0. Mehr als zweihundert wird gekappt statt abgelehnt.
  • Der Zeitraum der Kennzahlen geht bis dreihundertfünfundsechzig Tage und wird per Parameter angefordert. Die Reichweite pro Aushang ist der teure Block: weglassen, wenn Ihr Dashboard nur die Kopfzahlen zeichnet.
  • Zwanzig Adressen für ausgehende Ereignisse pro Firma. Keine kaufmännische Grenze: jedes Ereignis wird einmal pro Adresse eingereiht, und wer mehr braucht, verteilt an der falschen Stelle.
  • Ausgehende Ereignisse brauchen bis zu einer Minute: erkannt werden sie durch Lesen der Datenbank und nicht aus dem Veröffentlichen-Knopf heraus, damit der langsame Server einer Integration niemandes Brett aufhalten kann.
  • Angekündigt werden nur die letzten vierundzwanzig Stunden. Stünde unsere Uhr-Aufgabe einen ganzen Tag still, lassen wir nicht das Quartal auf einmal los: Ihre Automatisierungen liefen mit vorgestrigen Daten, als wären sie von jetzt.

Was sie nicht kann

Hier gesagt, damit Sie es nicht auf halbem Weg merken

Wer integrieren will, braucht die Grenzen vor dem Anfangen und nicht, wenn schon ein halbes Szenario steht. Diese Liste ist das, was ein Entwickler suchen und nicht finden wird, und sie wird aktualisiert, sobald etwas davon nicht mehr stimmt.

  • Es gibt keinen Bildschirm zum Anlegen von Schlüsseln. Heute werden sie auf der Konsole mit npm run clave:api ausgegeben, und zwar von uns. Ein ehrlicher Bildschirm bräuchte seine Texte in den zwölf Sprachen der Anwendung, und ein halb übersetzter Bildschirm wird nicht veröffentlicht.
  • Ausgehende Ereignisse brauchen eine Cron-Zeile auf dem Server. Ohne sie geht nichts kaputt, und genau das ist das Problem: alles andere läuft weiter und es geht einfach nichts hinaus. Zu sehen ist es im Zustellprotokoll, das leer wäre.
  • Das Signaturgeheimnis wird ein einziges Mal gezeigt: beim Anlegen der Adresse oder beim Wechsel. Es lässt sich nicht wieder auslesen, nur wechseln. Legen Sie es in diesem Moment ab.
  • Der Wechsel des Geheimnisses hat keine Schonfrist. Die nächste Zustellung ist bereits mit dem neuen signiert: ändern Sie es zuerst auf Ihrem Server und fordern Sie den Wechsel danach an.
  • Zwanzig Adressen für ausgehende Ereignisse pro Firma. Brauchen Sie mehr, muss die Verteilung in Ihrem eigenen Werkzeug aus einer einzigen Zustellung heraus geschehen.
  • Chat, Umfragen, Veranstaltungen, Anerkennungen und Alben sind nicht erreichbar. Sie tauchen in der Aushangliste und in den ausgehenden Ereignissen mit ihrer Art auf, lassen sich aber nicht eigenständig anlegen oder lesen.
  • Dokumente sind nicht erreichbar und Dateien lassen sich nicht hochladen. Bilder in einem Aushang auch nicht: der Rumpf ist reiner Text.
  • Ein bereits veröffentlichter Aushang lässt sich weder ändern noch löschen, und Kommentare lassen sich weder schreiben noch lesen.
  • Personen lassen sich nicht über eine Teilsuche in der E-Mail finden, und niemand wird wirklich gelöscht: Löschen ist eine schriftliche Anfrage, die wir bearbeiten, und sie anonymisiert, statt zu entfernen.
  • Die Kennzahlen sind zusammengefasst, und es gibt keinen Weg, herauszuziehen, wer was gelesen hat. Die einzige namentliche Liste ist die der Pflichtlektüren, die es gibt, damit man sie einer Prüfung zeigen kann.
  • Es gibt keine getrennte Testumgebung, keine offiziellen Bibliotheken für irgendeine Sprache und keine Cursor-Seiten. Es ist JSON über HTTPS und wird mit dem aufgerufen, was Sie haben.

Für Maschinen

Falls ein Assistent das hier liest

Die halbe Kaufprüfung besteht heute darin, dass jemand einen Assistenten fragt, ob sich das an irgendetwas anschließen lässt. Also ist die Antwort so geschrieben, dass sie ohne Konto und ohne Raten lesbar ist.

  • Die OpenAPI-3.1-Spezifikation liegt unter einer öffentlichen, stabilen Adresse, ohne Schlüssel, mit erlaubtem Cross-Origin und ohne die Datenbank auch nur einmal anzufassen. Sie beschreibt die siebzehn Endpunkte mit ihren Parametern, ihren zulässigen Werten, der Form jeder Antwort und den fünf ausgehenden Ereignissen.
  • Sie ist nicht von Hand geschrieben: sie wird aus demselben Katalog erzeugt, gegen den jeder Endpunkt prüft, was bei ihm ankommt, und die Antwortformen entstehen, indem genau der Code ausgeführt wird, der die Anfragen bedient. Sie kann nichts anderes sagen, als sie tut.
  • Diese Seite hat in allen sechs Sprachen dieselbe Struktur, mit Überschriften, die sagen, was darunter steht, und mit echten Tabellen, nicht mit Bildern und nicht mit vorgetäuschten Spalten.
  • Es gibt außerdem eine llms.txt mit der Kurzfassung, deren Integrationsabschnitt getrennt geschrieben ist und in der die Adressen und Bereiche im Klartext stehen.

Wenn Ihnen etwas aus dieser Liste fehlt, sagen Sie es

Was am häufigsten gewünscht wird, wird als Nächstes geschrieben. Und wenn etwas auf dieser Seite nicht zu dem passt, was der Server antwortet, ist das unser Fehler und wir wollen ihn noch am selben Tag erfahren.