Menu
View Categories

Webhooks

We send HTTP POST webhooks when job events occur. Each webhook request
is signed using HMAC-SHA256.

Events

Event NameDescription
job.createdTriggered when a job is created
inference.completedTriggered when an inference is completed
job.completedTriggered when a job is completed

Request Details

Method : POST

Content-Type : application/json

Headers:

  • X-Signature : sha256=

Payload Format

json

{
    "event": "job.created | inference.completed | job.completed",
    "data": {
        "job_id": "string"
    }
}
  

Signature Verification (Python)

IMPORTANT: Always use the RAW request body.

python

import hmac
import hashlib
expected_signature = hmac.new(WEBHOOK_SECRET.encode(), request.body, hashlib.sha256).hexdigest()
received_signature = request.headers["X-Signature"].replace("sha256=", "")
if not hmac.compare_digest(expected_signature, received_signature):
    raise Exception("Invalid webhook signature")

  

Django Callback Example

python

import json
import hmac
import hashlib
from django.http import JsonResponse, HttpResponseForbidden
from django.views.decorators.csrf import csrf_exempt
WEBHOOK_SECRET = "your_shared_secret_here"
@csrf_exempt
def webhook_callback(request):
    raw_body = request.body
    signature = request.headers.get("X-Signature", "").replace("sha256=", "")
    expected = hmac.new(WEBHOOK_SECRET.encode(), raw_body, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(expected, signature):
        return HttpResponseForbidden("Invalid signature")
    payload = json.loads(raw_body.decode())
    event = payload.get("event")
    if event == "job.created":
        job_id = payload.get("data", {}).get("job_id")
        print("Job created:", job_id)
    elif event == "job.completed":
        job_id = payload.get("data", {}).get("job_id")
        print("Job completed:", job_id)
    return JsonResponse({"status": "ok"})