Alles, was das KIT kann – an einem Ort
Das ForHosting KIT ist ein Katalog aus 7447 fertigen Aufgaben – ein Dokument umwandeln, eine Rechnung auslesen, Audio transkribieren, eine IBAN prüfen, einen QR-Code erzeugen – verteilt auf 14 Kategorien. Sie führen sie hier im Browser aus oder rufen sie aus Ihrem Code mit einem einzigen authentifizierten POST auf. Diese Seite ist die vollständige API-Referenz: Endpunkte, das asynchrone Modell, der Webhook-Vertrag, Fehler und Preise.
Was das KIT ist
Ein Aufgabenkatalog, kein Modell
Jede Funktion ist eine Aufgabe: Sie senden eine Eingabe, Sie erhalten ein Ergebnis. Keine Tokens, keine Kontextfenster, kein Prompt-Engineering. Eine Aufgabe hat einen veröffentlichten Preis, eine dokumentierte Einheit und eine feste Form.
Vier Wege, sie auszuführen. Web – jede Funktion hat ihre eigene Seite und läuft im Browser; die kostenlosen verlassen Ihr Gerät nie. API – ein authentifizierter POST, unten dokumentiert. E-Mail und Telegram – Sie schicken die Aufgabe an eine KIT-Adresse. Die API ist ein Kanal, nicht das Produkt.
Schnellstart
Von null zum Ergebnis in drei Aufrufen
Legen Sie ein Konto mit Ihrer E-Mail-Adresse an und laden Sie Guthaben auf, wenn Sie es brauchen. Kein Abo, kein Verkaufsgespräch.
API-Schlüssel holen
POST /signup mit Ihrer E-Mail-Adresse liefert einen Schlüssel, der mit kit_live_ beginnt. Er wird genau einmal angezeigt. Wir speichern nur seinen SHA-256-Hash – geht er verloren, können wir ihn nicht wiederherstellen; wir stellen dann einen neuen aus.
Funktion auswählen
GET /catalog listet alle 7447 mit aktuellem Preis und Einheit. Oder Sie sehen sich den Katalog am Ende dieser Seite an.
Ausführen
POST an den Endpunkt der Funktion. Sie erhalten sofort eine task_id zurück, und das Ergebnis kommt an Ihren Webhook.
Authentifizierung
Bearer-Token, einmalig angezeigt
Jede API-Anfrage trägt Authorization: Bearer kit_live_…. Schlüssel bestehen nach dem Präfix aus 48 Hex-Zeichen.
Wir speichern nur den SHA-256-Hash Ihres Schlüssels. Das ist Absicht: Ein Datenbank-Dump händigt niemandem Ihre Zugangsdaten aus – es bedeutet aber auch, dass wir Ihnen Ihren Schlüssel wirklich nicht per E-Mail zurückschicken können. Verloren? Wir widerrufen ihn und stellen einen neuen aus.
Ein falscher Schlüssel liefert immer 401 und sagt nie, warum. Widerrufen, vertippt und nie existiert sind absichtlich nicht unterscheidbar: Ihnen zu sagen, welcher Fall vorliegt, sagt es auch einem Angreifer.
Das asynchrone Modell
Jede Aufgabe ist asynchron. Ohne Ausnahme.
Sie senden die Aufgabe per POST
Antwort: 202 mit einer task_id und dem Status queued, dazu die zu erwartenden Kosten. Der Betrag wird reserviert, nicht abgebucht.
Sie läuft am Edge
Unter einer Sekunde bei Rechenaufgaben; Sekunden bei KI und Medien.
Das Ergebnis findet Sie
Es wird per POST an Ihre webhook_url geschickt, sofern Sie eine angegeben haben. Andernfalls GET /tasks/{id}/result. Ergebnisse bleiben je nach Größe verfügbar: von 168 h bei kleinen (bis 1 MB) bis 6 h bei sehr großen.
Fehlschläge kosten nichts
Eine Aufgabe wird insgesamt bis zu 3-mal ausgeführt, mit Backoff zwischen den Versuchen. Schlägt sie weiterhin fehl, wird die Reservierung freigegeben und Ihnen nichts berechnet. Nie.
API-Referenz
Jeder Endpunkt, den das KIT beantwortet
Die Routen tragen kein Versionspräfix. /v1/* wird für ältere Clients weiterhin aufgelöst, ist aber nicht die kanonische Form – neuer Code sollte sie nicht verwenden.
Basis-URL: https://api.kit.forhosting.com
| Methode | Route | Auth | Beschreibung |
|---|---|---|---|
ANY |
/ |
Öffentlich | Dienstindex: Version, Anzahl der Funktionen und die Endpunktliste, die die API über sich selbst angibt. Ohne Schlüssel, und sie antwortet auf jede Methode. |
POST |
/{alias} |
API-Schlüssel | Abkürzung je Funktion für POST /tasks mit festem type – zum Beispiel POST /ocr/invoice. Es ist die Form, die jede Funktionsseite zeigt. |
GET |
/account |
API-Schlüssel | Kontostand: available_usd ist Ihr tatsächliches Guthaben, dazu held_usd. Wird das Guthaben vom Kundenbereich verwaltet, steht balance.source auf "portal" und balance_endpoint verweist auf den aktuellen Wert. |
POST |
/agent/ask |
API-Schlüssel Bald | Nicht implementiert – liefert 501 mit Schlüssel und 401 ohne. Der dialogorientierte Assistent entsteht an anderer Stelle; um eine Funktion zu finden, nutzen Sie POST /catalog/search. |
GET |
/catalog |
Öffentlich | Alle Funktionen mit aktuellem Preis und Einheit. ?lang=en|es, ?q= zum Filtern, ?limit=, ?schema=1 für das Eingabeschema und ?channel= für den bereits auf diesen Kanal angepassten Preis – fragen Sie den Kanal ab, über den Sie abrechnen, sonst zeigen Sie einen Betrag an und berechnen einen anderen. |
POST |
/catalog/search |
Öffentlich | {query} → die passenden Funktionen, jede mit ihrem bereits formulierten Preis. Ohne Schlüssel. Bewertet wird nach Abdeckung ganzer Wörter mit Schwellenwert: Eine Anfrage, die sie nicht versteht, liefert nichts zurück, statt zu raten – das ist Absicht. |
POST |
/estimate |
API-Schlüssel | {type, input} → Einheiten, Preis und Aufschlüsselung. Kalkuliert, ohne auszuführen. Wenn die tatsächliche Menge vorab nicht feststeht (die Seitenzahl eines PDFs hinter einer URL), sagt die Antwort estimated: true. |
GET |
/mobile/bootstrap |
Öffentlich | Was die mobile App zum Start braucht: Kategorien, Beschriftungen und dieselben kanalangepassten Preise. Ohne Schlüssel. Ebenfalls nicht Teil des öffentlichen Vertrags, aus demselben Grund. |
GET |
/mobile/catalog |
Öffentlich | Katalogprojektion für die mobile App, mit bereits auf den App-Kanal angepassten Preisen. Ohne Schlüssel. Nicht Teil des öffentlichen Vertrags: Die Form folgt der App und kann sich ohne Ankündigung ändern – entwickeln Sie gegen GET /catalog. |
GET |
/plans |
Öffentlich | Aufladebeträge: currency und topup (sku, default_amount, min_amount). Sonst nichts – es gibt keine Tarife zum Abonnieren. |
POST |
/signup |
Öffentlich | {email} → 201 mit Ihrem api_key, der nur einmal angezeigt wird. 409, wenn die E-Mail bereits existiert; 429 ab 10/h pro IP. |
GET |
/tasks |
API-Schlüssel | Ihre Aufgaben. ?status=, ?limit= (25 standardmäßig, maximal 100). |
POST |
/tasks |
API-Schlüssel | {type, input, webhook_url?, max_cost_usd?} → 202. Abgerechnet wird die tatsächliche Einheit der Aufgabe – Seiten, Minuten, Bilder –, gemessen während der Ausführung, nicht die vorherige Schätzung. max_cost_usd ist eine harte Obergrenze: Übersteigt der reale Preis sie, schlägt die Aufgabe fehl und es wird nichts berechnet. Senden Sie Idempotency-Key, damit Wiederholungen gefahrlos sind: Eine Wiederholung liefert die ursprüngliche Aufgabe mit idempotent: true. |
DELETE |
/tasks/{id} |
API-Schlüssel | Bricht eine wartende Aufgabe ab und gibt ihre Reservierung frei. |
GET |
/tasks/{id} |
API-Schlüssel | Status der Aufgabe. 10 Abfragen alle 10 Sekunden je Aufgabe; darüber 429 mit Retry-After: 1. Nutzen Sie lieber den Webhook. |
GET |
/tasks/{id}/events |
API-Schlüssel Bald | Nicht implementiert – liefert 501. SSE kommt noch; nutzen Sie den Webhook. |
GET |
/tasks/{id}/result |
API-Schlüssel | JSON-Ergebnis oder die Datei als Anhang. 409 noch nicht fertig, 410 abgelaufen, 422 fehlgeschlagen. Die Aufbewahrung richtet sich nach der Ergebnisgröße: 168 h für kleine, bis hinunter zu 6 h für sehr große. |
POST |
/tasks/{id}/retry |
API-Schlüssel | Stellt eine fehlgeschlagene Aufgabe erneut in die Warteschlange. |
POST |
/uploads |
API-Schlüssel | Senden Sie eine lokale Datei: roher Binärkörper mit dem Content-Type der Datei. → 201 mit ref: "kit://upl_…", das Sie anschließend dort einsetzen, wo eine URL stünde: {"input": {"pdf": "kit://upl_…"}}. Ein Upload kann mehrere Aufgaben speisen. Refs leben 24 h. Maximal 100 MiB (104.9 MB) pro Upload; jede Funktion setzt zusätzlich ihr eigenes Limit. |
Webhooks
Signierte Zustellung – und wie Sie sie prüfen
Setzen Sie webhook_url, wenn Sie eine Aufgabe anlegen, und wir schicken das Ergebnis per POST dorthin, sobald es fertig ist. Das ist der empfohlene Weg: günstiger als Polling und schneller da.
Prüfen Sie die Signatur, bevor Sie dem Body vertrauen. Jede Zustellung trägt KIT-Signature: v1=<hex> und KIT-Timestamp: <Unix-Sekunden>. Die Signatur ist HMAC-SHA256 über die Zeichenkette <timestamp>.<raw body> – der Zeitstempel und der Punkt gehören zur signierten Nutzlast, sie sind keine Dekoration. Signieren Sie die empfangenen Rohbytes, nicht ein neu serialisiertes Objekt.
Die Zustellung wird bis zu 5-mal mit exponentiellem Backoff versucht. Ein 4xx von Ihrem Endpunkt beendet die Wiederholungen sofort – wir lesen es als „Ihr Handler ist falsch“, nicht als „später noch einmal“. Nur 5xx und Netzwerkfehler werden wiederholt. Danach landet die Zustellung im Dead-Letter.
Was wir per POST senden
{
"event": "task.completed",
"created_at": "2026-07-16T10:31:04.120Z",
"data": {
"task_id": "tsk_a1b2c3d4e5f6",
"type": "ocr.invoice",
"status": "done",
"units": 1,
"price_usd": 0.021,
"result_url": "https://api.kit.forhosting.com/tasks/tsk_a1b2c3d4e5f6/result"
}
}{
"event": "task.failed",
"created_at": "2026-07-16T10:31:04.120Z",
"data": {
"task_id": "tsk_a1b2c3d4e5f6",
"type": "ocr.invoice",
"status": "failed",
"error": {
"code": "engine_error",
"message": "Upstream timed out after 3 attempts."
},
"charged": false
}
}Die Signatur prüfen
const crypto = require("crypto");
// req.body tiene que ser el cuerpo CRUDO, no un objeto re-serializado.
function verify(rawBody, headers, secret) {
const sig = (headers["kit-signature"] || "").replace(/^v1=/, "");
const ts = headers["kit-timestamp"];
const mine = crypto.createHmac("sha256", secret)
.update(ts + "." + rawBody) // el timestamp va firmado
.digest("hex");
return crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(mine));
}import hmac, hashlib
def verify(raw_body: bytes, headers, secret: str) -> bool:
sig = headers["KIT-Signature"].removeprefix("v1=")
ts = headers["KIT-Timestamp"]
mine = hmac.new(secret.encode(),
f"{ts}.".encode() + raw_body, # el timestamp va firmado
hashlib.sha256).hexdigest()
return hmac.compare_digest(sig, mine)Fehler
Standard-HTTP, maschinenlesbarer Slug
Jeder Fehler trägt im Body einen stabilen error-Slug. Werten Sie den Slug aus, nicht die Meldung: Meldungen sind lokalisiert und können sich ändern.
| HTTP | Fehler | Bedeutung |
|---|---|---|
400 | flow_depth | Eine zusammengesetzte Funktion war tiefer verschachtelt als erlaubt. Flachen Sie die Schritte ab. |
400 | invalid_amount | Der Betrag fehlt, ist keine Zahl oder liegt außerhalb des erlaubten Bereichs. |
400 | invalid_email | Die E-Mail-Adresse fehlt oder ist ungültig. |
400 | invalid_input | Der Eingabe fehlt ein Pflichtfeld, oder sie hat nicht die von dieser Aufgabe erwartete Form. |
400 | invalid_json | Der Anfragetext ist kein gültiges JSON. |
400 | missing_type | Das Feld „type“ fehlt in der Anfrage. Siehe GET /catalog. |
400 | unknown_op | Unbekannte Operation für diese Funktion. Prüfen Sie den Namen im Katalog. |
400 | unsafe_url | Die URL zeigt auf einen Ort, von dem wir nicht laden: eine interne oder nicht öffentliche Adresse. |
401 | auth_required | Dieser Schritt braucht ein identifiziertes Konto, und die Anfrage bringt keines mit. |
401 | no_key | Die Anfrage trägt keinen API-Schlüssel, oder das Konto hat keinen aktiven. |
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | account_suspended | Ihr Konto ist gesperrt – meist wegen des Ausgabenlimits. Schreiben Sie uns, um es freizuschalten. |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
402 | max_cost_exceeded | Die Aufgabe kostete mehr als Ihr max_cost_usd. Es wurde nichts berechnet. |
403 | forbidden | Die Anmeldedaten sind gültig, dürfen das aber nicht. |
404 | input_not_found | Diese kit://-Referenz existiert nicht. Laden Sie die Datei erneut über POST /uploads hoch. |
404 | not_found | Unter diesem Pfad gibt es keine Aufgabe und keine Ressource. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
409 | alias_taken | Dieser Posteingangs-Alias gehört jemand anderem. Wählen Sie einen anderen. |
409 | already_accepted | Diese Zusage wurde bereits verwendet. Jede gilt genau einmal. |
409 | email_taken | Mit dieser E-Mail-Adresse besteht bereits ein Konto. |
409 | need_lease | Ein anderer Worker führt diese Aufgabe bereits aus. Warten Sie, bis er fertig ist. |
409 | not_cancellable | Die Aufgabe wartet nicht mehr, also lässt sie sich nicht abbrechen. Nur wartende Aufgaben können abgebrochen werden. |
409 | not_ready | Die Aufgabe ist noch nicht fertig – fragen Sie den Status ab oder warten Sie auf den Webhook. |
409 | not_retryable | Nur fehlgeschlagene Aufgaben lassen sich wiederholen. Diese ist in einem anderen Zustand. |
410 | expired | Die Aufbewahrungsfrist des Ergebnisses ist abgelaufen; es wird nicht mehr gespeichert. |
410 | input_expired | Diese kit://-Referenz ist abgelaufen. Uploads leben 24 h – laden Sie die Datei erneut hoch. |
410 | quote_expired | Das Angebot ist älter als sein Gültigkeitsfenster. Fordern Sie ein neues an. |
413 | input_too_large | Die Eingabe überschreitet das Größenlimit dieser Aufgabe – die genaue Grenze steht auf der Seite. |
413 | resolution_too_high | Bild oder Video überschreiten die Auflösung, die diese Funktion annimmt. |
422 | conversion_failed | Die Datei ließ sich nicht konvertieren. Meist ein beschädigtes oder unerwartetes Format. |
422 | engine_error | Die Verarbeitung ist bei jedem Versuch fehlgeschlagen. Die Reservierung wurde freigegeben – Ihnen wird nichts berechnet. |
422 | needs_rework | Das Ergebnis hat seine eigene Qualitätsprüfung nicht bestanden und wird deshalb nicht geliefert. Nicht berechnet. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |
500 | lease_error | Die Aufgabe konnte nicht zur Ausführung übernommen werden. Sie geht zurück in die Warteschlange. |
500 | ledger_error | Das Guthaben konnte weder reserviert noch abgerechnet werden. Versuchen Sie es erneut. |
500 | no_hold | Die Aufgabe hat keine Reservierung zum Abrechnen. Das sollte nicht vorkommen; falls doch, sagen Sie uns Bescheid. |
500 | no_result | Die Aufgabe endete, ohne ein Ergebnis zu liefern. |
501 | coming_soon | Diese Funktion ist noch nicht verfügbar – der veröffentlichte Preis gilt ab dem Start. |
501 | mail_not_configured | Diese Funktion verschickt E-Mails und das Konto hat noch keinen Absender konfiguriert. |
501 | not_implemented | Dieser Endpunkt oder diese Funktion ist noch nicht verfügbar. |
501 | tickets_not_configured | Die Ticket-Anbindung ist für dieses Konto nicht eingerichtet. |
501 | unsupported | Dieser Vorgang wird noch nicht unterstützt (etwa lassen sich Flows nicht kalkulieren). |
502 | model_output_invalid | Das Modell hat etwas geliefert, das nicht zur deklarierten Ausgabe passt. Nicht berechnet. |
502 | tickets_unreachable | Das Ticketsystem hat nicht geantwortet. Es wurde nichts berechnet; versuchen Sie es erneut. |
503 | all_busy | Alle Worker dieser Funktion sind belegt. Versuchen Sie es gleich noch einmal. |
Preise
Veröffentlicht, je Aufgabe, ohne Credits
Sie zahlen nur, was Sie nutzen. Laden Sie Guthaben auf Ihr Konto (ab $10.00) – es verfällt nie – und jede Aufgabe wird davon zu ihrem veröffentlichten Preis pro Aufgabe abgebucht. Echte Dollar, keine Punkte.
Jede Aufgabe kostet einen Grundpreis plus einen Einheitenpreis – beide veröffentlicht auf der Seite der jeweiligen Funktion und im Katalog weiter unten, ab $0.002 pro Aufruf. POST /estimate beziffert eine Aufgabe, ohne sie auszuführen, und max_cost_usd an einer Aufgabe lehnt sie ab, wenn sie mehr kosten würde als angegeben.
Fehlgeschlagene Aufgaben werden nie berechnet. Kostenlose Funktionen laufen in Ihrem Browser und kosten gar nichts.
Limits
Was der Dienst durchsetzt
Drei Grenzen, und jede zählt für sich. Pro Konto: 600 Anfragen pro Minute insgesamt und 60 Uploads pro Minute. Pro Aufgabe: 10 Statusabfragen alle 10 Sekunden – wird eine davon überschritten, erhalten Sie 429 mit Retry-After: 1. Nutzen Sie den Webhook statt Polling: er kostet weniger und ist früher da. Ergebnisse bleiben je nach Größe verfügbar: 168 h bis 1 MB, bis hinunter zu 6 h bei sehr großen. GET /tasks liefert standardmäßig 25 Einträge, maximal 100. Die Registrierung ist auf 10 Konten pro Stunde und IP begrenzt.
Funktionskatalog
Alle 7447, nach Kategorie durchsuchbar
Jede Funktion hat ihre eigene Seite: dort führen Sie sie aus und sehen ein echtes Beispiel und den veröffentlichten Preis – denselben, den diese API abrechnet. Öffnen Sie den vollständigen Katalog, oder springen Sie direkt zu einer Kategorie.
Keine Gewährleistung
Was wir nicht versprechen
Das KIT wird „wie besehen“ bereitgestellt: keine Gewährleistung, keine Verfügbarkeitszusage, kein SLA (dedizierte Infrastruktur mit SLA ist eine kostenpflichtige Zusatzleistung) und kein garantierter Support. Die vollständige KIT-Klausel steht in den Nutzungsbedingungen.