curl --request GET \
--url https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote \
--header 'Authorization: Bearer <token>'import requests
url = "https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote', 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://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"amount_subtotal": 500000,
"amount_total": 500000,
"currency": "usd",
"experiment_id": "019462a4-b1c2-7def-8901-23456789abcd",
"status": "draft",
"stripe_quote_url": "https://billing.example.com/quotes/qt_1234567890",
"expires_at": "2026-03-15T23:59:59Z",
"updated_at": "2026-02-15T14:30:00Z"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}Get experiment quote
Returns quote metadata: totals, currency, status, and expiration.
The expires_at field shows when the quote expires if not confirmed.
The quote is generated asynchronously, so poll this endpoint.
POST /experiments/{experiment_id}/submit returns before the quote exists;
generating it involves a call to the payment provider. Until it lands this
endpoint answers 404, which means not yet rather than never — the same
contract GET /experiments/{experiment_id}/invoice follows. A 404 here is
an expected step in the normal flow, not an error to report.
Poll until 200, or equivalently until stripe_quote_id appears on
GET /experiments/{experiment_id}. A second or two is typical. Distinguish
the two 404 causes by the experiment’s own status: an experiment still in
draft has not been submitted, so no quote is coming until it is.
curl --request GET \
--url https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote \
--header 'Authorization: Bearer <token>'import requests
url = "https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote', 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://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://devs.adaptyvbio.com/api/v1/experiments/{experiment_id}/quote")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"amount_subtotal": 500000,
"amount_total": 500000,
"currency": "usd",
"experiment_id": "019462a4-b1c2-7def-8901-23456789abcd",
"status": "draft",
"stripe_quote_url": "https://billing.example.com/quotes/qt_1234567890",
"expires_at": "2026-03-15T23:59:59Z",
"updated_at": "2026-02-15T14:30:00Z"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}{
"error": "experiment not found",
"request_id": "req_019462a4-b1c2-7def-8901-23456789abcd"
}Authorizations
Biscuit-based bearer token. Obtain tokens from the Adaptyv Portal or via the /tokens endpoint. Tokens encode organization membership and role-based capabilities; the API verifies the token's cryptographic signature and authorization claims before processing requests. Use /tokens/attenuate to create restricted tokens for delegation.
Path Parameters
Experiment identifier
Response
Quote metadata retrieved
Quote metadata for an experiment.
Subtotal amount (in the smallest currency unit)
500000
Total amount (in the smallest currency unit)
500000
ISO currency code (e.g., "usd")
"usd"
Experiment identifier
"019462a4-b1c2-7def-8901-23456789abcd"
Stripe quote status
draft, open, accepted, canceled, stale Quote reference URL (may require provider account access).
"https://billing.example.com/quotes/qt_1234567890"
RFC3339 timestamp for when the quote expires (if provided by Stripe)
"2026-03-15T23:59:59Z"
RFC3339 timestamp for the last update time
"2026-02-15T14:30:00Z"
Was this page helpful?