TEF Mobile ⭐
O módulo mais direto: seu sistema solicita o pagamento, o Smart POS processa.
O Smart POS opera como um terminal TEF integrado ao seu sistema — sem Pinpad externo, sem operação manual de valor. O operador só confirma e aproxima/insere o cartão.
Endpoints
| Método | Endpoint | Descrição |
|---|---|---|
POST | /pos-venda | Iniciar uma transação |
GET | /pos-venda/{identificador} | Consultar status da transação |
DELETE | /pos-venda/{identificador} | Interromper solicitação |
DELETE | /pos-venda/{identificador}?forca=true | Forçar interrupção (em processamento) |
Validando no portal antes de integrar
No Portal do Cliente, você pode criar e acompanhar transações TEF Mobile sem escrever código — útil para validar o fluxo completo no seu ambiente de homologação antes de iniciar a integração.
Iniciando uma transação
Defina qual Smart POS receberá a transação e faça a requisição:
Dispositivo é obrigatório
No TEF Mobile o PinPdvId é obrigatório — a transação é enviada diretamente para um Smart POS específico. Use o id obtido na consulta de dispositivos.
O valor da transação é obrigatório. O tipo de pagamento é opcional — se informado, o número de parcelas torna-se obrigatório.
Os valores de TipoPagamento, status de venda e de pagamento estão em Referência.
curl --request POST \
--url 'https://api.pinpdv.com.br/pos-venda' \
--header 'Authorization: Bearer {SEU_TOKEN}' \
--header 'Content-Type: application/json' \
--data '{
"PinPdvId": 1,
"Identificador": "pedido-001",
"Valor": 100.11,
"Descricao": "Pedido #001",
"TipoPagamento": 2,
"Parcelas": 1
}'200 - OK
{
"id": 61239,
"identificador": "pedido-001",
"descricao": "Pedido #001",
"valor": 100.11,
"parcelas": 1,
"expiraEm": "2026-06-12T09:31:00-03:00",
"tipoPagamento": 2,
"pagamentoTipo": { "key": 2, "value": "Credito" },
"status": { "key": 0, "value": "Aguardando" },
"situacao": { "key": 0, "value": "Aguardando" },
"vendas": []
}A resposta já traz a solicitação criada em Aguardando, com o array vendas vazio — ele será preenchido quando o pagamento for processado.
O Identificador é definido pelo seu sistema — use o ID do pedido ou qualquer referência única. Você vai usá-lo para consultar o status.
Acompanhando o status
Depois de iniciar a transação, você precisa saber o que aconteceu — se o pagamento foi aprovado, negado ou se o operador abandonou a operação. Há duas formas de receber esse retorno; escolha a que melhor se encaixa no seu sistema:
| Forma | Quando usar | Como funciona |
|---|---|---|
| Webhook (recomendado) | Você tem um endpoint público para receber notificações | O PINPDV avisa o seu sistema a cada alteração na venda — você não precisa ficar perguntando |
| Polling | Você não tem URL pública ou prefere consultar sob demanda | O seu sistema pergunta o status periodicamente |
Webhook (o PINPDV avisa você)
Cadastre uma URL de webhook no Portal do Cliente PINPDV. A partir daí, o PINPDV chama sua URL via POST automaticamente a cada mudança na venda — criação, atualização de status e conclusão — enviando o mesmo conteúdo da consulta de status. É o caminho mais eficiente: dispensa polling e respeita o rate limit naturalmente.
O payload, a ativação da URL e o uso da resposta estão detalhados em Webhook.
Polling (o seu sistema pergunta)
Se não houver webhook cadastrado, consulte periodicamente o status usando o Identificador definido na criação. Respeite o rate limit de 1 requisição por segundo.
curl --request GET \
--url 'https://api.pinpdv.com.br/pos-venda/{Identificador}' \
--header 'Authorization: Bearer {SEU_TOKEN}'Como interpretar a resposta
A resposta tem três níveis hierárquicos. Cada nível tem seu próprio status — leia de fora para dentro:
| Nível | Campo | O que indica |
|---|---|---|
| 1 — Requisição | status.value | Se o processamento da chamada foi finalizado. "Concluido" = processamento encerrado |
| 2 — Venda | vendas[].status.value | Se a venda foi realizada. "Realizada" = venda concluída com sucesso |
| 3 — Transações | vendas[].transacoes[].status.value | Cada tentativa de pagamento. "Aprovada" = aprovada; qualquer outro valor ("Negado", "CanceladaOperador", etc.) = sem pagamento |
Onde está o pagamento aprovado?
O pagamento confirmado fica em vendas[0].transacoes[]. Pode haver mais de uma transação se o portador tentou o cartão mais de uma vez — procure a com status.value = "Aprovada".
Uma transação negada não terá os campos nsu, autorizacao, bandeira e adquirente — a maquininha não retorna esses dados quando rejeita o pagamento.
Boas práticas de polling:
- Consulte a cada 1 segundo (respeitando o rate limit)
- Considere pagamento confirmado quando
vendas[0].transacoescontiver uma entrada comstatus.value = "Aprovada"— qualquer outro status de transação (negada, cancelada pelo operador, etc.) deve ser tratado como sem pagamento - Defina um timeout máximo de espera no seu sistema (ex.: 3 minutos) para lidar com casos em que o operador abandona a operação sem cancelar
- Use o
Identificadorque você definiu na criação — não oidnumérico retornado
Exemplo — pagamento aprovado (o portador tentou o cartão duas vezes: a primeira foi negada, a segunda aprovada — ambas ficam registradas na mesma venda):
200 - OK
{
"id": 177179,
"identificador": "TEF-GN-NEGAPROV2-0207171052",
"valor": 31.50,
"status": {
"key": 2,
"value": "Concluido"
},
"vendas": [
{
"identificador": "095cd66fd1b14a7197a90a3e4b4ccf3e",
"valor": 31.50,
"status": {
"key": 0,
"value": "Realizada"
},
"transacoes": [
{
"valor": 31.50,
"parcelas": 1,
"status": {
"key": 5,
"value": "Negado"
},
"tipoPagamento": 2,
"dados": {
"dataHora": "2026-07-02T17:10:54.085",
"nsu": null,
"autorizacao": null,
"bandeira": null,
"adquirente": null
}
},
{
"valor": 31.50,
"parcelas": 1,
"status": {
"key": 0,
"value": "Aprovada"
},
"tipoPagamento": 2,
"dados": {
"dataHora": "2026-07-02T17:11:14.799",
"nsu": "000000353",
"autorizacao": "164550",
"bandeira": "MASTERCARD",
"adquirente": "Getnet"
}
}
],
"pinPdv": {
"codigo": "283190",
"nome": "Getnet 283190"
}
}
]
}Exemplo — sem pagamento aprovado (operador cancelou a operação no Smart POS antes de concluir o pagamento):
200 - OK
{
"id": 177186,
"identificador": "TEF-GN-CANCEL-0207171239",
"valor": 9.99,
"status": {
"key": 2,
"value": "Concluido"
},
"vendas": [
{
"identificador": "b778c9f4e06d4f05944c9913b9b5e299",
"valor": 9.99,
"status": {
"key": 8,
"value": "Cancelada"
},
"transacoes": [
{
"valor": 9.99,
"parcelas": 1,
"status": {
"key": 78,
"value": "CanceladaOperador"
},
"tipoPagamento": 3,
"dados": {
"dataHora": "2026-07-02T17:12:42.258",
"nsu": null,
"autorizacao": null,
"bandeira": null,
"adquirente": null
}
}
],
"pinPdv": {
"codigo": "283190",
"nome": "Getnet 283190"
}
}
]
}Repare que, mesmo com status.value = "Concluido" no nível 1 (a requisição terminou de processar), o nível 2 (vendas[0].status.value) já indica "Cancelada" em vez de "Realizada" — sinal de que não houve pagamento, sem precisar nem chegar ao nível 3.
Interrompendo uma transação
Enquanto o Smart POS não iniciar a transação, é possível cancelar a solicitação pelo sistema:
curl --request DELETE \
--url 'https://api.pinpdv.com.br/pos-venda/{Identificador}' \
--header 'Authorization: Bearer {SEU_TOKEN}'202 - AcceptedAtenção
Uma vez iniciada a transação no Smart POS, a solicitação só pode ser interrompida pelo próprio app ou pelo método forçado.
Interrupção forçada
Se precisar interromper uma solicitação TEF MOBILE que já está em processamento utilize o método forçado. Ele exclui a solicitação TEF MOBILE.
Cancelamento de venda já paga
Estorno é presencial, no Smart POS
Por decisão de segurança, o estorno de uma venda já concluída é realizado presencialmente no terminal, pelo operador, na seção Cobranças do app PINPDV — e por isso não é exposto como endpoint de API. Essa etapa exige a transação física no Smart POS para concluir o estorno junto à adquirente.
Algumas adquirentes não disponibilizam a solicitação de estorno pelo PINPDV — nesses casos, o estorno deve ser feito diretamente no app da adquirente.
curl --request DELETE \
--url 'https://api.pinpdv.com.br/pos-venda/{Identificador}?forca=true' \
--header 'Authorization: Bearer {SEU_TOKEN}'202 - AcceptedEnvie sua impressão
Ao concluir a transação, o Smart POS pode imprimir o conteúdo que você enviar — comprovante, cupom ou qualquer texto livre — via webhook ou PUT /comprovante. O fluxo completo (formato, modos de envio e QR Code) está em Impressão.