Criar Venda no Terminal
curl --request POST \
--url https://pay.autorizou.dev/api/v1/pos/sales \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"terminal_code": "<string>",
"amount": 123,
"payment_method": "<string>",
"installments": 123,
"external_reference": "<string>"
}
'import requests
url = "https://pay.autorizou.dev/api/v1/pos/sales"
payload = {
"terminal_code": "<string>",
"amount": 123,
"payment_method": "<string>",
"installments": 123,
"external_reference": "<string>"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
terminal_code: '<string>',
amount: 123,
payment_method: '<string>',
installments: 123,
external_reference: '<string>'
})
};
fetch('https://pay.autorizou.dev/api/v1/pos/sales', 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://pay.autorizou.dev/api/v1/pos/sales",
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([
'terminal_code' => '<string>',
'amount' => 123,
'payment_method' => '<string>',
'installments' => 123,
'external_reference' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://pay.autorizou.dev/api/v1/pos/sales"
payload := strings.NewReader("{\n \"terminal_code\": \"<string>\",\n \"amount\": 123,\n \"payment_method\": \"<string>\",\n \"installments\": 123,\n \"external_reference\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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://pay.autorizou.dev/api/v1/pos/sales")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"terminal_code\": \"<string>\",\n \"amount\": 123,\n \"payment_method\": \"<string>\",\n \"installments\": 123,\n \"external_reference\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pay.autorizou.dev/api/v1/pos/sales")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"terminal_code\": \"<string>\",\n \"amount\": 123,\n \"payment_method\": \"<string>\",\n \"installments\": 123,\n \"external_reference\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"uuid": "<string>",
"state": "<string>",
"amount": 123,
"currency": "<string>",
"payment_method": "<string>",
"installments": 123,
"external_reference": "<string>",
"terminal": {},
"payment": {},
"created_at": "<string>"
}POS / Maquininhas
Criar Venda no Terminal
Inicia uma venda presencial na maquininha a partir da sua aplicação e devolve o resultado
POST
/
api
/
v1
/
pos
/
sales
Criar Venda no Terminal
curl --request POST \
--url https://pay.autorizou.dev/api/v1/pos/sales \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: <idempotency-key>' \
--data '
{
"terminal_code": "<string>",
"amount": 123,
"payment_method": "<string>",
"installments": 123,
"external_reference": "<string>"
}
'import requests
url = "https://pay.autorizou.dev/api/v1/pos/sales"
payload = {
"terminal_code": "<string>",
"amount": 123,
"payment_method": "<string>",
"installments": 123,
"external_reference": "<string>"
}
headers = {
"Idempotency-Key": "<idempotency-key>",
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'Idempotency-Key': '<idempotency-key>',
Authorization: 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
terminal_code: '<string>',
amount: 123,
payment_method: '<string>',
installments: 123,
external_reference: '<string>'
})
};
fetch('https://pay.autorizou.dev/api/v1/pos/sales', 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://pay.autorizou.dev/api/v1/pos/sales",
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([
'terminal_code' => '<string>',
'amount' => 123,
'payment_method' => '<string>',
'installments' => 123,
'external_reference' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json",
"Idempotency-Key: <idempotency-key>"
],
]);
$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://pay.autorizou.dev/api/v1/pos/sales"
payload := strings.NewReader("{\n \"terminal_code\": \"<string>\",\n \"amount\": 123,\n \"payment_method\": \"<string>\",\n \"installments\": 123,\n \"external_reference\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Idempotency-Key", "<idempotency-key>")
req.Header.Add("Authorization", "Bearer <token>")
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://pay.autorizou.dev/api/v1/pos/sales")
.header("Idempotency-Key", "<idempotency-key>")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"terminal_code\": \"<string>\",\n \"amount\": 123,\n \"payment_method\": \"<string>\",\n \"installments\": 123,\n \"external_reference\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://pay.autorizou.dev/api/v1/pos/sales")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Idempotency-Key"] = '<idempotency-key>'
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"terminal_code\": \"<string>\",\n \"amount\": 123,\n \"payment_method\": \"<string>\",\n \"installments\": 123,\n \"external_reference\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"uuid": "<string>",
"state": "<string>",
"amount": 123,
"currency": "<string>",
"payment_method": "<string>",
"installments": 123,
"external_reference": "<string>",
"terminal": {},
"payment": {},
"created_at": "<string>"
}Inicia uma venda presencial na maquininha a partir da sua aplicação (um caixa, uma comanda, um
sistema de vendas). Você informa o terminal e o valor; a Autorizou dispara a cobrança no
aparelho, o portador paga, e a mesma chamada devolve o resultado.
A venda nasce escopada ao lojista da sua chave de API — você não envia
merchant_id. A divisão
(split) para o recebedor dono do terminal é aplicada automaticamente; você não informa recebedor.
Chamada síncrona: a sua aplicação aguarda enquanto o portador paga no aparelho. O desfecho
(
approved, declined ou unknown) volta no corpo da resposta. Para o guia de integração ponta a
ponta, veja Aceitar pagamento na maquininha.Cabeçalhos
string
required
Chave de idempotência da venda. Reenviar a mesma chave não dispara uma segunda cobrança no
aparelho — devolve a venda já em andamento (ou seu resultado final). É o que torna seguro repetir a
chamada após timeout ou queda de rede. Use um valor único por venda (ex.: o ID da venda no seu
sistema).
Parâmetros
string
required
Código do terminal onde a venda será cobrada. É o identificador do aparelho no seu inventário.
integer
required
Valor da venda em centavos (ex.:
5200 = R$ 52,00).string
required
Método presencial:
credit_card ou debit_card.integer
Número de parcelas no crédito (1 a 12). Padrão
1. Ignorado para debit_card.string
A sua referência própria da venda (ex.: número do pedido/comanda). Volta em todos os eventos e na
consulta, para você conciliar sem guardar o
uuid da Autorizou.cURL
curl -X POST "https://pay.autorizou.dev/api/v1/pos/sales" \
-H "Authorization: Bearer SUA_CHAVE" \
-H "Idempotency-Key: venda-8842" \
-H "Content-Type: application/json" \
-d '{
"terminal_code": "POI0X9Q2T7K",
"amount": 5200,
"payment_method": "credit_card",
"installments": 3,
"external_reference": "PEDIDO-8842"
}'
Resposta
O corpo traz a venda no estado final da tentativa. Trate o campostate sempre — ele é a fonte da
verdade do desfecho.
{
"uuid": "7c9e3b21-4a8d-4f16-9b2c-1d3e5f7a9c04",
"state": "approved",
"amount": 5200,
"currency": "BRL",
"payment_method": "credit_card",
"installments": 3,
"external_reference": "PEDIDO-8842",
"terminal": {
"code": "POI0X9Q2T7K",
"serial_number": "S123456",
"model": "AMS1"
},
"payment": {
"uuid": "AUTOCC01KW2P8M4Q7K3M9QP",
"status": "authorized"
},
"created_at": "2026-07-05 14:22:10"
}
string
Identificador único da venda na Autorizou. Use-o para consultar o estado em
GET /pos/sales/{identifier}.string
Desfecho da venda:
approved, declined, unknown ou aborted. Veja a tabela abaixo.integer
Valor cobrado, em centavos.
string
Moeda da venda (ex.:
BRL).string
credit_card ou debit_card.integer
Parcelas aplicadas.
string
A referência que você enviou.
object
O terminal onde a venda foi cobrada:
code, serial_number e model.object
A cobrança gerada quando a venda é aprovada:
uuid e status. Ausente quando state não é
approved.string
Data/hora de criação da venda.
Estados da venda
state | O que significa | O que a sua aplicação faz |
|---|---|---|
approved | Pagamento aprovado no aparelho | Concluir a venda. O webhook payment.authorized chega em seguida com o bloco pos |
declined | Pagamento recusado pelo portador/emissor | Oferecer nova tentativa (nova chamada, nova Idempotency-Key) |
aborted | Cancelada antes de pagar (operador/portador desistiu no aparelho) | Encerrar sem cobrança |
unknown | Ainda não sabemos o resultado — timeout ou queda no meio da cobrança | Consultar GET /pos/sales/{identifier} até resolver. Nunca reenviar a venda cegamente |
A regra de ouro:
unknown não é falha — é “ainda não sei”. Reenviar a venda nesse estado
pode cobrar o cliente duas vezes. Se precisar repetir a chamada por segurança de rede, use a
mesma Idempotency-Key: você recebe a venda em andamento, não uma segunda cobrança.Erros
declined, aborted e unknown são desfechos de negócio e voltam com HTTP 200 — não são erros
de API. Os erros abaixo são de validação/requisição:
| HTTP | Quando |
|---|---|
401 | Chave de API ausente ou inválida |
404 | terminal_code não existe ou não pertence ao seu lojista |
422 | Corpo inválido (valor abaixo do mínimo, payment_method desconhecido, installments fora do intervalo) |