Skip to main content

Foundry API

Submit protein sequences for experimental characterization and retrieve results programmatically.
The Foundry API connects your computational pipeline to Adaptyv Bio’s protein testing platform. You submit sequences, the lab runs experiments, and you retrieve binding data, thermostability measurements, or expression levels via a simple webhook.

How to Connect

You or your agent can find all information via
curl https://foundry-api-public.adaptyvbio.com/api/v1/openapi.json
Every request aside from getting the openapi.json requires a bearer token:
curl https://foundry-api-public.adaptyvbio.com/api/v1/targets?limit=3 \
  -H "Authorization: Bearer $FOUNDRY_API_TOKEN"
Tokens are scoped to your organization and role. To obtain one, check the side bar on foundry.adaptyvbio.com. As always, store your token in an environment variable; do not commit it to source control.

What the API covers

The API exposes five resource groups. Together, they support the full experiment lifecycle: browse targets, submit sequences, track progress, and collect results. Targets: Browse our catalog of available target antigens programmatically. You can filter by name, vendor, or self-service availability. Targets for which we have a calibrated self-service price allow instant cost estimates and automated checkout. Experiments: Create experiments by specifying a target and one or more protein sequences. Five experiment types are available:
TypeWhat it measuresRequires target
screeningBinding yes/no against a target antigen (BLI or SPR)Yes
affinityBinding kinetics: K_D, k_on, k_off (BLI or SPR)Yes
thermostabilityMelting temperature via differential scanning fluorimetryNo
fluorescenceFluorescence intensity of protein variantsNo
expressionExpression yield of protein constructsNo
For more information about each see the experiment types documentation. Sequences: List, inspect, and add sequences to draft experiments. Each sequence is a single amino acid string; multi-chain formats (Fab heavy:light) use a colon separator. Results: Retrieve experimental data once the lab completes your run. Results include binding classifications, kinetic constants, melting temperatures, or expression levels, depending on experiment type. Quotes and invoices: Review pricing, confirm quotes, and access invoices for your experiments.

Experiment lifecycle

The diagram below shows how an experiment moves from draft to delivered results. You control the transitions on the left (create, submit, confirm); everything on the right happens in the lab. API status values and what they mean:
StatusWho actsWhat is happening
DraftYouExperiment is editable. No cost commitment.
WaitingForConfirmationAdaptyvUnder review; quote is being prepared.
QuoteSentYouQuote ready — review and confirm to proceed.
WaitingForMaterialsAdaptyvGene fragments and target antigen ordered.
InQueueAdaptyvMaterials arrived; queued for the lab.
InProductionAdaptyvAssay running.
DataAnalysisAdaptyvRaw data processing and QC.
InReviewAdaptyvFinal validation before release.
DoneYouResults available via the API.
CanceledEitherExperiment canceled (possible from Draft or WaitingForConfirmation).
You can poll status at any time with GET /experiments/{id}. The results_status field tells you whether results are none, partial, or all without fetching the full dataset. To receive push notifications instead of polling, pass a webhook_url when creating the experiment.

Quick example

This snippet creates a binding screen against a target from the catalog:
export FOUNDRY_API_URL="https://foundry-api-public.adaptyvbio.com/api/v1/openapi.json"
# 1. Find a target
curl "$FOUNDRY_API_URL/targets?search=EGFR&selfservice_only=true&limit=1" \
  -H "Authorization: Bearer $FOUNDRY_API_TOKEN"

# Response includes target_id, pricing, and catalog details
# 2. Create the experiment
curl -X POST "$FOUNDRY_API_URL/experiments" \
  -H "Authorization: Bearer $FOUNDRY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "EGFR Binding Screen — Round 3",
    "experiment_spec": {
      "experiment_type": "screening",
      "method": "bli",
      "target_id": "019a03da-b87f-7902-81d5-24da9754bdde",
      "sequences": {
        "candidate_1": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS",
        "candidate_2": "QVQLVQSGAEVKKPGASVKVSCKASGYTFTNYGISWVRQAPGQGLEWMGWISAYNGNTNYAQKLQGRVTMTTDTSTSTAYMELRSLRSDDTAVYYCARGGYSSSWYFDYWGQGTLVTVSS"
      }
    }
  }'

# Response:
# {
#   "experiment_id": "019d4a2b-...",
#   "experiment_code": "ORG-001-123",
#   "status": "draft",
#   "costs": { ... }
# }
# 3. Submit for processing
curl -X POST "$FOUNDRY_API_URL/experiments/019d4a2b-.../submit" \
  -H "Authorization: Bearer $FOUNDRY_API_TOKEN"
# 4. Check results (once the experiment reaches "done")
curl "$FOUNDRY_API_URL/experiments/019d4a2b-.../results" \
  -H "Authorization: Bearer $FOUNDRY_API_TOKEN"

Filtering and sorting

List endpoints accept filter, sort, and search query parameters. Filtering uses an s-expression syntax, in order to make it easier for you (and your agents) to compose complex filter conditions. Wrap the expression in the filter parameter:
GET /experiments?filter=eq(status,"draft")
GET /experiments?filter=and(eq(status,"done"),gte(created_at,"2026-01-01"))
Available operators: eq, neq, gt, gte, lt, lte, contains, between, in, is_null, is_not_null. Combine with and, or, not. Sorting uses asc(field) or desc(field):
GET /experiments?sort=desc(created_at)
GET /results?sort=asc(created_at),desc(binding_score)
Search is a free-text substring match on name fields:
GET /targets?search=HER2
Pagination uses limit (1—100, default 50) and offset as usual:
GET /experiments?limit=10&offset=20

Webhooks

Pass a webhook_url when creating an experiment to receive status-change notifications:
{
  "name": "Screen with webhook",
  "webhook_url": "https://your-server.com/foundry-hook",
  "experiment_spec": { ... }
}
The webhook delivers a POST with the experiment ID, previous status, and new status whenever the experiment transitions.

Cost estimates

Before committing to an experiment, you can get a cost estimate:
curl -X POST "$FOUNDRY_API_URL/experiments/cost-estimate" \
  -H "Authorization: Bearer $FOUNDRY_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "experiment_spec": {
      "experiment_type": "screening",
      "method": "bli",
      "target_id": "019a03da-b87f-7902-81d5-24da9754bdde",
      "sequences": {
        "s1": "EVQLVESGGGLVQPGG..."
      }
    }
  }'
The response breaks down assay costs and material costs separately, in USD cents.

SDKs

Official Python SDK: adaptyv-sdk.
from adaptyv_sdk import AdaptyvClient
import os

client = AdaptyvClient(api_key=os.environ["ADAPTYVBIO_API_TOKEN"])
experiments = client.experiments.list(limit=5)