spicyapiDokumentation
Mit der API entwickeln
Hauptinhalt

Kostenschätzungen und Protokollkompatibilität

Den genauen Preis einer Anfrage erfahren, bevor Sie bezahlen, sie zu genau diesem Preis absenden, nach einer verlorenen Antwort sicher weitermachen und wissen, wie die Kompatibilitäts-APIs für Text und Video abrechnen.

Eine exakte Anfrage schätzen lassen

Eine Kostenschätzung (englisch quote) nennt Ihnen den Preis genau einer Anfrage, bevor Sie bezahlen. Sie ist kostenlos, legt keinen Task an und reserviert kein Geld. Danach senden Sie dieselbe Anfrage zusammen mit der Kostenschätzung ab, und sie wird nur zu dem Preis angenommen, den Sie gesehen haben.

Die folgenden Befehle sind für ein Terminal unter macOS oder Linux gedacht, mit gesetztem SPICY_API_KEY wie im Schnellstart beschrieben. MODEL_ID_FROM_CATALOG ist ein Platzhalter: Setzen Sie einen model-Wert aus Ihrem Live-Katalog (GET /api/v1/models) ein, und übernehmen Sie jedes Feld in input aus dem Schema dieses Modells.

Die geplante Anfrage speichern

Legen Sie eine Datei namens request.json an, die genau das model, den input und optional die callBackUrl enthält, die Sie absenden werden:

request.json
{
  "model": "MODEL_ID_FROM_CATALOG",
  "input": { "prompt": "A cinematic night portrait" }
}

Den Preis abfragen

curl https://api.spicyapi.ai/api/v1/jobs/quote \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  --data-binary @request.json
{
  "code": 200,
  "msg": "success",
  "data": {
    "quoteId": "QUOTE_ID_FROM_RESPONSE",
    "model": "MODEL_ID_FROM_CATALOG",
    "estimatedCost": "0.008",
    "maxCharge": "0.008",
    "currency": "USD",
    "quantity": "1",
    "unit": "per_image",
    "expiresAt": "2026-09-17T10:05:00Z"
  },
  "request_id": "req_01k3m8x9q2z4v7n5p6r8s0t1w2"
}

Beträge sind Dezimalzahlen in Textform, in US-Dollar. maxCharge ist das Höchste, was diese Anfrage kosten kann; derzeit ist es immer gleich estimatedCost. quantity und unit zeigen, was gezählt wird, zum Beispiel Sekunden Video. Zeigen Sie den Betrag und expiresAt der Person, die die Ausgabe freigibt.

Eine Kostenschätzung durchläuft dieselben Prüfungen wie ein echtes Absenden und kann deshalb schon hier scheitern: 400 (die Eingabe passt nicht zum Schema des Modells), 40201 (das Guthaben reicht nicht), 40202 (ein Ausgabenlimit des Schlüssels oder das Plattformkontingent ist erreicht) oder 403 (dieser Schlüssel darf das Modell nicht verwenden).

Dieselbe Anfrage mit der Kostenschätzung absenden

Senden Sie innerhalb von fünf Minuten die unveränderte Anfrage an createTask, ergänzt um zwei Felder: quoteId aus der Kostenschätzung und expectedCost mit dem geschätzten estimatedCost. Dieser Schritt kostet Geld.

submit.json
{
  "model": "MODEL_ID_FROM_CATALOG",
  "input": { "prompt": "A cinematic night portrait" },
  "quoteId": "QUOTE_ID_FROM_RESPONSE",
  "expectedCost": "0.008"
}
SPICY_IDEMPOTENCY_KEY="$(uuidgen)"   # einmal pro neuem Task; nur wiederverwenden, um genau diese Anfrage erneut zu senden

curl https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  --data-binary @submit.json

Die Antwort ist die normale Task-Antwort 202 Accepted, wie im Schnellstart beschrieben. Die Kostenschätzung ersetzt den Idempotency-Key nicht: Senden Sie beides.

Die Kostenschätzung ist gebunden anSie gilt nicht mehr, wenn
Ihr Konto und den API-Schlüssel, mit dem sie angefordert wurdeSie mit einem anderen Schlüssel absenden
Genau diese Werte für model, input und callBackUrlSich einer davon ändert, und sei es nur ein Zeichen im Prompt. Reihenfolge der Felder und Leerzeichen spielen keine Rolle
Den Preis in diesem MomentFünf Minuten vergangen sind oder sich der Preis ändert

40901 heißt: Die Kostenschätzung passt nicht mehr zur Anfrage

Geänderte Eingaben, ein anderer API-Schlüssel, eine abgelaufene Kostenschätzung, ein geänderter Preis oder ein expectedCost, der von der Kostenschätzung abweicht: Alles zeigt sich auf dieselbe Weise, die Annahme scheitert mit 40901, und es wird nichts berechnet. Holen Sie eine neue Kostenschätzung ein und bestätigen Sie erneut. Entfernen Sie nicht quoteId und expectedCost, um die Anfrage ohne bestätigten Preis durchzudrücken.

POST /api/v1/jobs/stream, der native Textstream, nimmt eine Kostenschätzung auf dieselbe Weise an; siehe Text und Streaming.

Nach einer verlorenen Antwort weitermachen

Ist eine Übermittlung in ein Timeout gelaufen oder die Verbindung abgebrochen, wissen Sie nicht, ob sie angenommen wurde. Für createTask, retry und POST /v1/videos gilt:

  1. Senden Sie die ursprüngliche Anfrage mit ihrem ursprünglichen Idempotency-Key und demselben API-Schlüssel erneut. Sie erhalten den ursprünglichen Task in seinem aktuellen Zustand zurück und zahlen nicht doppelt.
  2. Legen Sie keinen weiteren Task mit einem neuen Idempotenzschlüssel an. Ein neuer Idempotenzschlüssel bedeutet eine neue Generierung und eine neue Belastung.
  3. Das erneute Senden einer bereits angenommenen Anfrage bleibt gültig, auch wenn die Kostenschätzung inzwischen abgelaufen ist. Der Ablauf entscheidet nur über die Annahme, nicht über den Task, der bei der Annahme entstanden ist.
  4. Ein 409 bedeutet nicht „nicht angelegt“. Entweder hat sich die Anfrage geändert (dann ist es ein neuer Arbeitsauftrag, der einen neuen Idempotenzschlüssel braucht), oder sie wurde mit einem anderen API-Schlüssel desselben Kontos gesendet (dann senden Sie sie mit dem ursprünglichen API-Schlüssel erneut). Siehe Idempotenz.
  5. Die endgültige Belastung lesen Sie aus cost und settled in recordInfo.

Text- und Streaming-Anfragen lassen sich so nicht wiederherstellen

Die Antwort auf eine Textanfrage (/api/v1/jobs/stream sowie die Textendpunkte unter /v1 und /v1beta) wird Ihnen zugeschickt, während sie entsteht, und nicht gespeichert. Senden Sie einen bereits angenommenen Idempotenzschlüssel erneut, erhalten Sie statt der Antwort einen Fehler: 400 bei gleichem Body, 409 bei anderem Body. Zusätzlich berechnet wird nichts, aber die verlorene Antwort lässt sich nicht mehr abrufen. Um erneut eine Antwort zu erhalten, senden Sie die Anfrage mit einem neuen Idempotenzschlüssel und bezahlen dafür. Siehe Welche Endpunkte den Header auswerten.

Eine Schätzung ist keine Abrechnung

estimatedCost ist das, was wir voraussichtlich berechnen. Eine Endmarkierung in einem Stream sagt nur, dass keine Bytes mehr ankommen. Keines von beiden beweist, dass die Belastung endgültig ist. Bei Tasks beweist das settled: true zusammen mit cost in recordInfo. Textaufrufe liefern keine Task-ID: Ihre Belastung finden Sie, indem Sie mit demselben API-Schlüssel die Tasks auflisten (GET /api/v1/jobs) oder in der Konsole unter Logs nachsehen. cost ist endgültig, sobald settled den Wert true hat.

Kostenschätzungen in den offiziellen Werkzeugen

CLI und MCP-Server holen vor jedem kostenpflichtigen Aufruf eine Kostenschätzung ein und fragen einen Menschen, sodass Sie diesen Schritt nicht selbst bauen müssen:

  • CLI: spicyapi tasks quote ermittelt den Preis einer Anfrage; spicyapi tasks create holt erneut eine Kostenschätzung ein, gibt den Betrag aus und fragt vor dem Anlegen nach. Siehe Kosten, Bestätigung und Sicherheit.
  • MCP: Der Assistent darf beliebig Kostenschätzungen einholen, doch das Anlegen eines Tasks fragt Sie über Ihren KI-Client, mit dem Preis. Siehe Kosten, Bestätigung und Sicherheit.
  • SDK: quoteTask liefert die Kostenschätzung; übergeben Sie deren quoteId und estimatedCost an createTask oder run.

Ein Agent darf nicht an Stelle des Nutzers bestätigen

Die Bestätigung gibt es, damit ein Mensch entscheidet. Ein Agent, der sie selbst beantwortet, oder ein Client, der alles automatisch freigibt, hat auf diesem Weg die einzige Ausgabengrenze beseitigt.

Text- und Videokompatibilität

SpicyAPI versteht für Textmodelle außerdem die Formate von OpenAI, Anthropic und Google Gemini und für Video das Format OpenAI Videos. Die vollständige Liste der Endpunkte steht in der API-Referenz; Anfragen, Streams und Fehler je Protokoll finden Sie unter Text und Streaming.

Basis-URL. Das OpenAI-Format verwendet https://api.spicyapi.ai/v1. Die SDKs von Anthropic und Google GenAI hängen /v1 bzw. /v1beta selbst an; tragen Sie bei ihnen deshalb https://api.spicyapi.ai als Basis-URL ein.

Zugangsdaten. Ein einziger API-Schlüssel für alle, im Header Authorization: Bearer. Der Header x-api-key, den das Anthropic-SDK verwendet, und der Header x-goog-api-key des Google-GenAI-SDK werden ebenfalls akzeptiert. Ein ?key= in der URL dagegen nie.

Modell. Wählen Sie ein exaktes Modell aus dem Live-Katalog. Ob Tools, Bildnachrichten und Generierungsoptionen funktionieren, hängt vom Schema dieses Modells ab, nicht vom gewählten Protokoll.

Antwortform. Jedes Protokoll liefert seine eigene Hülle, nicht den Plattform-Envelope {code, msg, data, request_id}.

Reasoning-Felder

Chatmodelle, die ihren Denkweg als Text ausgeben, können einen optionalen String in message.reasoning_content liefern, beim Streaming in delta.reasoning_content. Setzen Sie nach einem Tool-Aufruf fort, können Sie ihn in der zugehörigen Assistentennachricht mitsenden, sofern das Live-Schema des Modells das unterstützt.

usage.completion_tokens_details.reasoning_tokens beschreibt den Reasoning-Anteil, der in completion_tokens bereits enthalten ist; rechnen Sie ihn nicht noch einmal hinzu. Nicht jedes Modell liefert Reasoning-Text oder diese Token-Details.

Zwei Formen, die Sie vor dem Bauen kennen sollten

  • Responses erwartet die vollständige Unterhaltung in input. previous_response_id wird nicht unterstützt.
  • Videos nimmt JSON mit model, prompt, input_reference, seconds und size an; diese Felder werden auf die eigenen Felder des Modells abgebildet. Die zurückgegebene Video-id ist zugleich eine Task-ID, die recordInfo akzeptiert. Der Inhalts-Endpunkt des Videos leitet mit HTTP 302 auf eine kurzlebige signierte URL weiter.

Die Kompatibilitäts-APIs legen den Preis bei der Annahme fest

quoteId und expectedCost gelten nur für jobs/createTask und jobs/stream. /v1 und /v1beta verwenden den Preis, der bei Annahme der Anfrage gilt, und lehnen diese beiden Felder ab; auf diesem Weg gibt es also keine Preisbestätigung pro Aufruf. Muss ein Ablauf eine Kostengrenze bestätigen, verwenden Sie die native Task-API. Um alles zu begrenzen, was ein Schlüssel ausgeben kann, setzen Sie seine Tages-, Monats- und Gesamtlimits, wie unter Authentifizierung beschrieben.

Ein Streaming-Chatbeispiel mit den offiziellen Clients von OpenAI, Anthropic und Google finden Sie unter Ein offizielles SDK verwenden. CLI und MCP-Server senden native Tasks ab und verfolgen sie; Chat-Tokens streamen sie nicht.

Auf dieser Seite