Cancelar pedido (parceiros)
curl --request POST \
--url https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>",
"cancellationType": "<string>",
"cancellationNote": "<string>",
"cancellationGroup": "<string>"
}
'import requests
url = "https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel"
payload = {
"reason": "<string>",
"cancellationType": "<string>",
"cancellationNote": "<string>",
"cancellationGroup": "<string>"
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
reason: '<string>',
cancellationType: '<string>',
cancellationNote: '<string>',
cancellationGroup: '<string>'
})
};
fetch('https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel', 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://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel",
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([
'reason' => '<string>',
'cancellationType' => '<string>',
'cancellationNote' => '<string>',
'cancellationGroup' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"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://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel"
payload := strings.NewReader("{\n \"reason\": \"<string>\",\n \"cancellationType\": \"<string>\",\n \"cancellationNote\": \"<string>\",\n \"cancellationGroup\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
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://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\",\n \"cancellationType\": \"<string>\",\n \"cancellationNote\": \"<string>\",\n \"cancellationGroup\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\",\n \"cancellationType\": \"<string>\",\n \"cancellationNote\": \"<string>\",\n \"cancellationGroup\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"data.reasonDetail": "<string>",
"data.resolvedFrom": {}
}APIs de parceiro
Cancelar pedido (parceiros)
Cancela um pedido injetado pelo seu id externo. Executa a política de cancelamento.
POST
/
api
/
v1
/
adapters
/
xmart
/
stores
/
orders
/
{orderId}
/
cancel
Cancelar pedido (parceiros)
curl --request POST \
--url https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel \
--header 'Authorization: <authorization>' \
--header 'Content-Type: application/json' \
--data '
{
"reason": "<string>",
"cancellationType": "<string>",
"cancellationNote": "<string>",
"cancellationGroup": "<string>"
}
'import requests
url = "https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel"
payload = {
"reason": "<string>",
"cancellationType": "<string>",
"cancellationNote": "<string>",
"cancellationGroup": "<string>"
}
headers = {
"Authorization": "<authorization>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: '<authorization>', 'Content-Type': 'application/json'},
body: JSON.stringify({
reason: '<string>',
cancellationType: '<string>',
cancellationNote: '<string>',
cancellationGroup: '<string>'
})
};
fetch('https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel', 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://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel",
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([
'reason' => '<string>',
'cancellationType' => '<string>',
'cancellationNote' => '<string>',
'cancellationGroup' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: <authorization>",
"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://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel"
payload := strings.NewReader("{\n \"reason\": \"<string>\",\n \"cancellationType\": \"<string>\",\n \"cancellationNote\": \"<string>\",\n \"cancellationGroup\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "<authorization>")
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://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel")
.header("Authorization", "<authorization>")
.header("Content-Type", "application/json")
.body("{\n \"reason\": \"<string>\",\n \"cancellationType\": \"<string>\",\n \"cancellationNote\": \"<string>\",\n \"cancellationGroup\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.fire.rest/api/v1/adapters/xmart/stores/orders/{orderId}/cancel")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = '<authorization>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"reason\": \"<string>\",\n \"cancellationType\": \"<string>\",\n \"cancellationNote\": \"<string>\",\n \"cancellationGroup\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"message": "<string>",
"data.reasonDetail": "<string>",
"data.resolvedFrom": {}
}Cancela um pedido que você injetou, buscando-o pelo id externo que você deu a ele.
Diferente do endpoint de backoffice, você não precisa guardar o nosso UUID interno.
O Fire resolve sozinho qual dos dois casos se aplica, pela configuração daquela conta, país e
vendor. Você não precisa descobrir: se a nota de crédito se aplica a você, o
Este endpoint executa a política de cancelamento: as regras do Fire mais as que a conta
tiver configurado. Antes de tentar, você pode perguntar à Elegibilidade de
cancelamento, que devolve o mesmo veredito e os
mesmos
code com um 200 e sem efeitos.A ordem dos passos depende do gateway fiscal
É a parte que mais se erra ao integrar, e a única em que a ordem importa.- Com numeração por gateway
- Sem numeração por gateway
O comprovante é numerado pelo Fire, então o cancelamento fiscal vem primeiro:É o mesmo padrão da emissão — primeiro o fato fiscal, depois o pedido —, e por isso é
fácil de lembrar: anula-se do mesmo jeito que se emite.Se você inverter os passos, este endpoint responde
1
Anular o comprovante
POST /api/v2/external/fiscal/numbering com operation: "CANCEL". Devolve a nota de
crédito. Ver Numeração fiscal v2.2
Cancelar o pedido
Só agora, este endpoint.
409 com
FISCAL_REPRESENTATION_NOT_VOIDED. Não é transitório: repetir não resolve.Não há cancelamento fiscal prévio a pedir: cancela-se direto, com este endpoint e mais
nada.
409 avisa.
string
obrigatório
Bearer <api-key> com o escopo orders:write, restrita a um vendor.string
padrão:"es"
Idioma do motivo de uma recusa: Só afeta as regras próprias do Fire, que trazem etiquetas nos três idiomas. O texto de uma
regra configurada pela conta volta exatamente como a conta escreveu, no idioma em que estiver.
Sem este parâmetro, espanhol.
es, en ou pt. É o mesmo parâmetro que já usam
Elegibilidade e
Numeração fiscal.Vai na URL:POST https://app.fire.rest/api/v1/adapters/xmart/stores/orders/ORD-123/cancel?locale=pt
string
obrigatório
O id externo do pedido — o mesmo
orderId que você mandou ao injetá-lo. Não é o nosso
UUID interno: você não precisa guardá-lo.string
obrigatório
O motivo. Entre 5 e 500 caracteres. Com catálogo, o texto do motivo escolhido.
string
O id do motivo dentro do catálogo. Para canais de agregador precisa sair do catálogo SAG.
string
Nota livre, até 500 caracteres. Guardada à parte do motivo.
string
O grupo. Não precisa mandar: o backend deriva.
O que uma recusa traz
Além docode, o corpo de um 409 traz o motivo pronto para exibir:
string
A manchete: o nome da regra que recusou. É o que cabe num aviso curto.
string
O porquê, longo. Só vem se a regra tiver. Viaja separado do
message para que você possa
exibir só a manchete quando não há espaço para mais.O número por trás da recusa, quando a regra compara um: o limite e o valor real. Permite
dizer «passou 17 minutos» sem interpretar o texto.
object
Com quais dados decidiu. É o recibo para diagnosticar, não para mostrar a uma pessoa.
Códigos de recusa
Todos saem com409. Ramifique por code, nunca pela mensagem: o texto é para uma pessoa
ler e pode mudar ou ser traduzido sem aviso.
code | O que aconteceu | O que fazer |
|---|---|---|
CANCELLATION_IN_PROGRESS | Já há um cancelamento em andamento. | Aguardar; não repetir em laço. |
FISCAL_ALREADY_CANCELLED | O documento fiscal já está anulado. | Nada: o efeito desejado já ocorreu. |
ORDER_NOT_CANCELLABLE | O pedido já está fechado ou cancelado. | Nada: é estado terminal. |
FISCAL_REPRESENTATION_NOT_VOIDED | Há nota fiscal e ainda não há nota de crédito. | Pedir primeiro o cancelamento fiscal, aguardar a resposta, e só então cancelar. |
BUSINESS_DAY_CLOSED | O pedido é de um dia de operação já fechado, ou anterior ao ativo. | Não se cancela pela API: cabe um ajuste contábil. |
CANCELLATION_POLICY_DENIED | Uma regra configurada pela conta negou. | Ler message: o motivo foi escrito pelo cliente. |
Um
200 significa que o pedido foi cancelado. Não significa que o documento fiscal
já esteja anulado: com gateway você fez isso no passo anterior, e com emissão nativa se
resolve depois, pelo callback do provedor.
