Web Hooks
Creating a webhook endpoint is the same as creating any other page on your website. It’s an HTTP or HTTPS endpoint on your server with a URL. Please ensure that your endpoint is HTTPS when setting it up.
Set up an HTTP endpoint on your server that can accept webhook requests with a POST method. For example, this URL route in Flask maps to a Python webhook function: How do I receive webhook data?
Authenticate a user (Authentication Flow)
Make sure your webhook URL is correct
🎉 That’s it!
Webhook Signing
Kaedim will, in all requests made to your webhook, include a header kaedim-signature, which will contain a hash value unique to the request and developer ID.
The signature secret - KAEDIM SECRET - can be found in user settings next to your developer ID and API-key and can be reset at any time.
Make sure to use utf-8 encoding for the payload, and to use HEX digest for the hashing function
const secret = "Api-Secret";
const payload = JSON.stringify(response.body);
console.log(response.body.result);
const devID = response.body.results.devID;
const signature = JSON.parse(response.headers["kaedim-signature"]);
/* {
t : 1235678,
v1:80e62bdd6bddf54905d3cd6e13940626e16aedd....
}*/
const checkSignature = crypto
.createHmac("sha256", secret)
.update(`${signature.t}${payload}`)
.digest("hex");
if (
crypto.timingSafeEqual(
Buffer.from(signature.v1),
Buffer.from(checkSignature)
)
) {
// Authenticity confirmed
console.log("SUCCESS");
} else {
// Reject response
console.log("FAIL");
}
Your endpoint will receive requests. These will have a type that can be sculpt, generation, unwrap, texture, rig, or lod. It will also have a status that can be new, completed, approved, dismissed, or uploaded. There will also be two boolean flags isRevision and assetComplete.\
{
results: {
status: 'uploaded',
userID: '94d... ',
studioID: null,
requestID: '927... ',
iterationID: 2,
name: '',
image: 'https://... ',
type: 'generation',
isRevision: false,
createdAt: '2025-02-22T05:49:57.000Z',
completedAt: null,
assetComplete: false,
completedModels: {
fbx: 'https://... ',
glb: 'https://... ',
mtl: 'https://... ',
obj: 'https://... ',
usd: 'https://... ',
gltf: 'https://... ',
},
devID: '94d... '
}
}
Last updated
Was this helpful?