Skip to main content
ADC design tracks your linker-payload combinations under a therapeutic candidate and runs a rule-based developability assessment. The analysis is sequence-based by default; pass a structure job ID to include SASA-based conjugation-site accessibility. Analysis runs synchronously and costs no credits.

Browse the catalogue

The catalogue lists known payloads (MMAE, DXd, DM1, …) and linkers (mc-vc-PAB, …) with their SMILES strings. Use it to pick names when creating a design.
from kallima import KallimaClient

client = KallimaClient(api_key)

catalogue = client.adc_designs.catalogue()

for name, payload in catalogue["payloads"].items():
    print(name, payload.get("smiles", ""))

for name, linker in catalogue["linkers"].items():
    print(name, linker.get("type", ""))

Create a design

Designs live under a therapeutic candidate, not a variant. One candidate can have multiple designs representing different linker-payload combinations.
design = client.adc_designs.create(
    candidate_id=candidate_id,
    name="MMAE + mc-vc-PAB",
    linker_name="mc-vc-PAB",
    linker_type="cleavable_peptide",
    payload_name="MMAE",
    payload_class="auristatin",
    conjugation_method="cysteine_engineered",
    conjugation_site="S239C",
    dar_target=4,
)

design_id = design["id"]
Required fields: candidate_id, name, linker_name, linker_type, payload_name, conjugation_method. Everything else is optional but improves analysis coverage.

Run developability analysis

result = client.adc_designs.run_analysis(design_id)
The result is persisted to the design’s analysis field — subsequent get() calls return the cached value without re-running.

With structure-based site accessibility

Pass a completed structure prediction job ID to add SASA-based analysis of your conjugation site:
structure_job = client.structure_predictions.submit(variant_id=variant_id)
structure_job.wait(timeout=300)

result = client.adc_designs.run_analysis(
    design_id,
    structure_job_id=structure_job.id,
)
Without structure_job_id, only sequence-level rules run.

Read the analysis result

design = client.adc_designs.get(design_id)
analysis = design["analysis"]  # null until run_analysis() is called

print(analysis["conjugation"]["method"])
print(analysis["conjugation"]["expected_dar"])
print(analysis["conjugation"]["site_heterogeneity"])
print(analysis["conjugation"]["stability"])
The analysis dict contains assessments across conjugation chemistry, payload class, linker stability, and (if structure was provided) site accessibility. Each assessment includes a risk level and a rationale string.

List designs for a candidate

for design in client.adc_designs.list(candidate_id=candidate_id):
    print(design["id"], design["name"], design["conjugation_method"])

Compare designs

designs = list(client.adc_designs.list(candidate_id=candidate_id))

for d in designs:
    d = client.adc_designs.get(d["id"])  # fetch to get analysis field
    analysis = d["analysis"] or {}
    conj = analysis.get("conjugation", {})
    print(f"{d['name']:30s}  DAR target: {d.get('dar_target')}  "
          f"site heterogeneity: {conj.get('site_heterogeneity', 'n/a')}")

Delete a design

client.adc_designs.delete(design_id)