Zum Hauptinhalt springen

Face Swap Plus ist SpicyAPIs Gesichtstausch für Bilder, der den Hautton beider Fotos automatisch angleicht und entscheidet, ob nur das Gesicht oder der ganze Kopf eingefügt wird. Ausgabe als PNG, JPEG oder WebP, mit optionalem Seed.

Ab $0.16/Bild

Playground

Anfrage senden

Schnellstart

Die Beispiele verwenden die öffentlichen Parameter des gewählten Endpunkts. Ersetzen Sie API-Schlüssel und Beispielmedien und senden Sie die Anfrage von Ihrem Server.

SDKs & Integrationen
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

API-Authentifizierung

Bewahren Sie den API-Schlüssel serverseitig in der Umgebungsvariablen SPICY_API_KEY auf. Verwenden Sie Bearer-Authentifizierung und für JSON-Anfragen Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
Face Swap Plus · Image Editing · Beispielergebnis
BeispielergebnisBeispiel übernehmen
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST 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" \
  -d '{
  "model": "spicyapi/face-swap-v1-plus/edit",
  "input": {
    "image_url": "https://example.com/reference.png",
    "output_format": "jpeg",
    "reference_image_url": "https://example.com/reference.png"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Erzeugt aus dem Eingabeschema dieses Modells – genau dem, gegen das die API jede Anfrage prüft.

Eingabeparameter

Diese Felder gehören in das input-Objekt des Request-Bodys. Namen und Typen entsprechen der API. Wo kein Standardwert angegeben ist, dürfen Sie auch keinen annehmen.

reference_image_urlstringErforderlich

Das Bild, das die Gesichtszüge liefert. Der Hautton wird für Sie angeglichen, die Lichtrichtung nicht – eine von der anderen Seite beleuchtete Referenz hinterlässt weiterhin eine sichtbare Kante am Kiefer. Ihr eigener Bildausschnitt, ihr Hintergrund und ihre Garderobe bleiben unbeachtet, gelesen wird nur das Gesicht, und ein größeres, schärferes Gesicht an dieser Stelle ist der größte Qualitätshebel.

Standardwert
Nicht festgelegt
Einschränkungen
minLength:1
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
image_urlstringErforderlich

Das Bild, das verändert wird. Pose, Garderobe, Licht und Hintergrund dieser Person bleiben erhalten; ersetzt wird die Kopfpartie, und wie weit diese Mischung reicht – nur das Gesicht oder der ganze Kopf – wird je Paar entschieden statt über eine Einstellung. Ein klar sichtbares Gesicht pro Bild, einigermaßen frontal und groß genug, damit die Züge lesbar sind; schneiden Sie ein Gruppenfoto vorher zu. JPEG, PNG oder WebP unter einer URL, die ohne Anmeldung auflöst und noch erreichbar ist, wenn der Task läuft.

Standardwert
Nicht festgelegt
Einschränkungen
minLength:1
contentMediaType:["image/jpeg","image/png","image/webp","image/gif"]
seedintegerOptional

Verwenden Sie denselben Seed erneut, um zwei Läufe über dasselbe Bildpaar gegen eine identische Ziehung zu vergleichen, sodass sich nur das eine Geänderte bewegt. Das ist ein Vergleichswerkzeug, keine Garantie für ein identisches Ergebnis. Leer lassen für eine frische Ziehung, was im Produktivbetrieb meist das Richtige ist.

Standardwert
Nicht festgelegt
Einschränkungen
minimum:0
maximum:2147483647
output_qualityintegerOptional

Angeforderte Bildqualität des Ergebnisses, von 10 bis 100 (Standard 95). Am Preis ändert es nichts.

Standardwert
95
Einschränkungen
minimum:10
maximum:100
output_formatstringOptional

Das Dateiformat des zurückgegebenen Bildes. Ohne Angabe wird JPEG verwendet; nehmen Sie PNG, wenn Sie eine verlustfreie Datei weiterbearbeiten wollen, und WebP, wenn das Ergebnis direkt ins Web geht. Alle drei zählen als ein Ausgabebild, die Wahl ändert den Preis also nie – nehmen Sie, was Ihre Pipeline erwartet, statt später zu konvertieren und eine Neukodierung zu bezahlen.

Standardwert
"jpeg"
Zulässige Werte
"png""jpeg""webp"
promptstringOptional

Optional – bauen Sie aber so, als gäbe es das Feld nicht. Das Modell nimmt es an, doch fünf echte Aufrufe am 20.09.2026 (zweimal Sonnenbrille, einmal andere Frisur, zweimal anderer Ausdruck) kamen allesamt ununterscheidbar von derselben Anfrage mit leerem Feld zurück. Dabei gibt es weder Fehler noch Warnung, ein Aufruf, der sich darauf stützt, sieht also erfolgreich aus. Lassen Sie es weg.

Standardwert
Nicht festgelegt
Einschränkungen
maxLength:200

Auftrag verfolgen

HTTP 202 bestätigt die Annahme, nicht den Abschluss. Speichern Sie die zurückgegebene taskId und fragen Sie diesen Auftrag ab. Erstellen Sie währenddessen keinen weiteren Auftrag.

Antwort bei Annahme
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

Diese Antwort enthält bereits die Kostenschätzung, damit Ihre Anwendung in Auftragsverlauf und Abrechnung denselben Betrag anzeigen kann.

Auftrag abrufen
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Beginnen Sie mit etwa 2 Sekunden Abstand und verlängern Sie das Intervall schrittweise. Bei einem Endzustand hören Sie auf. Nach einem Verbindungsfehler fragen Sie dieselbe taskId ab. Neu anlegen nur mit demselben Idempotency-Key und demselben Request-Body.

Oder den Rückruf zu Ihnen kommen lassen
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Übergeben Sie callBackUrl beim Anlegen der Aufgabe, dann wird Ihnen der fertige Datensatz per POST zugestellt — ganz ohne Polling-Schleife. Jede Zustellung trägt X-Webhook-Timestamp, X-Webhook-Signature und X-Webhook-Payload-Version. Die Signatur ist ein base64-HMAC-SHA256 über taskId.timestamp.sha256(body) und muss deshalb gegen die Rohbytes geprüft werden: Wer das JSON parst und neu serialisiert, verändert sie, und die Prüfung schlägt fehl. Fehlgeschlagene Zustellungen werden wiederholt, dieselbe taskId kann also zweimal ankommen — machen Sie den Handler idempotent. Antworten Sie zuerst mit 2xx und arbeiten Sie danach; ein langsamer Handler gilt als fehlgeschlagene Zustellung.

Ergebnis auslesen

Lesen Sie output erst aus, wenn state den Wert succeeded hat. Nutzen Sie bei Fehlern errorCode, errorMessage und request_id zur Diagnose. Beispielkosten und -zustände bilden keine tatsächliche Abrechnung ab.

Beispiel einer fertigen Antwort
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "spicyapi/face-swap-v1-plus/edit",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.png",
          "mime": "image/png",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.png?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Verfügbare Dateien lassen sich direkt über assets[].url ohne API-Authorization-Header öffnen oder herunterladen. Der signierte Link läuft zu expiresAt ab. Fragen Sie den Auftrag innerhalb der Aufbewahrungsfrist erneut ab, um den Link zu erneuern. Noch ausstehende oder nicht verfügbare Dateien haben keine URL. Behandeln Sie signierte Links vertraulich.

SDKs & Integrationen

Nutzen Sie SpicyAPI in Ihrer App, im Terminal, mit KI-Assistenten oder in visuellen Workflows. Wählen Sie die passende Anleitung.

In ComfyUI nutzen

Installieren Sie die SpicyAPI-Nodes über den ComfyUI Manager oder mit dem Befehl unten und suchen Sie auf der Arbeitsfläche nach Face Swap Plus · Image Editing. Der Node bietet dieselben Optionen wie diese Seite und zeigt seinen Preis, bevor er läuft.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi