curl --request POST \
--url https://api.example.com/v1/adc-designs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"candidate_id": "c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b",
"conjugation_method": "cysteine_engineered",
"conjugation_site": "S239C",
"dar_target": 4,
"linker_name": "mc-vc-PAB",
"linker_type": "cleavable_peptide",
"name": "MMAE + vc",
"payload_class": "auristatin",
"payload_clogp": 4,
"payload_name": "MMAE"
}
'import requests
url = "https://api.example.com/v1/adc-designs"
payload = {
"candidate_id": "c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b",
"conjugation_method": "cysteine_engineered",
"conjugation_site": "S239C",
"dar_target": 4,
"linker_name": "mc-vc-PAB",
"linker_type": "cleavable_peptide",
"name": "MMAE + vc",
"payload_class": "auristatin",
"payload_clogp": 4,
"payload_name": "MMAE"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
candidate_id: 'c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b',
conjugation_method: 'cysteine_engineered',
conjugation_site: 'S239C',
dar_target: 4,
linker_name: 'mc-vc-PAB',
linker_type: 'cleavable_peptide',
name: 'MMAE + vc',
payload_class: 'auristatin',
payload_clogp: 4,
payload_name: 'MMAE'
})
};
fetch('https://api.example.com/v1/adc-designs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/adc-designs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'candidate_id' => 'c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b',
'conjugation_method' => 'cysteine_engineered',
'conjugation_site' => 'S239C',
'dar_target' => 4,
'linker_name' => 'mc-vc-PAB',
'linker_type' => 'cleavable_peptide',
'name' => 'MMAE + vc',
'payload_class' => 'auristatin',
'payload_clogp' => 4,
'payload_name' => 'MMAE'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/adc-designs"
payload := strings.NewReader("{\n \"candidate_id\": \"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b\",\n \"conjugation_method\": \"cysteine_engineered\",\n \"conjugation_site\": \"S239C\",\n \"dar_target\": 4,\n \"linker_name\": \"mc-vc-PAB\",\n \"linker_type\": \"cleavable_peptide\",\n \"name\": \"MMAE + vc\",\n \"payload_class\": \"auristatin\",\n \"payload_clogp\": 4,\n \"payload_name\": \"MMAE\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/adc-designs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"candidate_id\": \"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b\",\n \"conjugation_method\": \"cysteine_engineered\",\n \"conjugation_site\": \"S239C\",\n \"dar_target\": 4,\n \"linker_name\": \"mc-vc-PAB\",\n \"linker_type\": \"cleavable_peptide\",\n \"name\": \"MMAE + vc\",\n \"payload_class\": \"auristatin\",\n \"payload_clogp\": 4,\n \"payload_name\": \"MMAE\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/adc-designs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"candidate_id\": \"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b\",\n \"conjugation_method\": \"cysteine_engineered\",\n \"conjugation_site\": \"S239C\",\n \"dar_target\": 4,\n \"linker_name\": \"mc-vc-PAB\",\n \"linker_type\": \"cleavable_peptide\",\n \"name\": \"MMAE + vc\",\n \"payload_class\": \"auristatin\",\n \"payload_clogp\": 4,\n \"payload_name\": \"MMAE\"\n}"
response = http.request(request)
puts response.read_body{
"id": "dd11aa22-bb33-cc44-dd55-eeff66778899",
"candidate_id": "c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b",
"name": "<string>",
"linker_name": "<string>",
"linker_type": "<string>",
"payload_name": "<string>",
"conjugation_method": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"object": "adc_design",
"linker_smiles": "<string>",
"payload_smiles": "<string>",
"payload_class": "<string>",
"payload_clogp": 123,
"conjugation_site": "<string>",
"dar_target": 123,
"analysis": {},
"notes": "<string>"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}Register a new ADC design
Register an ADC design under a therapeutic candidate.
The design is a catalog record (linker + payload + conjugation
method); no compute runs at create time. Cross-org candidate_id
values return 404 before any write.
Plan gate. None — registering designs is free; plan gates apply
at compute time (POST /v1/adc-designs/{id}/analysis is free
today but may gate when payload/linker catalogues grow).
Cost: write — burns rate + quota. Does not debit credits.
curl --request POST \
--url https://api.example.com/v1/adc-designs \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"candidate_id": "c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b",
"conjugation_method": "cysteine_engineered",
"conjugation_site": "S239C",
"dar_target": 4,
"linker_name": "mc-vc-PAB",
"linker_type": "cleavable_peptide",
"name": "MMAE + vc",
"payload_class": "auristatin",
"payload_clogp": 4,
"payload_name": "MMAE"
}
'import requests
url = "https://api.example.com/v1/adc-designs"
payload = {
"candidate_id": "c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b",
"conjugation_method": "cysteine_engineered",
"conjugation_site": "S239C",
"dar_target": 4,
"linker_name": "mc-vc-PAB",
"linker_type": "cleavable_peptide",
"name": "MMAE + vc",
"payload_class": "auristatin",
"payload_clogp": 4,
"payload_name": "MMAE"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
candidate_id: 'c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b',
conjugation_method: 'cysteine_engineered',
conjugation_site: 'S239C',
dar_target: 4,
linker_name: 'mc-vc-PAB',
linker_type: 'cleavable_peptide',
name: 'MMAE + vc',
payload_class: 'auristatin',
payload_clogp: 4,
payload_name: 'MMAE'
})
};
fetch('https://api.example.com/v1/adc-designs', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.example.com/v1/adc-designs",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'candidate_id' => 'c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b',
'conjugation_method' => 'cysteine_engineered',
'conjugation_site' => 'S239C',
'dar_target' => 4,
'linker_name' => 'mc-vc-PAB',
'linker_type' => 'cleavable_peptide',
'name' => 'MMAE + vc',
'payload_class' => 'auristatin',
'payload_clogp' => 4,
'payload_name' => 'MMAE'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.example.com/v1/adc-designs"
payload := strings.NewReader("{\n \"candidate_id\": \"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b\",\n \"conjugation_method\": \"cysteine_engineered\",\n \"conjugation_site\": \"S239C\",\n \"dar_target\": 4,\n \"linker_name\": \"mc-vc-PAB\",\n \"linker_type\": \"cleavable_peptide\",\n \"name\": \"MMAE + vc\",\n \"payload_class\": \"auristatin\",\n \"payload_clogp\": 4,\n \"payload_name\": \"MMAE\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.example.com/v1/adc-designs")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"candidate_id\": \"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b\",\n \"conjugation_method\": \"cysteine_engineered\",\n \"conjugation_site\": \"S239C\",\n \"dar_target\": 4,\n \"linker_name\": \"mc-vc-PAB\",\n \"linker_type\": \"cleavable_peptide\",\n \"name\": \"MMAE + vc\",\n \"payload_class\": \"auristatin\",\n \"payload_clogp\": 4,\n \"payload_name\": \"MMAE\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.example.com/v1/adc-designs")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"candidate_id\": \"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b\",\n \"conjugation_method\": \"cysteine_engineered\",\n \"conjugation_site\": \"S239C\",\n \"dar_target\": 4,\n \"linker_name\": \"mc-vc-PAB\",\n \"linker_type\": \"cleavable_peptide\",\n \"name\": \"MMAE + vc\",\n \"payload_class\": \"auristatin\",\n \"payload_clogp\": 4,\n \"payload_name\": \"MMAE\"\n}"
response = http.request(request)
puts response.read_body{
"id": "dd11aa22-bb33-cc44-dd55-eeff66778899",
"candidate_id": "c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b",
"name": "<string>",
"linker_name": "<string>",
"linker_type": "<string>",
"payload_name": "<string>",
"conjugation_method": "<string>",
"created_at": "<string>",
"updated_at": "<string>",
"object": "adc_design",
"linker_smiles": "<string>",
"payload_smiles": "<string>",
"payload_class": "<string>",
"payload_clogp": 123,
"conjugation_site": "<string>",
"dar_target": 123,
"analysis": {},
"notes": "<string>"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}{
"code": "insufficient_credits",
"credit_balance": 0,
"credit_cost": 1,
"detail": "Humanization costs 1 credit; balance is 0.",
"instance": "/v1/jobs",
"request_id": "req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D",
"status": 402,
"title": "Insufficient credits",
"type": "https://docs.kallima.bio/errors/insufficient_credits"
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
Body for POST /v1/adc-designs.
Mirrors :class:app.schemas.adc.AdcDesignCreate but annotated for
the /v1 OpenAPI surface (examples, explicit descriptions). Cross-org
candidate_id values return 404 — no existence leak.
Therapeutic candidate this design attaches to. Must be owned by the caller's org; cross-org ids return 404.
"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b"
Short human label (e.g. MMAE + vc).
1 - 120"MMAE + vc"
Linker identifier. Free text — see GET /v1/adc-designs/catalogue for common named linkers but any string is accepted.
1 - 80"mc-vc-PAB"
Mechanism class. cleavable_* linkers release the payload in the endosome; non_cleavable_* require lysosomal degradation of the antibody.
cleavable_peptide, cleavable_disulfide, cleavable_ph, non_cleavable_thioether, non_cleavable_amide, self_immolative, custom Payload identifier (e.g. MMAE, DXd, DM1).
1 - 80"MMAE"
Attachment chemistry. cysteine_engineered and enzymatic methods (sortase, spytag) give the tightest DAR control.
lysine_native, cysteine_native, cysteine_engineered, sortase, spytag, other Optional SMILES string for the linker. Not validated.
Optional SMILES string for the payload.
Mechanistic class. Drives the rule-based analysis.
maytansinoid, auristatin, camptothecin_analog, calicheamicin, pbd_dimer, other Computed log P for the payload. Used to flag aggregation risk when linker+payload hydrophobicity combine.
Residue label for site-specific methods (e.g. S239C).
Target drug-to-antibody ratio. Analysis flags mismatches with payload tolerances.
1 <= x <= 20Optional freeform note shown alongside the design.
Response
Successful Response
An ADC design as returned by /v1.
Opaque design identifier (UUID).
"dd11aa22-bb33-cc44-dd55-eeff66778899"
Therapeutic candidate this design belongs to.
"c0f5e4b1-a7d2-4e0b-9f8c-1b2d3e4f5a6b"
ISO-8601 timestamp (UTC).
ISO-8601 timestamp (UTC).
Polymorphic discriminator. Always adc_design.
"adc_design"Cached analysis result, populated by POST /v1/adc-designs/{id}/analysis. null until the first run.