experiments

Create experiment

Creates a new experiment request for the Adaptyv Foundry platform.

The payload captures the target (from the catalog), antibody sequences, replicate plan, assay parameters, optional metadata, and an optional webhook for notifications. By default, experiments are created in Draft status so clients can review inputs before submission.

Set skip_draft: true to bypass Draft status and submit directly for processing. This is useful for automated pipelines with pre-validated payloads that don't require manual review. The experiment will be created in "Waiting for confirmation" status instead of Draft.

API-originated experiments are automatically assigned to the organization's API submissions project for traceability.

ExperimentSpec fields

Validation is strict: fields that are not applicable to a given experiment type (e.g., method on a non-binding type) cause a 400 rejection. Multiple validation errors are accumulated and returned together so callers can fix everything in one round-trip.

FieldTypeDescription
experiment_typestringRequired. One of affinity, screening, thermostability, fluorescence, expression, epitope_binning, enzyme_activity.
methodstringRequired for affinity/screening (bli or spr). Rejected for all other types.
target_idstringTarget UUID from the catalog. Required for affinity, screening, and epitope_binning. Rejected for non-binding types.
sequencesobjectRequired. Map of sequence name to amino acid string. epitope_binning requires exactly 4-28 sequences in multiples of 4.
n_replicatesintegerOptional for most types (default 3, range 1-5). Rejected for epitope_binning.
antigen_concentrationsarrayaffinity only; optional, defaults to [1000.0, 316.2, 100.0, 31.6, 0.0] nM.
parametersobjectOptional. Experiment-specific settings

Sequence Formats

The sequences field accepts two formats:

Simple format — amino acid string only:

"sequences": {
  "seq1": "EVQLVESGGGLVQPGGSLRLSCAAS"
}

Object format — with metadata:

"sequences": {
  "seq1": {
    "aa_string": "EVQLVESGGGLVQPGGSLRLSCAAS",
    "control": false,
    "metadata": { "type": "scfv", "tag_location": "C" }
  }
}

Example: Affinity (BLI)

Full kinetic characterization measuring on/off rates and KD. Target ID 019a03da-b87f-7e15-8b02-cef171c9871d is Human PD-L1 from the catalog.

{
  "name": "PD-L1 affinity panel",
  "experiment_spec": {
    "experiment_type": "affinity",
    "method": "bli",
    "target_id": "019a03da-b87f-7e15-8b02-cef171c9871d",
    "sequences": {
      "pembrolizumab_vh": "QVQLVQSGVEVKKPGASVKVSCKASGYTFTNYYMYWVRQAPGQGLEWMGGINPSNGGTNFNEKFKNRVTLTTDSSTTTAYMELKSLQFDDTAVYYCARRDYRFDMGFDYWGQGTTVTVSS",
      "pembrolizumab_vl": "EIVLTQSPATLSLSPGERATLSCRASKGVSTSGYSYLHWYQQKPGQAPRLLIYLASYLESGVPARFSGSGSGTDFTLTISSLEPEDFAVYYCQHSRDLPLTFGGGTKVEIK"
    },
    "n_replicates": 3,
    "antigen_concentrations": [1000.0, 316.2, 100.0, 31.6, 0.0]
  },
  "webhook_url": "https://example.com/webhook"
}

Example: Screening (SPR)

High-throughput yes/no binding assessment using SPR.

{
  "name": "Library screening round 1",
  "experiment_spec": {
    "experiment_type": "screening",
    "method": "spr",
    "target_id": "019a03da-b87f-7e15-8b02-cef171c9871d",
    "sequences": {
      "clone_A1": "EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSAISGSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKDRLSITIRPRYYGLDVWGQGTLVTVSS",
      "clone_A2": "QVQLVQSGAEVKKPGASVKVSCKASGYTFTSYGISWVRQAPGQGLEWMGWISAYNGNTNYAQKLQGRVTMTTDTSTSTAYMELRSLRSDDTAVYYCARDVGYCTDYSCYFDYWGQGTLVTVSS",
      "clone_A3": "EVQLLESGGGLVQPGGSLRLSCAASGFTFSTYAMSWVRQAPGKGLEWVSSISSGGSYIYYADSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARRPWGYYALDIWGQGTTVTVSS"
    },
    "n_replicates": 2
  }
}

Example: Thermostability

Measures melting temperature (Tm) via differential scanning fluorimetry. No target required.

{
  "name": "Lead candidates stability",
  "experiment_spec": {
    "experiment_type": "thermostability",
    "sequences": {
      "candidate_1": "QVQLVQSGAEVKKPGASVKVSCKASGYTFTSYAMHWVRQAPGQRLEWMGWINAGNGNTKYSQKFQGRVTITRDTSASTAYMELSSLRSEDTAVYYCARAKFGATGAFDIWGQGTMVTVSS",
      "candidate_2": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
    },
    "n_replicates": 3,
    "parameters": {
      "buffer": "PBS",
      "ph": 7.4
    }
  }
}

Example: Fluorescence

Fluorescence-based protein characterization measuring intrinsic properties. No target required.

{
  "name": "Fluorescence characterization",
  "experiment_spec": {
    "experiment_type": "fluorescence",
    "sequences": {
      "variant_1": "QVQLVQSGAEVKKPGASVKVSCKASGYTFTSYDINWVRQATGQGLEWMGWMNPNSGNTGYAQKFQGRVTMTRDTSISTAYMELRSLRSDDTAVYYCARGGFYGSTIWFDYWGQGTLVTVSS",
      "variant_2": "EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYWMSWVRQAPGKGLEWVANIKQDGSEKYYVDSVKGRFTISRDNAKNSLYLQMNSLRAEDTAVYYCARDRYGNYVDYWGQGTLVTVSS"
    },
    "n_replicates": 3
  }
}

Example: Expression

Protein expression screening measuring yield and quality. No target required.

{
  "name": "Expression screening",
  "experiment_spec": {
    "experiment_type": "expression",
    "sequences": {
      "construct_A": "QVQLVQSGAEVKKPGASVKVSCKASGYTFTSYGISWVRQAPGQGLEWMGWISAYNGNTNYAQKLQGRVTMTTDTSTSTAYMELRSLRSDDTAVYYCARDVGYCTDYSCYFDYWGQGTLVTVSS",
      "construct_B": "EVQLVESGGGLVQPGGSLRLSCAASGFNIKDTYIHWVRQAPGKGLEWVARIYPTNGYTRYADSVKGRFTISADTSKNTAYLQMNSLRAEDTAVYYCSRWGGDGFYAMDYWGQGTLVTVSS"
    },
    "n_replicates": 2
  }
}

Example: With skip_draft=true (Auto-Submit)

Bypass Draft status and submit directly for processing:

{
  "name": "Pre-validated batch",
  "skip_draft": true,
  "experiment_spec": {
    "experiment_type": "thermostability",
    "sequences": {
      "seq1": "EVQLVESGGGLVQPGGSLRLSCAASGFTFSSYAMSWVRQAPGKGLEWVSAISGSGGSTYYADSVKGRFTISRDNSKNTLYLQMNSLRAEDTAVYYCAKDRLSITIRPRYYGLDVWGQGTLVTVSS"
    },
    "n_replicates": 2
  }
}
post/api/v1/experiments

Request

  • Base URL
    https://devs.adaptyvbio.com
  • URL
    https://devs.adaptyvbio.com/api/v1/experiments
  • Auth
    HTTP bearer

Request body

auto_accept_quoteboolean

Atomic create-and-pay: accept the quote and initiate payment in the same request.

When true, after creating the experiment and its Stripe quote the server immediately accepts the quote and finalizes the invoice. It is non-settling for machine rails: create-and-pay never settles or emits a payment 402; the client settles at /invoices/{id}/pay.

  • No header / async_invoice — the quote is accepted and a draft invoice is created (today's behaviour). Responds 201 Created with stripe_invoice_id and stripe_hosted_invoice_url.
  • A machine rail (mpp-spt / x402-exact) — the (open, unpaid) invoice is finalized and the response is 200 OK with the accepted-quote body plus a HATEOAS payment pointer to /invoices/{invoice_id}/pay. Follow it to answer the 402 challenge and settle.

On a failure after the invoice was created, the invoice is compensated (voided) so the experiment can be retried. Implies skip_draft: true. A quote must be creatable (target_id + full pricing available), otherwise the request is rejected with 400.

namestring required

Human-readable name for the experiment

skip_draftboolean

Bypass Draft status and submit directly for processing.

When true, the experiment is created in "Waiting for confirmation" status instead of Draft, skipping the manual review step. Use this for automated pipelines with pre-validated payloads.

When an experiment is submitted with skip_draft: true and the target has existing inventory materials, those materials are automatically linked to expedite processing.

webhook_secretstring nullable

HMAC secret this experiment's deliveries are signed with. Write-only: it is never returned by any endpoint, so store your copy when you set it.

Omit it to inherit your organization's secret (see /api/v1/webhooks), and omit that too to inherit Adaptyv's deployment-wide secret. Minimum 32 characters.

webhook_urlstring nullable

HTTPS URL for push notifications. Once set, Adaptyv POSTs an experiment_update event to this URL for every customer-facing update on the experiment — the same updates that trigger an email notification. Deliveries are signed with X-Adaptyv-Signature (HMAC-SHA256).

Example request

{
  "experiment_spec": {
    "antigen_concentrations": [
      1000,
      316.2,
      100,
      31.6,
      0
    ],
    "n_replicates": 3,
    "target_id": "019a03da-b87f-7e15-8b02-cef171c9871d"
  },
  "name": "PD-L1 affinity panel",
  "payment": {
    "method": "x402-exact"
  },
  "webhook_secret": "a-32-plus-character-shared-secret",
  "webhook_url": "https://example.com/webhook"
}

Response

Atomic create-and-pay for a machine rail (auto_accept_quote): the (open, unpaid) invoice is finalized and the payment block points at /invoices/{id}/pay where the client settles. Never settles or challenges at create.

hosted_invoice_urlstring nullable

Stripe-hosted URL where the customer can view and pay the generated invoice

idstring required

Quote ID that was accepted

invoice_idstring nullable

ID of the invoice generated from this quote (if applicable)

status'draft' | 'open' | 'accepted' | 'canceled' | 'stale' required

Quote status from Stripe's API.

Example response

{
  "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1234/test_5678",
  "payment": {
    "hosted_invoice_url": "https://invoice.stripe.com/i/acct_1234/test_5678",
    "methods": [
      "x402-exact",
      "mpp-spt"
    ],
    "pay_url": "/api/v1/invoices/in_1OqLk2LkdIwHu7ix6OboRpXl/pay"
  }
}

Changes

No recorded changes to this operation across all 1 revision of this API.