Web API
We wrote an example Python script here that illustrates how to interface with our API.
We've also created a simple React app implementation on GitHub to help people with a quicker/easier implementation.
Link here: https://github.com/Kaedim/API_Implementation
Credentials
To use the Kaedim API, you will need a devID, an API-key, and a refresh token. If you are part of a studio, you will also need to provide a studioID with some API requests.
You can find all three of these by logging in to the web app at https://app.kaedim3d.com and navigating to Settings > API Keys. There you should be able to see all the necessary info.
If your keys are not working for any reason, don’t hesitate to contact us at [email protected].

Step 1: Registering a webhook
To register a webhook endpoint you will need your API key and developer ID. Both of these can be found under your user settings page in the Kaedim app.
Your API key should always be provided in the X-API-Key Header in your requests.
Parameters
X-API-Key
Required
Head
String
User API key used to authenticate requests
devID
Required
Body
String
Your developer ID
destination
Required
Body
String
Your webhook endpoint url
import fetch from "node-fetch"
const url = "https://api.kaedim3d.com/api/v1/registerHook"
const headers = {
"Content-Type": "application/json",
"X-API-Key": "your_api_key"
}
const body = {
"devID": "your_dev_id",
"destination": "your_endpoint_url"
}
try {
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then((res) => {
res.json().then((data) => {
console.log(data);
});
});
} catch (e) {
}
201 Response
{
"status": "success",
"message": "Webhook already registered"
"jwt" : "eyJhbGciOiJIUzI1…"
}
404 Response
{
"status": "error",
"message": "User does not exist"
}
Upon successful authentication you will receive a JWT, which needs to be added as a Bearer Token header on all processing requests. You will also receive a refreshToken to be used to generate a new JWT. Your JWT will expire after 12 hours. See below on how to refresh your token.
Step 2: Processing an image
All processing requests must include the JWT in the Bearer Authorization header, alongside your API-key, and your devID inside the request body.
Post processing request
Parameters
X-API-Key
Required
Head
String
User API key used to authenticate requests
imageUrls/images
Required
Body
Array
width
optional
Body
Number
Desired width in cm
depth
optional
Body
Number
Desired depth in cm
projectID
optional
Body
String
The ID of the style you want this asset to have, if none it can be left null
studioID
optional
Body
String
Your team's studioID
const url = "https://api.kaedim3d.com/api/v1/process"
const headers = {
"Content-Type": "multipart/form-data",
"X-API-Key": "your_api_key",
"Authorization": "your_JWT"
}
const data = {
"devID": "your_dev_id",
"LoQ": "standard",
"imageUrls": ["https://example.com/image1.png","https://example.com/image2.png"],
"polycount": 20000,
"height": 250,
"test": true // Turn this to false to pass a normal request
}
const json = JSON.stringify(data);
try {
fetch(url, {
method: "POST",
headers,
body:json,
}).then((res) => {
res.json().then((data) => {
console.log(data);
});
});
} catch (e) {
}
201 Response
{
"status": "success",
"devID": "ad39dg02-dief-as9i-ade0-g159g298ck6s",
"requestID": "1248947ds7an-ad98q3yhans92S-2Asda9212",
"message" : "request sent successfully, please check webhook in 10-15 mins"
}
400 Response
{
"status": "error",
"message" : "Request failed due to {reason}, please check your payload and headers and try again"
}
406 Response
{
"status": "error",
"message" : "Invalid level of quality inputed"
}
Once the asset has been successfully generated, a download URL will be sent to the registered webhook endpoint.
Please note that you will need to perform a GET request on the URLs to get the file containing the completed asset
Each completed asset is available in 4 supported formats: obj, fbx, glb, and gltf all of which have separate download links in the post request.
Download links expire after an hour
We provide the functionality to fetch all requests
Upon successful generation, you will receive a response similar to the following:
201 Response
{
"status": "success",
"userID" : KaedimUser,
"requestID": "1248947ds7an-ad98q3yhans92S-2Asda9212",
"results" : {
"obj": "https://....."
"fbx": "https://....."
"glb": "https://....."
"gltf": "https://....."
}
}
400 Response
{
"status": "error",
"requestID": "1248947ds7an-ad98q3yhans92S-2Asda9212",
"message" : "Asset creation failed"
"cause" : "The request was too complex, we aim to deal with…"
}
Asset creation may fail due to various reasons some of which include: complexity, visibility of the object, multiple objects in the scene, inappropriate content, etc. Please see our guidelines for more information: Input Guidelines
Other useful routes
Check the progress and results of your generation
We provide functionality to check the progress of your generation based on the requestID
Parameters
X-API-Key
Required
Head
String
User API key used to authenticate requests
Authorization
Required
Head
String
Your valid JWT
devID
Required
GET Param
String
Your developer ID
requestID
Required
GET Param
String
The requestID of the asset you'd like to fetch
studioID
Optional
GET Param
String
Your team's studioID
const url = `https://api.kaedim3d.com/api/v1/fetchRequest?devID=${devID}&requestID=${requestID}`
const headers = {
"Content-Type": "application/json",
"X-API-Key": "your_api_key",
"Authorization": "your_JWT"
}
try {
fetch(url, {
method: "GET",
headers,
}).then((res) => {
res.json().then((data) => {
console.log(data);
});
});
} catch (e) {
}
200 Response
{
"requestID": "81...236",
"createdAt": "202...",
"image": [
"https://s...",
],
"image_tags": [],
"iterations": [
{
"createdAt": "2023-0...",
"iterationID": "0",
"results": {
"obj": "https://s...",
"fbx": "https://s...",
"glb": "https://s...",
"gltf": "https://s...",
"mtl": "https://s...",
},
"status": "completed",
"userID": "b6e...",
"email": "mar...",
"loq": "standard",
"dismissedReason": null,
"editDescription": null,
"texturingMethod": null
}
, ...]
}
Get All Assets
We provide functionality to retrieve all asset requests (even if they’re pending) based on date ranges (if provided).
Parameters
start,end
Optional
GET Param
String
Date range provided in MM-DD-YYYY. If left blank all assets associated to the devID will be returned
studioID
Optional
GET Param
String
Your team's studioID
const devID = "your-devID";
const start = "2022-02-01"; // yyyy-mm-dd
const end = "2022-02-14";
const url = `https://api.kaedim3d.com/api/v1/fetchAll?devID=${devID}&start=${start}&end=${end}`
const headers = {
"X-API-Key": "your_api_key",
"Authorization": "your_JWT"
}
try {
fetch(url, {
method: "GET",
headers,
}).then((res) => {
res.json().then((data) => {
console.log(data);
});
});
} catch (e) {
}
200 Response
{
"assets": [
{
"requestID": "81...236",
"createdAt": "202...",
"image": [
"https://s...",
],
"image_tags": [],
"polycount": "20000",
"iterations": [
{
"createdAt": "2023-0...",
"iterationID": "0",
"results": {
"obj": "https://s...",
"fbx": "https://s...",
"glb": "https://s...",
"gltf": "https://s...",
"mtl": "https://s...",
},
"status": "completed",
"userID": "b6e...",
"email": "mar...",
"loq": "standard",
"dismissedReason": null,
"editDescription": null,
"texturingMethod": null
}
]
},...
]
}
400 Response
{
"status": "error",
"message" : "DevID is required, please make sure you are sending as a query parameter"
}
Get All Projects
We provide functionality to retrieve all asset projects names and IDs
const devID = "your-devID";
const url = `https://api.kaedim3d.com/api/v1/fetchProjects?devID=${devID}`
const headers = {
"X-API-Key": "your_api_key",
"Authorization": "your_JWT"
}
try {
fetch(url, {
method: "GET",
headers,
}).then((res) => {
res.json().then((data) => {
console.log(data);
});
});
} catch (e) {
}
200 Response
{
"status":"success",
"message": [
{
"projectID": "81...236",
"name": "Sandbox",
"studioID": "ad29cegh-adks-344j-htk4-aajs-6117d0jeddn5"
},...
]
}
Refreshing a JWT
Your web token will expire after 12 hours from its creation. You can only have one JWT valid at a time, therefore creating a new JWT will automatically invalidate the old token. To get a new JWT you must use the refresh token generated at webhook registration. You can find the refresh token in user settings in the Kaedim platform below the API-key.
Post a refresh request in node.js
If successful, you will receive a new JWT that will allow you to make API requests that require authentication (such as /process etc.)
Parameters
X-API-Key
Required
Head
String
User API key used to authenticate requests
refresh-token
Required
Head
String
Token used to generate more JWT’s
devID
Required
Body
String
Your developer ID
const url = "https://api.kaedim3d.com/api/v1/refreshJWT"
const headers = {
"Content-Type": "application/json",
"X-API-Key": "your_api_key",
"refresh-token": "your-refresh-token"
}
const body = {
"devID": "your_dev_id",
}
try {
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then((res) => {
res.json().then((data) => {
console.log(data);
});
});
} catch (e) {
}
200 Response
{
"status": "success",
"message": "JWT refreshed successfully. Please use the new JWT and devID to authenticate your future requests",
"jwt": "eyJhaU.....",
"devID": "609d43109ff0b252cce4bc6e"
}
400 Response
{
"status": "error",
"requestID": "1248947ds7an-ad98q3yhans92S-2Asda9212",
"message" : "Request failed, please check your api-key and refresh-token and try again"
"cause": "...."
}
Error Codes
We use normal HTTP codes to indicate the success or failure of your API requests. If your request fails, Kaedim will return an appropriate error message.
Status
String
Short string describing the status of the request. Generally "success" or "error".
Message
String
Short human-readable string giving more context on the reason the error occurred.
Last updated
Was this helpful?