curl --request POST \
--url https://api.twinbay.ai/organizations/current/billing/downgrade \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.twinbay.ai/organizations/current/billing/downgrade"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.twinbay.ai/organizations/current/billing/downgrade', 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://api.twinbay.ai/organizations/current/billing/downgrade",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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://api.twinbay.ai/organizations/current/billing/downgrade"
req, _ := http.NewRequest("POST", 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.post("https://api.twinbay.ai/organizations/current/billing/downgrade")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.twinbay.ai/organizations/current/billing/downgrade")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"plan": "free",
"max_environment_seconds": 123,
"max_parallel_twins": 123,
"ai_generation_enabled": true,
"active_twins": 123,
"ready": true,
"upgrade_available": true,
"remaining_credit_cents": 123,
"invoice": {
"period_start": "2023-11-07T05:31:56Z",
"period_end": "2023-11-07T05:31:56Z",
"total_cents": 123,
"line_items": [
{
"name": "<string>",
"total_cents": 123,
"twin": "<string>",
"quantity": 123,
"unit_price_cents": 123
}
],
"credits_applied_cents": 0
}
}Downgrade to Free
New seed and test generation stops at once, and every live environment gets the Free plan’s deadline, counted from now. Requires the admin role.
curl --request POST \
--url https://api.twinbay.ai/organizations/current/billing/downgrade \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.twinbay.ai/organizations/current/billing/downgrade"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.twinbay.ai/organizations/current/billing/downgrade', 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://api.twinbay.ai/organizations/current/billing/downgrade",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
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://api.twinbay.ai/organizations/current/billing/downgrade"
req, _ := http.NewRequest("POST", 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.post("https://api.twinbay.ai/organizations/current/billing/downgrade")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.twinbay.ai/organizations/current/billing/downgrade")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"plan": "free",
"max_environment_seconds": 123,
"max_parallel_twins": 123,
"ai_generation_enabled": true,
"active_twins": 123,
"ready": true,
"upgrade_available": true,
"remaining_credit_cents": 123,
"invoice": {
"period_start": "2023-11-07T05:31:56Z",
"period_end": "2023-11-07T05:31:56Z",
"total_cents": 123,
"line_items": [
{
"name": "<string>",
"total_cents": 123,
"twin": "<string>",
"quantity": 123,
"unit_price_cents": 123
}
],
"credits_applied_cents": 0
}
}Authorizations
Access token issued by WorkOS AuthKit.
Response
Successful Response
free, paygo How long an environment may run, or null for no limit
How many twins may run at once, or null for no limit
Whether seeds, generated tests and evaluators can be built
Twins currently asked to run
Whether the billing account is set up; plan changes wait for it
Whether this deployment can take a card for pay as you go
Spendable USD credit after current draft invoice deductions. Null while billing is unreachable or not yet set up.
The draft invoice for the current period, updated as usage arrives. Null while billing is unreachable or not yet set up.
Show child attributes
Show child attributes