Start the checkout of the Builder plan
curl --request POST \
--url https://api.numi.sh/v1/account/checkout \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.numi.sh/v1/account/checkout"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.numi.sh/v1/account/checkout', 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.numi.sh/v1/account/checkout",
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.numi.sh/v1/account/checkout"
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.numi.sh/v1/account/checkout")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.numi.sh/v1/account/checkout")
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{
"data": {
"url": "<string>"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA",
"as_of": "2026-10-19T12:34:56.789Z"
}
}{
"error": {
"code": "unauthorized",
"message": "Sign in to numi to manage your account."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "The sandbox plan has a limit of 20 requests a minute. Retry in 12 seconds.",
"retry_after": 12,
"scope": "minute"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "service_unavailable",
"message": "Accounts are not configured on this server, so you cannot sign in here."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}Account (web app)
Start the checkout of the Builder plan
Returns the URL of a Stripe Checkout for the Builder plan. After payment, Stripe sends the browser back to the account page of the numi web app, and the plan changes once Stripe tells the API.
POST
/
account
/
checkout
Start the checkout of the Builder plan
curl --request POST \
--url https://api.numi.sh/v1/account/checkout \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.numi.sh/v1/account/checkout"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.numi.sh/v1/account/checkout', 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.numi.sh/v1/account/checkout",
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.numi.sh/v1/account/checkout"
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.numi.sh/v1/account/checkout")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.numi.sh/v1/account/checkout")
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{
"data": {
"url": "<string>"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA",
"as_of": "2026-10-19T12:34:56.789Z"
}
}{
"error": {
"code": "unauthorized",
"message": "Sign in to numi to manage your account."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "unauthorized",
"message": "<string>"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "The sandbox plan has a limit of 20 requests a minute. Retry in 12 seconds.",
"retry_after": 12,
"scope": "minute"
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}{
"error": {
"code": "service_unavailable",
"message": "Accounts are not configured on this server, so you cannot sign in here."
},
"meta": {
"request_id": "req_Qm3xYb9Kd2LpR7wA"
}
}Authorizations
A session of the numi web app, sent as Authorization: Bearer <token>. Only the account routes take it.