curl --request POST \
--url https://besimplo.com/api/v1/checkout/sessions \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"session": {
"success_url": "https://example.com/success",
"line_items": [
{
"price_id": "price_01h455vb4pex5vsknk084sn02q",
"quantity": 1
}
],
"external_code": "CHECKOUT-SESSION-XYZ",
"customer_id": "cus_01h455vb4pex5vsknk084sn02p",
"customer": "<unknown>",
"mode": "subscription",
"return_url": "https://example.com/return",
"metadata": [],
"discounts": [
{
"type": "percentage",
"percentage": 20,
"cycles": 3,
"description": "Promo Q2"
}
]
}
}
'import requests
url = "https://besimplo.com/api/v1/checkout/sessions"
payload = { "session": {
"success_url": "https://example.com/success",
"line_items": [
{
"price_id": "price_01h455vb4pex5vsknk084sn02q",
"quantity": 1
}
],
"external_code": "CHECKOUT-SESSION-XYZ",
"customer_id": "cus_01h455vb4pex5vsknk084sn02p",
"customer": "<unknown>",
"mode": "subscription",
"return_url": "https://example.com/return",
"metadata": [],
"discounts": [
{
"type": "percentage",
"percentage": 20,
"cycles": 3,
"description": "Promo Q2"
}
]
} }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
session: {
success_url: 'https://example.com/success',
line_items: [{price_id: 'price_01h455vb4pex5vsknk084sn02q', quantity: 1}],
external_code: 'CHECKOUT-SESSION-XYZ',
customer_id: 'cus_01h455vb4pex5vsknk084sn02p',
customer: '<unknown>',
mode: 'subscription',
return_url: 'https://example.com/return',
metadata: [],
discounts: [{type: 'percentage', percentage: 20, cycles: 3, description: 'Promo Q2'}]
}
})
};
fetch('https://besimplo.com/api/v1/checkout/sessions', 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://besimplo.com/api/v1/checkout/sessions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'session' => [
'success_url' => 'https://example.com/success',
'line_items' => [
[
'price_id' => 'price_01h455vb4pex5vsknk084sn02q',
'quantity' => 1
]
],
'external_code' => 'CHECKOUT-SESSION-XYZ',
'customer_id' => 'cus_01h455vb4pex5vsknk084sn02p',
'customer' => '<unknown>',
'mode' => 'subscription',
'return_url' => 'https://example.com/return',
'metadata' => [
],
'discounts' => [
[
'type' => 'percentage',
'percentage' => 20,
'cycles' => 3,
'description' => 'Promo Q2'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://besimplo.com/api/v1/checkout/sessions"
payload := strings.NewReader("{\n \"session\": {\n \"success_url\": \"https://example.com/success\",\n \"line_items\": [\n {\n \"price_id\": \"price_01h455vb4pex5vsknk084sn02q\",\n \"quantity\": 1\n }\n ],\n \"external_code\": \"CHECKOUT-SESSION-XYZ\",\n \"customer_id\": \"cus_01h455vb4pex5vsknk084sn02p\",\n \"customer\": \"<unknown>\",\n \"mode\": \"subscription\",\n \"return_url\": \"https://example.com/return\",\n \"metadata\": [],\n \"discounts\": [\n {\n \"type\": \"percentage\",\n \"percentage\": 20,\n \"cycles\": 3,\n \"description\": \"Promo Q2\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://besimplo.com/api/v1/checkout/sessions")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"session\": {\n \"success_url\": \"https://example.com/success\",\n \"line_items\": [\n {\n \"price_id\": \"price_01h455vb4pex5vsknk084sn02q\",\n \"quantity\": 1\n }\n ],\n \"external_code\": \"CHECKOUT-SESSION-XYZ\",\n \"customer_id\": \"cus_01h455vb4pex5vsknk084sn02p\",\n \"customer\": \"<unknown>\",\n \"mode\": \"subscription\",\n \"return_url\": \"https://example.com/return\",\n \"metadata\": [],\n \"discounts\": [\n {\n \"type\": \"percentage\",\n \"percentage\": 20,\n \"cycles\": 3,\n \"description\": \"Promo Q2\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://besimplo.com/api/v1/checkout/sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"session\": {\n \"success_url\": \"https://example.com/success\",\n \"line_items\": [\n {\n \"price_id\": \"price_01h455vb4pex5vsknk084sn02q\",\n \"quantity\": 1\n }\n ],\n \"external_code\": \"CHECKOUT-SESSION-XYZ\",\n \"customer_id\": \"cus_01h455vb4pex5vsknk084sn02p\",\n \"customer\": \"<unknown>\",\n \"mode\": \"subscription\",\n \"return_url\": \"https://example.com/return\",\n \"metadata\": [],\n \"discounts\": [\n {\n \"type\": \"percentage\",\n \"percentage\": 20,\n \"cycles\": 3,\n \"description\": \"Promo Q2\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "cs_01h455vb4pex5vsknk084sn02c",
"object": "checkout_session",
"amount": 9990,
"created": 1764040287,
"currency": "brl",
"customer": "cus_01h455vb4pex5vsknk084sn02p",
"expires_at": 1764043887,
"external_code": null,
"invoice": "in_01h455vb4pex5vsknk084sn02q",
"line_items": {
"object": "list",
"data": [
{
"object": "item",
"price": "price_01h455vb4pex5vsknk084sn02q",
"quantity": 1
}
]
},
"live_mode": true,
"metadata": [],
"mode": "subscription",
"payment_intent": null,
"return_url": "https://example.com/return",
"status": "open",
"subscription": "sub_01h455vb4pex5vsknk084sn02s",
"success_url": "https://example.com/success",
"url": "https://besimplo.com/checkout/sessions/cs_01h455vb4pex5vsknk084sn02c"
}Criar nova sessão de checkout
Criar nova sessão de checkout na sua conta. A sessão permite que um cliente complete um pagamento ou assinatura através de uma interface web.
O cliente é opcional. Você pode:
- Enviar
customer_idpara vincular um cliente já existente. - Enviar
customercom os dados para criar um cliente junto com a sessão. - Omitir ambos: a sessão é criada sem cliente vinculado e o próprio comprador
preencherá os dados (nome, CPF/CNPJ, e-mail e telefone) ao acessar a
urlretornada. Nesse caso,customer,invoice,subscriptioneamountvoltamnullna resposta e são preenchidos somente após o comprador finalizar o cadastro.
Validação de line_items e discounts ocorre em todos os casos — uma sessão sem
cliente também recebe 404 RESOURCE_MISSING para price_id inexistente e 422
para TOO_MANY_LINE_ITEMS / DISCOUNT_EXCEEDS_SUBTOTAL.
Limite de taxa: 5 requisições por minuto por chave de API.
curl --request POST \
--url https://besimplo.com/api/v1/checkout/sessions \
--header 'Authorization: <api-key>' \
--header 'Content-Type: application/json' \
--data '
{
"session": {
"success_url": "https://example.com/success",
"line_items": [
{
"price_id": "price_01h455vb4pex5vsknk084sn02q",
"quantity": 1
}
],
"external_code": "CHECKOUT-SESSION-XYZ",
"customer_id": "cus_01h455vb4pex5vsknk084sn02p",
"customer": "<unknown>",
"mode": "subscription",
"return_url": "https://example.com/return",
"metadata": [],
"discounts": [
{
"type": "percentage",
"percentage": 20,
"cycles": 3,
"description": "Promo Q2"
}
]
}
}
'import requests
url = "https://besimplo.com/api/v1/checkout/sessions"
payload = { "session": {
"success_url": "https://example.com/success",
"line_items": [
{
"price_id": "price_01h455vb4pex5vsknk084sn02q",
"quantity": 1
}
],
"external_code": "CHECKOUT-SESSION-XYZ",
"customer_id": "cus_01h455vb4pex5vsknk084sn02p",
"customer": "<unknown>",
"mode": "subscription",
"return_url": "https://example.com/return",
"metadata": [],
"discounts": [
{
"type": "percentage",
"percentage": 20,
"cycles": 3,
"description": "Promo Q2"
}
]
} }
headers = {
"Authorization": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
session: {
success_url: 'https://example.com/success',
line_items: [{price_id: 'price_01h455vb4pex5vsknk084sn02q', quantity: 1}],
external_code: 'CHECKOUT-SESSION-XYZ',
customer_id: 'cus_01h455vb4pex5vsknk084sn02p',
customer: '<unknown>',
mode: 'subscription',
return_url: 'https://example.com/return',
metadata: [],
discounts: [{type: 'percentage', percentage: 20, cycles: 3, description: 'Promo Q2'}]
}
})
};
fetch('https://besimplo.com/api/v1/checkout/sessions', 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://besimplo.com/api/v1/checkout/sessions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'session' => [
'success_url' => 'https://example.com/success',
'line_items' => [
[
'price_id' => 'price_01h455vb4pex5vsknk084sn02q',
'quantity' => 1
]
],
'external_code' => 'CHECKOUT-SESSION-XYZ',
'customer_id' => 'cus_01h455vb4pex5vsknk084sn02p',
'customer' => '<unknown>',
'mode' => 'subscription',
'return_url' => 'https://example.com/return',
'metadata' => [
],
'discounts' => [
[
'type' => 'percentage',
'percentage' => 20,
'cycles' => 3,
'description' => 'Promo Q2'
]
]
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: <api-key>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://besimplo.com/api/v1/checkout/sessions"
payload := strings.NewReader("{\n \"session\": {\n \"success_url\": \"https://example.com/success\",\n \"line_items\": [\n {\n \"price_id\": \"price_01h455vb4pex5vsknk084sn02q\",\n \"quantity\": 1\n }\n ],\n \"external_code\": \"CHECKOUT-SESSION-XYZ\",\n \"customer_id\": \"cus_01h455vb4pex5vsknk084sn02p\",\n \"customer\": \"<unknown>\",\n \"mode\": \"subscription\",\n \"return_url\": \"https://example.com/return\",\n \"metadata\": [],\n \"discounts\": [\n {\n \"type\": \"percentage\",\n \"percentage\": 20,\n \"cycles\": 3,\n \"description\": \"Promo Q2\"\n }\n ]\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<api-key>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://besimplo.com/api/v1/checkout/sessions")
.header("Authorization", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"session\": {\n \"success_url\": \"https://example.com/success\",\n \"line_items\": [\n {\n \"price_id\": \"price_01h455vb4pex5vsknk084sn02q\",\n \"quantity\": 1\n }\n ],\n \"external_code\": \"CHECKOUT-SESSION-XYZ\",\n \"customer_id\": \"cus_01h455vb4pex5vsknk084sn02p\",\n \"customer\": \"<unknown>\",\n \"mode\": \"subscription\",\n \"return_url\": \"https://example.com/return\",\n \"metadata\": [],\n \"discounts\": [\n {\n \"type\": \"percentage\",\n \"percentage\": 20,\n \"cycles\": 3,\n \"description\": \"Promo Q2\"\n }\n ]\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://besimplo.com/api/v1/checkout/sessions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"session\": {\n \"success_url\": \"https://example.com/success\",\n \"line_items\": [\n {\n \"price_id\": \"price_01h455vb4pex5vsknk084sn02q\",\n \"quantity\": 1\n }\n ],\n \"external_code\": \"CHECKOUT-SESSION-XYZ\",\n \"customer_id\": \"cus_01h455vb4pex5vsknk084sn02p\",\n \"customer\": \"<unknown>\",\n \"mode\": \"subscription\",\n \"return_url\": \"https://example.com/return\",\n \"metadata\": [],\n \"discounts\": [\n {\n \"type\": \"percentage\",\n \"percentage\": 20,\n \"cycles\": 3,\n \"description\": \"Promo Q2\"\n }\n ]\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "cs_01h455vb4pex5vsknk084sn02c",
"object": "checkout_session",
"amount": 9990,
"created": 1764040287,
"currency": "brl",
"customer": "cus_01h455vb4pex5vsknk084sn02p",
"expires_at": 1764043887,
"external_code": null,
"invoice": "in_01h455vb4pex5vsknk084sn02q",
"line_items": {
"object": "list",
"data": [
{
"object": "item",
"price": "price_01h455vb4pex5vsknk084sn02q",
"quantity": 1
}
]
},
"live_mode": true,
"metadata": [],
"mode": "subscription",
"payment_intent": null,
"return_url": "https://example.com/return",
"status": "open",
"subscription": "sub_01h455vb4pex5vsknk084sn02s",
"success_url": "https://example.com/success",
"url": "https://besimplo.com/checkout/sessions/cs_01h455vb4pex5vsknk084sn02c"
}Authorizations
A chave de API usada para autenticar a requisição e identificar a sua conta.
Exemplo: Authorization: ApiKey my-secure-key
Body
Dados da sessão de checkout que será criada
Show child attributes
Show child attributes
Response
Operação realizada com sucesso
ID único da sessão de checkout, no formato TypeID com prefixo cs_.
^cs_[0-9a-z]{26}$"cs_01h455vb4pex5vsknk084sn02c"
Tipo do objeto. Sempre 'checkout_session'.
checkout_session "checkout_session"
Valor total em centavos. null quando o cliente ainda não foi informado e
a fatura não foi gerada.
9990
Timestamp Unix da criação da sessão.
1704672000
Código da moeda (ISO 4217). Sempre 'brl' (Real brasileiro).
brl "brl"
ID do cliente vinculado à sessão, no formato TypeID com prefixo cus_.
null quando customer_id/customer não foram enviados na criação — o
comprador preenche os dados na página de checkout e o cliente é criado
nesse momento.
"cus_01h455vb4pex5vsknk084sn02p"
Timestamp Unix do prazo que a sessão publicou. Uma sessão nasce com uma
hora de validade. Este campo não muda quando a sessão é encerrada, então
uma sessão encerrada com
POST /api/v1/checkout/sessions/{id}/expire carrega status expired
com um expires_at ainda no futuro. Leia status para saber se a
sessão aceita pagamento.
1704675600
ID da fatura gerada para a sessão, no formato TypeID com prefixo in_.
null enquanto o cliente não foi informado — a fatura é criada depois que
o comprador preenche os dados na página de checkout.
"in_01h455vb4pex5vsknk084sn02q"
Itens da sessão, como foram registrados na criação. O preço aparece como
ID; o valor cobrado está em amount.
Show child attributes
Show child attributes
Indica ambiente de produção (true) ou sandbox (false). Dados de sandbox são limpos periodicamente.
true
Modo da sessão.
- payment: Cobrança avulsa.
- subscription: Assinatura recorrente.
payment, subscription "subscription"
Situação da sessão, derivada do prazo de validade, do encerramento e da conclusão.
- open: Aceita pagamento.
- complete: Paga; permanece assim mesmo depois do prazo.
- expired: Encerrada sem pagamento, pelo prazo vencido ou pelo merchant.
open, complete, expired "open"
URL para onde o comprador vai depois de pagar.
"https://example.com/success"
URL da sessão de checkout para redirecionar o cliente.
"https://besimplo.com/checkout/sessions/cs_01h455vb4pex5vsknk084sn02c"
Descontos aplicados à sessão. Ausente quando a sessão não tem desconto.
Show child attributes
Show child attributes
Código externo para integração com outros sistemas. Único por conta.
"CHECKOUT-SESSION-XYZ"
Metadados enviados na criação, devolvidos como foram armazenados. A API aceita uma lista de objetos livres; uma sessão criada sem metadados devolve um objeto vazio.
[]
ID da cobrança vinculada à sessão, no formato TypeID com prefixo pi_.
null enquanto nenhuma cobrança foi gerada.
"pi_01h455vb4pex5vsknk084sn02r"
URL para onde o comprador volta se cancelar o checkout.
"https://example.com/return"
ID da assinatura criada pela sessão, no formato TypeID com prefixo sub_.
Presente apenas no modo subscription e depois que a fatura foi criada.
"sub_01h455vb4pex5vsknk084sn02s"

