agent tool_use skill risk: low
Adaptyv Bio Foundry API Guide
Provides documentation and code examples for authenticating with and using the Adaptyv Bio Foundry API and Python SDK to create, submit, monitor, and retrieve results from protein…
SKILL 2 files · 1 folder
SKILL.md
---
name: adaptyv
description: "How to use the Adaptyv Bio Foundry API and Python SDK for protein experiment design, submission, and results retrieval. Use this skill whenever the user mentions Adaptyv, Foundry API, protein binding assays, protein screening experiments, BLI/SPR assays, thermostability assays, or wants to submit pr"
---
# Adaptyv Bio Foundry API
Adaptyv Bio is a cloud lab that turns protein sequences into experimental data. Users submit amino acid sequences via API or UI; Adaptyv's automated lab runs assays (binding, thermostability, expression, fluorescence) and delivers results in ~21 days.
## Quick Start
**Base URL:** `https://foundry-api-public.adaptyvbio.com/api/v1`
**Authentication:** Bearer token in the `Authorization` header. Tokens are obtained from [foundry.adaptyvbio.com](https://foundry.adaptyvbio.com/) sidebar.
When writing code, always read the API key from the environment variable `ADAPTYV_API_KEY` or from a `.env` file — never hardcode tokens. Check for a `.env` file in the project root first; if one exists, use a library like `python-dotenv` to load it.
```bash
export FOUNDRY_API_TOKEN="abs0_..."
curl https://foundry-api-public.adaptyvbio.com/api/v1/targets?limit=3 \
-H "Authorization: Bearer $FOUNDRY_API_TOKEN"
```
Every request except `GET /openapi.json` requires authentication. Store tokens in environment variables or `.env` files — never commit them to source control.
## Python SDK
Install: `uv add adaptyv-sdk` (falls back to `uv pip install adaptyv-sdk` if no `pyproject.toml` exists)
**Environment variables** (set in shell or `.env` file):
```bash
ADAPTYV_API_KEY=your_api_key
ADAPTYV_API_URL=https://foundry-api-public.adaptyvbio.com/api/v1
```
### Decorator Pattern
```python
from adaptyv import lab
@lab.experiment(target="PD-L1", experiment_type="screening", method="bli")
def design_binders():
return {"design_a": "MVKVGVNG...", "design_b": "MKVLVAG..."}
result = design_binders()
print(f"Experiment: {result.experiment_url}")
```
### Client Pattern
```python
from adaptyv import FoundryClient
client = FoundryClient(api_key="...", base_url="https://foundry-api-public.adaptyvbio.com/api/v1")
# Browse targets
targets = client.targets.list(search="EGFR", selfservice_only=True)
# Estimate cost
estimate = client.experiments.cost_estimate({
"experiment_spec": {
"experiment_type": "screening",
"method": "bli",
"target_id": "target-uuid",
"sequences": {"seq1": "EVQLVESGGGLVQ..."},
"n_replicates": 3
}
})
# Create and submit
exp = client.experiments.create({...})
client.experiments.submit(exp.experiment_id)
# Later: retrieve results
results = client.experiments.get_results(exp.experiment_id)
```
## Experiment Types
| Type | Method | Measures | Requires Target |
|---|---|---|---|
| `affinity` | `bli` or `spr` | KD, kon, koff kinetics | Yes |
| `screening` | `bli` or `spr` | Yes/no binding | Yes |
| `thermostability` | — | Melting temperature (Tm) | No |
| `expression` | — | Expression yield | No |
| `fluorescence` | — | Fluorescence intensity | No |
## Experiment Lifecycle
```
Draft → WaitingForConfirmation → QuoteSent → WaitingForMaterials → InQueue → InProduction → DataAnalysis → InReview → Done
```
| Status | Who Acts | Description |
|---|---|---|
| `Draft` | You | Editable, no cost commitment |
| `WaitingForConfirmation` | Adaptyv | Under review, quote being prepared |
| `QuoteSent` | You | Review and confirm the quote |
| `WaitingForMaterials` | Adaptyv | Gene fragments and target ordered |
| `InQueue` | Adaptyv | Materials arrived, queued for lab |
| `InProduction` | Adaptyv | Assay running |
| `DataAnalysis` | Adaptyv | Raw data processing and QC |
| `InReview` | Adaptyv | Final validation |
| `Done` | You | Results available |
| `Canceled` | Either | Experiment canceled |
The `results_status` field on an experiment tracks: `none`, `partial`, or `all`.
## Common Workflows
### 1. Submit a Binding Screen (Step by Step)
```python
# 1. Find a target
targets = client.targets.list(search="EGFR", selfservice_only=True)
target_id = targets.items[0].id
# 2. Preview cost
estimate = client.experiments.cost_estimate({
"experiment_spec": {
"experiment_type": "screening",
"method": "bli",
"target_id": target_id,
"sequences": {"seq1": "EVQLVESGGGLVQ...", "seq2": "MKVLVAG..."},
"n_replicates": 3
}
})
# 3. Create experiment (starts as Draft)
exp = client.experiments.create({
"name": "EGFR binder screen batch 1",
"experiment_spec": {
"experiment_type": "screening",
"method": "bli",
"target_id": target_id,
"sequences": {"seq1": "EVQLVESGGGLVQ...", "seq2": "MKVLVAG..."},
"n_replicates": 3
}
})
# 4. Submit for review
client.experiments.submit(exp.experiment_id)
# 5. Poll or use webhooks until Done
# 6. Retrieve results
results = client.experiments.get_results(exp.experiment_id)
```
### 2. Automated Pipeline (Skip Draft + Auto-Accept Quote)
```python
exp = client.experiments.create({
"name": "Auto pipeline run",
"experiment_spec": {...},
"skip_draft": True,
"auto_accept_quote": True,
"webhook_url": "https://my-server.com/webhook"
})
# Webhook fires on each status transition; poll or wait for Done
```
### 3. Using Webhooks
Pass `webhook_url` when creating an experiment. Adaptyv POSTs to that URL on every status transition with the experiment ID, previous status, and new status.
## Sequences
- Simple format: `{"seq1": "EVQLVESGGGLVQPGGSLRLSCAAS"}`
- Rich format: `{"seq1": {"aa_string": "EVQLVESGGGLVQ...", "control": false, "metadata": {"type": "scfv"}}}`
- Multi-chain: use colon separator — `"MVLS:EVQL"`
- Valid amino acids: A, C, D, E, F, G, H, I, K, L, M, N, P, Q, R, S, T, V, W, Y (case-insensitive, stored uppercase)
- Sequences can only be added to experiments in `Draft` status
## Filtering, Sorting, and Pagination
All list endpoints support pagination (`limit` 1-100, default 50; `offset`), search (free-text on name fields), and sorting.
**Filtering** uses s-expression syntax via the `filter` query parameter:
- Comparison: `eq(field,value)`, `neq`, `gt`, `gte`, `lt`, `lte`, `contains(field,substring)`
- Range/set: `between(field,lo,hi)`, `in(field,v1,v2,...)`
- Logic: `and(expr1,expr2,...)`, `or(...)`, `not(expr)`
- Null: `is_null(field)`, `is_not_null(field)`
- JSONB: `at(field,key)` — e.g., `eq(at(metadata,score),42)`
- Cast: `float()`, `int()`, `text()`, `timestamp()`, `date()`
**Sorting** uses `asc(field)` or `desc(field)`, comma-separated (max 8):
```
sort=desc(created_at),asc(name)
```
**Example:** `filter=and(gte(created_at,2026-01-01),eq(status,done))`
## Error Handling
All errors return:
```json
{
"error": "Human-readable description",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}
```
The `request_id` is also in the `x-request-id` response header — include it when contacting support.
## Token Management
Tokens use Biscuit-based cryptographic attenuation. You can create restricted tokens scoped by organization, resource type, actions (read/create/update), and expiry via `POST /tokens/attenuate`. Revoking a token (`POST /tokens/revoke`) revokes it and all its descendants.
## Detailed API Reference
For the full list of all 32 endpoints with request/response schemas, read `references/api-endpoints.md`.
REQUIRED CONTEXT
- user query mentioning Adaptyv, Foundry API, or protein assays
ROLES & RULES
- When writing code, always read the API key from the environment variable ADAPTYV_API_KEY or from a .env file
- never hardcode tokens
- Check for a .env file in the project root first
- Store tokens in environment variables or .env files
- never commit them to source control
- Every request except GET /openapi.json requires authentication
EXPECTED OUTPUT
- Format
- markdown
- Constraints
- include code examples
- use tables for experiment types and statuses
- read API key from environment variable
EXAMPLES
Includes multiple Python code examples for decorator/client patterns, cost estimation, experiment creation/submission, workflows, and curl examples.
CAVEATS
- Missing context
- Full content of references/api-endpoints.md
- Intended user skill level or prerequisites
- Ambiguities
- Description cuts off mid-sentence at 'submit pr'
QUALITY
- OVERALL
- 0.60
- CLARITY
- 0.90
- SPECIFICITY
- 0.85
- REUSABILITY
- 0.25
- COMPLETENESS
- 0.75
IMPROVEMENT SUGGESTIONS
- Complete the truncated description sentence in the frontmatter.
- Convert hardcoded code examples into reusable templates with clear placeholders for sequences, target IDs, and webhook URLs.
USAGE
Copy the prompt above and paste it into your AI of choice — Claude, ChatGPT, Gemini, or anywhere else you're working. Replace any placeholder sections with your own context, then ask for the output.
MORE FOR AGENT
- Xcode MCP Usage Guidelines for Agentsagenttool_use
- Xcode MCP Usage Guidelinesagenttool_use
- Xquik X/Twitter API Integration Skillagenttool_use
- Filesystem Agent Context Engineeringagenttool_use
- Agent Tool Design Principlesagenttool_use
- Conventional Git Commit Creatoragenttool_use
- GitHub Trending Dashboard Generatoragenttool_use
- Hosted Background Agent Infrastructureagenttool_use
- AudioCraft Text-to-Music Generation Guideagenttool_use
- Trello Boards Lists Cards Integratoragenttool_use
- Git Commit Push PR Automatoragenttool_use
- GitHub Starred Projects Fetcher via Agent Browseragenttool_use
- 2chat Rube MCP Automation Guideagenttool_use
- Rube MCP Autom Task Automationagenttool_use
- Botbaba Automation via Rube MCPagenttool_use
- Aero Workflow Rube MCP Automationagenttool_use
- Boldsign Automation via Rube MCPagenttool_use
- API Sports Rube MCP Automation Guideagenttool_use
- Bolt IoT Rube MCP Automation Guideagenttool_use
- Booqable Automation via Rube MCPagenttool_use
- Coassemble Automation via Rube MCPagenttool_use
- D2L Brightspace Rube MCP Automation Guideagenttool_use
- Codacy Automation via Rube MCPagenttool_use
- Conversion Tools Rube MCP Automationagenttool_use
- Codereadr Automation via Rube MCPagenttool_use