Webhook'lar
Bir Direct API üretimi bittiğinde imzalı bir bildirim alın, imzayı doğrulayın ve ayrıntılar için üretimi okuyun.
Webhook, bir üretim son durumuna ulaştığında Morphic'in çağırdığı, size ait bir HTTPS uç noktasıdır. Teslimatlar imzalanır, yaklaşık bir gün boyunca yeniden denenir ve günlüğe kaydedilir. Her olay yalın bir bildirimdir: hangi üretimin bittiğini ve nasıl bittiğini söyler; varlıkları, faturalandırması ve hata mesajı için üretimi anahtarınızla okursunuz.
Bir uç nokta kaydedin
POST /v1/direct/webhooks, generations:write kapsamını gerektirir.
curl -s https://mcp.morphic.com/v1/direct/webhooks \
-H "Authorization: Bearer $MORPHIC_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://hooks.example.com/morphic",
"events": ["generation.succeeded", "generation.failed", "generation.cancelled"],
"description": "Production order pipeline"
}'| Alan | Kurallar |
|---|---|
url | herkese açık bir ana bilgisayarda HTTPS (IP adresi, özel veya yerel adres olamaz), en fazla 2.048 karakter |
events | bir veya daha fazla olay türü |
description | isteğe bağlı, en fazla 200 karakter |
Yanıt 201 olur:
{
"webhook": {
"id": "01929a10-0c3d-7f44-8a21-0b1c2d3e4f50",
"url": "https://hooks.example.com/morphic",
"events": ["generation.succeeded", "generation.failed", "generation.cancelled"],
"description": "Production order pipeline",
"created_at": "2026-10-25T08:00:00.000Z",
"signing_secret": "whsec_4b1e…"
}
}signing_secretyalnızca bu yanıtta gösterilir. API anahtarını sakladığınız gibi saklayın.- Gizli anahtarı yenilemek için yeni bir uç nokta kaydedin, çağrılarınızı onun kimliğine geçirin, ardından eskisini silin.
- Bir kuruluş en fazla 10 uç nokta tutabilir.
Uç noktaları yönetin
| İstek | Kapsam | İşlevi |
|---|---|---|
GET /v1/direct/webhooks | assets:read | uç noktaları gizli anahtarları olmadan { "webhooks": [ … ] } olarak listeler |
DELETE /v1/direct/webhooks/{webhook_id} | generations:write | uç noktayı kaldırır; ona yönelik bekleyen teslimatlardan vazgeçilir |
Bir çağrıya uç nokta ekleyin
Araç çağrısının gövdesinde webhook_id iletin. O çağrının başlattığı her üretim, uç noktanın abone olduğu bir son duruma ulaştığında o uç noktaya teslim edilir. webhook_id içermeyen çağrılar webhook göndermez.
Videoyu Morphic'in sunucularında render eden araçlar (video_compose, video_* dönüşümleri ve burn_subtitles) henüz webhook_id kabul etmez; üretimlerini yoklayın.
Olay türleri
| Olay | Ne zaman gönderilir |
|---|---|
generation.succeeded | üretim çıktıyla tamamlandığında |
generation.failed | üretim başarısız olduğunda; ücreti iade edilir |
generation.cancelled | üretim iptal edildiğinde; ücreti iade edilir |
- Her üretim en fazla bir olay oluşturur.
queuedvein_progressteslim edilmez; bunlara ihtiyacınız varsa yoklama yapın.- Bir üretim, başladıktan sonra 72 saat boyunca izlenir. Daha geç biten bir üretim olay göndermez, bu yüzden onu okuyun.
Teslimat
POST /morphic HTTP/1.1
Host: hooks.example.com
Content-Type: application/json
User-Agent: Morphic-Webhooks/1.0
Morphic-Event-Id: 0192a7c0-5d4e-7b3a-8c2d-1e0f9a8b7c6d
Morphic-Delivery-Id: 0192a7c0-6e5f-7c4b-9d3e-2f1a0b9c8d7e
Morphic-Event-Type: generation.succeeded
Morphic-Signature: t=1792919741,v1=5f8a0c…e21b
{
"id": "0192a7c0-5d4e-7b3a-8c2d-1e0f9a8b7c6d",
"type": "generation.succeeded",
"created_at": "2026-10-25T09:15:42.410Z",
"api_version": "v1",
"data": {
"generation": {
"object": "generation",
"id": "0192a7b3-a1c4-7e02-8f9d-1a2b3c4d5e6f",
"tool": "generate_video",
"status": "succeeded",
"completed_at": "2026-10-25T09:15:41.902Z",
"error_code": null,
"metadata": { "order_id": "4411" }
}
}
}data.generation yalnızca şu alanları taşır:
| Alan | Anlamı |
|---|---|
object, id, tool, status, completed_at, metadata | üretim nesnesindeki gibi |
error_code | null veya failed durumundaki bir üretimin kodu |
Bir olay hiçbir zaman çıktıları, bağlantıları, faturalandırmayı, modeli veya hata mesajını taşımaz; böylece yanlış yere ya da bir günlüğe düşen bir teslimat hiçbir şey açığa çıkarmaz. Olayı aldığınızda üretimi anahtarınızla okuyun: GET /v1/direct/generations/{id} veya birden fazlası için toplu okuma. Bir olay gönderildiğinde faturalandırmasında artık hiçbir değişiklik beklenmez, dolayısıyla bu okuma kesindir.
| Başlık | Anlamı |
|---|---|
Morphic-Event-Id | olayın kimliği, her yeniden denemede aynıdır; tekilleştirmeyi buna göre yapın |
Morphic-Delivery-Id | bu tek deneme; her yeniden denemede farklıdır |
Morphic-Event-Type | gövdenin type değeri |
Morphic-Signature | t=<unix seconds>,v1=<hex HMAC-SHA256> |
Bir olay genellikle üretim son durumuna ulaştıktan sonra yaklaşık bir dakika içinde gönderilir. Gerçek zamanlı bir akış değildir: beklediğiniz tek bir üretimde en düşük gecikme için onu uzun yoklamayla izleyin.
İmzayı doğrulayın
v1, {t}.{raw request body} dizesinin, uç noktanızın signing_secret değeriyle anahtarlanmış onaltılık HMAC-SHA256 değeridir.
- Başlığı
,karakterindentvev1olarak bölün. HMAC_SHA256(secret, t + "." + raw_body)değerini, herhangi bir JSON ayrıştırması veya yeniden serileştirmeden önce, aldığınız ham baytlar üzerinden hesaplayın.- Sabit zamanlı bir karşılaştırmayla
v1ile karşılaştırın. - Tekrar saldırılarını önlemek için
tşu andan 5 dakikadan fazla uzaksa teslimatı reddedin.
import crypto from 'node:crypto';
import express from 'express';
const app = express();
app.post('/morphic', express.raw({ type: 'application/json' }), (req, res) => {
const header = req.get('Morphic-Signature') ?? '';
const parts = Object.fromEntries(header.split(',').map((p) => p.split('=')));
const expected = crypto
.createHmac('sha256', process.env.MORPHIC_WEBHOOK_SECRET)
.update(`${parts.t}.${req.body}`)
.digest('hex');
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) <= 300;
const valid =
parts.v1?.length === expected.length &&
crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected));
if (!fresh || !valid) return res.sendStatus(400);
const event = JSON.parse(req.body);
enqueue(event); // process asynchronously, keyed by event.id
res.sendStatus(204);
});Doğrulanmamış bir uç nokta açık bir kapıdır: URL'sini öğrenen herkes size bir üretimin bittiğini söyleyebilir. Her imzayı doğrulayın ve 5 dakikadan eski bir zaman damgasını reddedin.
Yanıt verme ve yeniden denemeler
- 10 saniye içinde herhangi bir
2xxile yanıt verin, işi ondan sonra yapın. - Diğer her şey başarısız bir denemedir:
2xxolmayan bir durum, zaman aşımı, reddedilen bağlantı, TLS hatası. - Yönlendirmeler izlenmez; bir
3xxbaşarısız bir denemedir. - Sıra garanti edilmez ve bir olay birden fazla kez gelebilir. İşleyicinizi
Morphic-Event-Idveya bir üretimin en fazla bir olayı olduğundandata.generation.idüzerinde idempotent yapın.
Başarısız bir deneme şu sürelerden sonra yeniden denenir:
| Yeniden deneme | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Önceki denemeden sonraki bekleme | 1 dk | 5 dk | 15 dk | 1 sa | 3 sa | 6 sa | 12 sa |
Yedinci yeniden denemeden sonra, yani ilk denemeden yaklaşık 22 saat sonra, olaydan vazgeçilir. Üretimin kendisi bundan etkilenmez: onu GET /v1/direct/generations/{id} ile okuyun.
Teslimat günlüğü
GET /v1/direct/webhooks/{webhook_id}/events (assets:read kapsamı), uç nokta için en son 20 olayı, her biri gönderilen gövdenin tam haliyle ve her denemenin sonucuyla birlikte döndürür. Tek bir üretimin olayları için ?generation_id=… ekleyin.
{
"webhook_events": [
{
"id": "0192a7c0-5d4e-…",
"type": "generation.succeeded",
"generation_id": "0192a7b3-…",
"status": "delivered",
"created_at": "2026-10-25T09:15:42.410Z",
"payload": { "…": "the body that was sent" },
"attempts": [
{ "id": "0192a7c0-6e5f-…", "attempted_at": "2026-10-25T09:15:42.900Z", "response_status": 204, "duration_ms": 131, "error": null, "response_body_excerpt": null }
]
}
]
}Olay status değeri | Anlamı |
|---|---|
pending | henüz teslim edilmedi; denemeler sürebilir |
delivered | uç noktanız 2xx ile yanıt verdi |
abandoned | son yeniden deneme başarısız oldu veya uç nokta kaldırıldı |
skipped | uç nokta bu olay türüne abone değildi |
Webhook'lar daha ucuz ve daha hızlı sinyaldir, bir garanti değildir. Haber alamadığınız üretimler için güvenlik ağı olarak ara sıra yoklama yapmaya devam edin.
Herhangi bir sorun yaşarsanız ya da sorularınız olursa, bizimle iletişime geçmekten çekinmeyin. Yardım etmeye memnuniyet duyarız. Bize şu adresten yazın: support@morphic.com.
Üretimler
Bir Direct API üretimini uzun yoklamayla son durumuna kadar takip edin, birkaçını aynı anda okuyun ve ne zaman yoklama yapacağınızı bilin.
Krediler ve kullanım
Direct API çağrılarının nasıl ücretlendirildiği, kesinleştirildiği ve iade edildiği, bir işin önceden nasıl fiyatlandırılacağı ve anahtarınızın harcamasının ve defterinin nasıl okunacağı.