{
  "info": {
    "name": "Gototem API pública (v1)",
    "description": "Coleção gerada do contrato da Gototem API pública (somente leitura). Antes de enviar, preencha a variável api_key com a chave que o dono da conta copiou no painel (Chaves da API). Depois envie as requisições na ordem das pastas: copie o id de uma loja de \"As lojas da chave\" para a variável place_id e, se for filtrar por evento, o id de \"Os eventos de uma loja\" para event_id. O período das consultas (date_from e date_to) é calculado a cada envio: os últimos 7 dias. Não existe ambiente de teste: as chamadas vão para a produção e contam no limite de uso da chave. Só as rotas que já estão no ar.",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_key}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// Período das consultas: os últimos 7 dias, em UTC com Z.",
          "var agora = new Date();",
          "agora.setUTCMilliseconds(0);",
          "var inicio = new Date(agora.getTime() - 7 * 24 * 60 * 60 * 1000);",
          "var semMilissegundos = function (data) { return data.toISOString().replace(\".000Z\", \"Z\"); };",
          "pm.collectionVariables.set(\"date_from\", semMilissegundos(inicio));",
          "pm.collectionVariables.set(\"date_to\", semMilissegundos(agora));"
        ]
      }
    }
  ],
  "variable": [
    {
      "key": "base_url",
      "value": "https://api.gototem.com.br",
      "description": "Endereço da API. Já vem com o de produção."
    },
    {
      "key": "api_key",
      "value": "",
      "description": "A chave que o dono da conta copiou no painel (Chaves da API). Começa com gtpk_."
    },
    {
      "key": "place_id",
      "value": "",
      "description": "O id de uma loja: copie de \"As lojas da chave\" (GET /v1/api-public/places)."
    },
    {
      "key": "event_id",
      "value": "",
      "description": "O id de um evento da loja (opcional): copie de \"Os eventos de uma loja\" (GET /v1/api-public/events)."
    },
    {
      "key": "date_from",
      "value": "",
      "description": "Início do período. Preenchida sozinha a cada envio pelo script da coleção: 7 dias atrás, em UTC. Para outro período, troque o valor do parâmetro from na requisição."
    },
    {
      "key": "date_to",
      "value": "",
      "description": "Fim do período. Preenchida sozinha a cada envio pelo script da coleção: agora, em UTC. Para outro período, troque o valor do parâmetro to na requisição."
    }
  ],
  "item": [
    {
      "name": "Conta e acesso",
      "description": "A própria chave e o que ela alcança.",
      "item": [
        {
          "name": "Quem é esta chave",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});",
                  "pm.test(\"A resposta traz os campos principais\", function () {",
                  "    var corpo = pm.response.json();",
                  "    pm.expect(corpo, \"credential\").to.have.property(\"credential\");",
                  "    pm.expect(corpo.credential, \"credential.id\").to.have.property(\"id\");",
                  "    pm.expect(corpo.credential, \"credential.name\").to.have.property(\"name\");",
                  "    pm.expect(corpo.credential, \"credential.permissions\").to.have.property(\"permissions\");",
                  "    pm.expect(corpo.credential, \"credential.expires_at\").to.have.property(\"expires_at\");",
                  "    pm.expect(corpo.credential, \"credential.superseded\").to.have.property(\"superseded\");",
                  "    pm.expect(corpo.credential, \"credential.superseded_until\").to.have.property(\"superseded_until\");",
                  "    pm.expect(corpo, \"account\").to.have.property(\"account\");",
                  "    pm.expect(corpo.account, \"account.id\").to.have.property(\"id\");",
                  "    pm.expect(corpo.account, \"account.name\").to.have.property(\"name\");",
                  "    pm.expect(corpo, \"rate_limit\").to.have.property(\"rate_limit\");",
                  "    pm.expect(corpo, \"server_time\").to.have.property(\"server_time\");",
                  "    pm.expect(corpo, \"api_version\").to.have.property(\"api_version\");",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/api-public/ping",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "api-public",
                "ping"
              ]
            },
            "description": "Diz a quem a chave pertence: a credencial, as permissões e a validade dela (`expires_at`), a conta, os limites em vigor e a hora do servidor em UTC. É a chamada para testar uma chave. `superseded` vem `true` quando a chamada usou a chave anterior de uma rotação, que vale só até `superseded_until`. `rate_limit` vem `null` quando nenhum limite está sendo aplicado no momento."
          },
          "response": [
            {
              "name": "Resposta 200 (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/ping",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "ping"
                  ]
                },
                "description": "Diz a quem a chave pertence: a credencial, as permissões e a validade dela (`expires_at`), a conta, os limites em vigor e a hora do servidor em UTC. É a chamada para testar uma chave. `superseded` vem `true` quando a chamada usou a chave anterior de uma rotação, que vale só até `superseded_until`. `rate_limit` vem `null` quando nenhum limite está sendo aplicado no momento."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"credential\": {\n    \"id\": \"Cr3d3nc14lId00000000000000000001\",\n    \"name\": \"Aplicativo de vendas\",\n    \"permissions\": [\n      \"sale-by-payment-method.view\",\n      \"event.view\"\n    ],\n    \"expires_at\": \"2027-10-11T02:59:59Z\",\n    \"superseded\": false,\n    \"superseded_until\": null\n  },\n  \"account\": {\n    \"id\": \"C0nt4Id0000000000000000000000001\",\n    \"name\": \"Restaurante Exemplo\"\n  },\n  \"rate_limit\": {\n    \"default_per_minute\": 60,\n    \"heavy_per_minute\": 10\n  },\n  \"server_time\": \"2026-10-08T17:51:06Z\",\n  \"api_version\": \"v1\"\n}"
            },
            {
              "name": "Erro 401: chave ausente, errada ou que deixou de valer (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/ping",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "ping"
                  ]
                },
                "description": "Diz a quem a chave pertence: a credencial, as permissões e a validade dela (`expires_at`), a conta, os limites em vigor e a hora do servidor em UTC. É a chamada para testar uma chave. `superseded` vem `true` quando a chamada usou a chave anterior de uma rotação, que vale só até `superseded_until`. `rate_limit` vem `null` quando nenhum limite está sendo aplicado no momento."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 401: a chave deixou de valer, com o motivo em reason (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/ping",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "ping"
                  ]
                },
                "description": "Diz a quem a chave pertence: a credencial, as permissões e a validade dela (`expires_at`), a conta, os limites em vigor e a hora do servidor em UTC. É a chamada para testar uma chave. `superseded` vem `true` quando a chamada usou a chave anterior de uma rotação, que vale só até `superseded_until`. `rate_limit` vem `null` quando nenhum limite está sendo aplicado no momento."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"reason\": \"revoked\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 422: parâmetro desconhecido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/ping?status=paid",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "ping"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "paid"
                    }
                  ]
                },
                "description": "Diz a quem a chave pertence: a credencial, as permissões e a validade dela (`expires_at`), a conta, os limites em vigor e a hora do servidor em UTC. É a chamada para testar uma chave. `superseded` vem `true` quando a chamada usou a chave anterior de uma rotação, que vale só até `superseded_until`. `rate_limit` vem `null` quando nenhum limite está sendo aplicado no momento."
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                }
              ],
              "body": "{\n  \"code\": \"invalid_parameter\",\n  \"param\": \"status\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unprocessable Entity\",\n  \"status\": 422,\n  \"detail\": \"Unknown parameter(s): status. Accepted: none.\"\n}"
            },
            {
              "name": "Erro 429: limite de uso atingido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/ping",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "ping"
                  ]
                },
                "description": "Diz a quem a chave pertence: a credencial, as permissões e a validade dela (`expires_at`), a conta, os limites em vigor e a hora do servidor em UTC. É a chamada para testar uma chave. `superseded` vem `true` quando a chamada usou a chave anterior de uma rotação, que vale só até `superseded_until`. `rate_limit` vem `null` quando nenhum limite está sendo aplicado no momento."
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "Retry-After",
                  "value": "60"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "0"
                }
              ],
              "body": "{\n  \"code\": \"rate_limited\",\n  \"type\": \"about:blank\",\n  \"title\": \"Too Many Requests\",\n  \"status\": 429,\n  \"detail\": \"Rate limit exceeded for this API key. Retry after the time in the Retry-After header.\"\n}"
            }
          ]
        },
        {
          "name": "As lojas da chave",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});",
                  "pm.test(\"A resposta traz os campos principais\", function () {",
                  "    var corpo = pm.response.json();",
                  "    pm.expect(corpo, \"all\").to.have.property(\"all\");",
                  "    pm.expect(corpo, \"data\").to.have.property(\"data\");",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/api-public/places",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "api-public",
                "places"
              ]
            },
            "description": "Todas as lojas que a chave alcança, de uma vez (sem paginação). O `id` de cada uma é o que vai no parâmetro `place` das outras rotas, e `timezone` é o fuso para montar o dia da loja."
          },
          "response": [
            {
              "name": "Resposta 200 (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/places",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "places"
                  ]
                },
                "description": "Todas as lojas que a chave alcança, de uma vez (sem paginação). O `id` de cada uma é o que vai no parâmetro `place` das outras rotas, e `timezone` é o fuso para montar o dia da loja."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"all\": false,\n  \"data\": [\n    {\n      \"id\": \"L0j4C3ntr0Id00000000000000000000\",\n      \"name\": \"Loja Centro\",\n      \"timezone\": \"America/Sao_Paulo\",\n      \"active\": true\n    },\n    {\n      \"id\": \"L0j4M4n4usId00000000000000000000\",\n      \"name\": \"Loja Manaus\",\n      \"timezone\": \"America/Manaus\",\n      \"active\": true\n    }\n  ]\n}"
            },
            {
              "name": "Erro 401: chave ausente, errada ou que deixou de valer (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/places",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "places"
                  ]
                },
                "description": "Todas as lojas que a chave alcança, de uma vez (sem paginação). O `id` de cada uma é o que vai no parâmetro `place` das outras rotas, e `timezone` é o fuso para montar o dia da loja."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 401: a chave deixou de valer, com o motivo em reason (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/places",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "places"
                  ]
                },
                "description": "Todas as lojas que a chave alcança, de uma vez (sem paginação). O `id` de cada uma é o que vai no parâmetro `place` das outras rotas, e `timezone` é o fuso para montar o dia da loja."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"reason\": \"revoked\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 422: parâmetro desconhecido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/places?status=paid",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "places"
                  ],
                  "query": [
                    {
                      "key": "status",
                      "value": "paid"
                    }
                  ]
                },
                "description": "Todas as lojas que a chave alcança, de uma vez (sem paginação). O `id` de cada uma é o que vai no parâmetro `place` das outras rotas, e `timezone` é o fuso para montar o dia da loja."
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                }
              ],
              "body": "{\n  \"code\": \"invalid_parameter\",\n  \"param\": \"status\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unprocessable Entity\",\n  \"status\": 422,\n  \"detail\": \"Unknown parameter(s): status. Accepted: none.\"\n}"
            },
            {
              "name": "Erro 429: limite de uso atingido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/places",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "places"
                  ]
                },
                "description": "Todas as lojas que a chave alcança, de uma vez (sem paginação). O `id` de cada uma é o que vai no parâmetro `place` das outras rotas, e `timezone` é o fuso para montar o dia da loja."
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "Retry-After",
                  "value": "60"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "0"
                }
              ],
              "body": "{\n  \"code\": \"rate_limited\",\n  \"type\": \"about:blank\",\n  \"title\": \"Too Many Requests\",\n  \"status\": 429,\n  \"detail\": \"Rate limit exceeded for this API key. Retry after the time in the Retry-After header.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Eventos e ingressos",
      "description": "Os eventos de uma loja.",
      "item": [
        {
          "name": "Os eventos de uma loja",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});",
                  "pm.test(\"A resposta traz os campos principais\", function () {",
                  "    var corpo = pm.response.json();",
                  "    pm.expect(corpo, \"place\").to.have.property(\"place\");",
                  "    pm.expect(corpo, \"search\").to.have.property(\"search\");",
                  "    pm.expect(corpo, \"data\").to.have.property(\"data\");",
                  "    pm.expect(corpo, \"next_cursor\").to.have.property(\"next_cursor\");",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/api-public/events?place={{place_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "api-public",
                "events"
              ],
              "query": [
                {
                  "key": "place",
                  "value": "{{place_id}}",
                  "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                },
                {
                  "key": "search",
                  "value": "",
                  "description": "Parte do nome do evento, sem diferenciar maiúsculas nem acentos (1 a 100 caracteres). `%`, `_` e `\\` são texto comum, não curingas. Caractere de controle ou invisível em qualquer posição responde `422`.",
                  "disabled": true
                },
                {
                  "key": "cursor",
                  "value": "",
                  "description": "O `next_cursor` da página anterior, da mesma consulta. Em `/events`, o cursor de outra loja responde `422` com `param` igual a `cursor`.",
                  "disabled": true
                },
                {
                  "key": "limit",
                  "value": "",
                  "description": "Itens por página, de 1 a 100 (padrão 50). Acima de 100 é recusado.",
                  "disabled": true
                }
              ]
            },
            "description": "Os eventos de uma loja da chave, do cadastrado mais recentemente para o mais antigo, paginados por cursor. Eventos desativados também aparecem. O `id` de cada um é o que vai no parâmetro `event` dos recebimentos."
          },
          "response": [
            {
              "name": "Resposta 200 (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/events?place={{place_id}}&search=rock",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "events"
                  ],
                  "query": [
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "search",
                      "value": "rock",
                      "description": "Parte do nome do evento, sem diferenciar maiúsculas nem acentos (1 a 100 caracteres). `%`, `_` e `\\` são texto comum, não curingas. Caractere de controle ou invisível em qualquer posição responde `422`."
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "O `next_cursor` da página anterior, da mesma consulta. Em `/events`, o cursor de outra loja responde `422` com `param` igual a `cursor`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "Itens por página, de 1 a 100 (padrão 50). Acima de 100 é recusado.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Os eventos de uma loja da chave, do cadastrado mais recentemente para o mais antigo, paginados por cursor. Eventos desativados também aparecem. O `id` de cada um é o que vai no parâmetro `event` dos recebimentos."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"place\": \"L0j4C3ntr0Id00000000000000000000\",\n  \"search\": \"rock\",\n  \"data\": [\n    {\n      \"id\": \"Ev3nt0Id000000000000000000000001\",\n      \"name\": \"Rock Night\",\n      \"starts_at\": \"2026-10-09T23:00:00Z\",\n      \"ends_at\": \"2026-10-10T07:00:00Z\",\n      \"active\": true\n    }\n  ],\n  \"next_cursor\": null\n}"
            },
            {
              "name": "Erro 401: chave ausente, errada ou que deixou de valer (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/events?place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "events"
                  ],
                  "query": [
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "Parte do nome do evento, sem diferenciar maiúsculas nem acentos (1 a 100 caracteres). `%`, `_` e `\\` são texto comum, não curingas. Caractere de controle ou invisível em qualquer posição responde `422`.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "O `next_cursor` da página anterior, da mesma consulta. Em `/events`, o cursor de outra loja responde `422` com `param` igual a `cursor`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "Itens por página, de 1 a 100 (padrão 50). Acima de 100 é recusado.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Os eventos de uma loja da chave, do cadastrado mais recentemente para o mais antigo, paginados por cursor. Eventos desativados também aparecem. O `id` de cada um é o que vai no parâmetro `event` dos recebimentos."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 401: a chave deixou de valer, com o motivo em reason (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/events?place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "events"
                  ],
                  "query": [
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "Parte do nome do evento, sem diferenciar maiúsculas nem acentos (1 a 100 caracteres). `%`, `_` e `\\` são texto comum, não curingas. Caractere de controle ou invisível em qualquer posição responde `422`.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "O `next_cursor` da página anterior, da mesma consulta. Em `/events`, o cursor de outra loja responde `422` com `param` igual a `cursor`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "Itens por página, de 1 a 100 (padrão 50). Acima de 100 é recusado.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Os eventos de uma loja da chave, do cadastrado mais recentemente para o mais antigo, paginados por cursor. Eventos desativados também aparecem. O `id` de cada um é o que vai no parâmetro `event` dos recebimentos."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"reason\": \"revoked\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 403: falta a permissão da rota na chave (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/events?place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "events"
                  ],
                  "query": [
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "Parte do nome do evento, sem diferenciar maiúsculas nem acentos (1 a 100 caracteres). `%`, `_` e `\\` são texto comum, não curingas. Caractere de controle ou invisível em qualquer posição responde `422`.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "O `next_cursor` da página anterior, da mesma consulta. Em `/events`, o cursor de outra loja responde `422` com `param` igual a `cursor`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "Itens por página, de 1 a 100 (padrão 50). Acima de 100 é recusado.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Os eventos de uma loja da chave, do cadastrado mais recentemente para o mais antigo, paginados por cursor. Eventos desativados também aparecem. O `id` de cada um é o que vai no parâmetro `event` dos recebimentos."
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                }
              ],
              "body": "{\n  \"code\": \"forbidden_permission\",\n  \"required_permission\": \"event.view\",\n  \"type\": \"about:blank\",\n  \"title\": \"Forbidden\",\n  \"status\": 403,\n  \"detail\": \"This API key does not have the permission for this route.\"\n}"
            },
            {
              "name": "Erro 422: parâmetro desconhecido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/events?place={{place_id}}&status=paid",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "events"
                  ],
                  "query": [
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "Parte do nome do evento, sem diferenciar maiúsculas nem acentos (1 a 100 caracteres). `%`, `_` e `\\` são texto comum, não curingas. Caractere de controle ou invisível em qualquer posição responde `422`.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "O `next_cursor` da página anterior, da mesma consulta. Em `/events`, o cursor de outra loja responde `422` com `param` igual a `cursor`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "Itens por página, de 1 a 100 (padrão 50). Acima de 100 é recusado.",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "paid"
                    }
                  ]
                },
                "description": "Os eventos de uma loja da chave, do cadastrado mais recentemente para o mais antigo, paginados por cursor. Eventos desativados também aparecem. O `id` de cada um é o que vai no parâmetro `event` dos recebimentos."
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                }
              ],
              "body": "{\n  \"code\": \"invalid_parameter\",\n  \"param\": \"status\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unprocessable Entity\",\n  \"status\": 422,\n  \"detail\": \"Unknown parameter(s): status. Accepted: place, search, cursor, limit.\"\n}"
            },
            {
              "name": "Erro 429: limite de uso atingido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/events?place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "events"
                  ],
                  "query": [
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "search",
                      "value": "",
                      "description": "Parte do nome do evento, sem diferenciar maiúsculas nem acentos (1 a 100 caracteres). `%`, `_` e `\\` são texto comum, não curingas. Caractere de controle ou invisível em qualquer posição responde `422`.",
                      "disabled": true
                    },
                    {
                      "key": "cursor",
                      "value": "",
                      "description": "O `next_cursor` da página anterior, da mesma consulta. Em `/events`, o cursor de outra loja responde `422` com `param` igual a `cursor`.",
                      "disabled": true
                    },
                    {
                      "key": "limit",
                      "value": "",
                      "description": "Itens por página, de 1 a 100 (padrão 50). Acima de 100 é recusado.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Os eventos de uma loja da chave, do cadastrado mais recentemente para o mais antigo, paginados por cursor. Eventos desativados também aparecem. O `id` de cada um é o que vai no parâmetro `event` dos recebimentos."
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "Retry-After",
                  "value": "60"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "0"
                }
              ],
              "body": "{\n  \"code\": \"rate_limited\",\n  \"type\": \"about:blank\",\n  \"title\": \"Too Many Requests\",\n  \"status\": 429,\n  \"detail\": \"Rate limit exceeded for this API key. Retry after the time in the Retry-After header.\"\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Vendas e recebimentos",
      "description": "Vendas e recebimentos consolidados de um período.",
      "item": [
        {
          "name": "Recebimentos por método de pagamento",
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "pm.test(\"Status 200\", function () {",
                  "    pm.response.to.have.status(200);",
                  "});",
                  "pm.test(\"A resposta traz os campos principais\", function () {",
                  "    var corpo = pm.response.json();",
                  "    pm.expect(corpo, \"from\").to.have.property(\"from\");",
                  "    pm.expect(corpo, \"to\").to.have.property(\"to\");",
                  "    pm.expect(corpo, \"place\").to.have.property(\"place\");",
                  "    pm.expect(corpo, \"event\").to.have.property(\"event\");",
                  "    pm.expect(corpo, \"currency\").to.have.property(\"currency\");",
                  "    pm.expect(corpo, \"total\").to.have.property(\"total\");",
                  "    pm.expect(corpo.total, \"total.count\").to.have.property(\"count\");",
                  "    pm.expect(corpo.total, \"total.amount\").to.have.property(\"amount\");",
                  "    pm.expect(corpo, \"data\").to.have.property(\"data\");",
                  "});"
                ]
              }
            }
          ],
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/v1/api-public/sales/by-payment-method?from={{date_from}}&to={{date_to}}&place={{place_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "v1",
                "api-public",
                "sales",
                "by-payment-method"
              ],
              "query": [
                {
                  "key": "from",
                  "value": "{{date_from}}",
                  "description": "Início do período, **incluído**. Data ISO 8601 com fuso. Com `to`, no máximo 120 dias (sem teto em `/sales/by-payment-method` com `event`)."
                },
                {
                  "key": "to",
                  "value": "{{date_to}}",
                  "description": "Fim do período, **não incluído**. Data ISO 8601 com fuso."
                },
                {
                  "key": "place",
                  "value": "{{place_id}}",
                  "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                },
                {
                  "key": "event",
                  "value": "{{event_id}}",
                  "description": "O `id` de **um** evento dessa loja, vindo de `/events`. Só os recebimentos gravados com esse evento entram, e o teto de 120 dias deixa de valer. Limitação conhecida: recebimento de uma venda do evento que foi gravado sem o evento fica fora. Lista (`a,b`) responde `422`; evento que não existe ou é de outra loja responde `404` com `param` igual a `event`.",
                  "disabled": true
                }
              ]
            },
            "description": "Quanto uma loja recebeu no período, por método de pagamento e com a abertura por bandeira do cartão. Uma loja por chamada; com `event`, só os recebimentos daquele evento, sem o teto de 120 dias. O total soma os recebimentos pagos e **não desconta estornos**; ficam fora recebimento não pago ou cancelado, venda de demonstração, consumo pago com saldo cashless, sangria e suprimento. Venda feita sem conexão chega depois e muda um período já consultado: reconsulte os últimos 3 dias. A conta atende duas consultas desta rota ao mesmo tempo: a terceira responde `429` com `Retry-After: 5`."
          },
          "response": [
            {
              "name": "Resposta 200 (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/sales/by-payment-method?from={{date_from}}&to={{date_to}}&place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "sales",
                    "by-payment-method"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "{{date_from}}",
                      "description": "Início do período, **incluído**. Data ISO 8601 com fuso. Com `to`, no máximo 120 dias (sem teto em `/sales/by-payment-method` com `event`)."
                    },
                    {
                      "key": "to",
                      "value": "{{date_to}}",
                      "description": "Fim do período, **não incluído**. Data ISO 8601 com fuso."
                    },
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "event",
                      "value": "{{event_id}}",
                      "description": "O `id` de **um** evento dessa loja, vindo de `/events`. Só os recebimentos gravados com esse evento entram, e o teto de 120 dias deixa de valer. Limitação conhecida: recebimento de uma venda do evento que foi gravado sem o evento fica fora. Lista (`a,b`) responde `422`; evento que não existe ou é de outra loja responde `404` com `param` igual a `event`.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Quanto uma loja recebeu no período, por método de pagamento e com a abertura por bandeira do cartão. Uma loja por chamada; com `event`, só os recebimentos daquele evento, sem o teto de 120 dias. O total soma os recebimentos pagos e **não desconta estornos**; ficam fora recebimento não pago ou cancelado, venda de demonstração, consumo pago com saldo cashless, sangria e suprimento. Venda feita sem conexão chega depois e muda um período já consultado: reconsulte os últimos 3 dias. A conta atende duas consultas desta rota ao mesmo tempo: a terceira responde `429` com `Retry-After: 5`."
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                }
              ],
              "body": "{\n  \"from\": \"2026-10-01T03:00:00Z\",\n  \"to\": \"2026-10-08T03:00:00Z\",\n  \"place\": \"L0j4C3ntr0Id00000000000000000000\",\n  \"event\": null,\n  \"currency\": \"BRL\",\n  \"total\": {\n    \"count\": 1234,\n    \"amount\": \"45678.90\"\n  },\n  \"data\": [\n    {\n      \"payment_method\": \"cash\",\n      \"label\": \"Dinheiro\",\n      \"count\": 100,\n      \"amount\": \"2500.00\",\n      \"share\": \"5.473\",\n      \"brands\": []\n    },\n    {\n      \"payment_method\": \"tef_credit\",\n      \"label\": \"TEF - Crédito\",\n      \"count\": 500,\n      \"amount\": \"25000.00\",\n      \"share\": \"54.730\",\n      \"brands\": [\n        {\n          \"brand\": \"MASTERCARD\",\n          \"count\": 300,\n          \"amount\": \"16000.00\",\n          \"share\": \"35.027\"\n        },\n        {\n          \"brand\": \"VISA\",\n          \"count\": 200,\n          \"amount\": \"9000.00\",\n          \"share\": \"19.703\"\n        }\n      ]\n    },\n    {\n      \"payment_method\": \"tef_pix\",\n      \"label\": \"TEF - Pix\",\n      \"count\": 634,\n      \"amount\": \"18178.90\",\n      \"share\": \"39.797\",\n      \"brands\": [\n        {\n          \"brand\": null,\n          \"count\": 634,\n          \"amount\": \"18178.90\",\n          \"share\": \"39.797\"\n        }\n      ]\n    }\n  ]\n}"
            },
            {
              "name": "Erro 401: chave ausente, errada ou que deixou de valer (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/sales/by-payment-method?from={{date_from}}&to={{date_to}}&place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "sales",
                    "by-payment-method"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "{{date_from}}",
                      "description": "Início do período, **incluído**. Data ISO 8601 com fuso. Com `to`, no máximo 120 dias (sem teto em `/sales/by-payment-method` com `event`)."
                    },
                    {
                      "key": "to",
                      "value": "{{date_to}}",
                      "description": "Fim do período, **não incluído**. Data ISO 8601 com fuso."
                    },
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "event",
                      "value": "{{event_id}}",
                      "description": "O `id` de **um** evento dessa loja, vindo de `/events`. Só os recebimentos gravados com esse evento entram, e o teto de 120 dias deixa de valer. Limitação conhecida: recebimento de uma venda do evento que foi gravado sem o evento fica fora. Lista (`a,b`) responde `422`; evento que não existe ou é de outra loja responde `404` com `param` igual a `event`.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Quanto uma loja recebeu no período, por método de pagamento e com a abertura por bandeira do cartão. Uma loja por chamada; com `event`, só os recebimentos daquele evento, sem o teto de 120 dias. O total soma os recebimentos pagos e **não desconta estornos**; ficam fora recebimento não pago ou cancelado, venda de demonstração, consumo pago com saldo cashless, sangria e suprimento. Venda feita sem conexão chega depois e muda um período já consultado: reconsulte os últimos 3 dias. A conta atende duas consultas desta rota ao mesmo tempo: a terceira responde `429` com `Retry-After: 5`."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 401: a chave deixou de valer, com o motivo em reason (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/sales/by-payment-method?from={{date_from}}&to={{date_to}}&place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "sales",
                    "by-payment-method"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "{{date_from}}",
                      "description": "Início do período, **incluído**. Data ISO 8601 com fuso. Com `to`, no máximo 120 dias (sem teto em `/sales/by-payment-method` com `event`)."
                    },
                    {
                      "key": "to",
                      "value": "{{date_to}}",
                      "description": "Fim do período, **não incluído**. Data ISO 8601 com fuso."
                    },
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "event",
                      "value": "{{event_id}}",
                      "description": "O `id` de **um** evento dessa loja, vindo de `/events`. Só os recebimentos gravados com esse evento entram, e o teto de 120 dias deixa de valer. Limitação conhecida: recebimento de uma venda do evento que foi gravado sem o evento fica fora. Lista (`a,b`) responde `422`; evento que não existe ou é de outra loja responde `404` com `param` igual a `event`.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Quanto uma loja recebeu no período, por método de pagamento e com a abertura por bandeira do cartão. Uma loja por chamada; com `event`, só os recebimentos daquele evento, sem o teto de 120 dias. O total soma os recebimentos pagos e **não desconta estornos**; ficam fora recebimento não pago ou cancelado, venda de demonstração, consumo pago com saldo cashless, sangria e suprimento. Venda feita sem conexão chega depois e muda um período já consultado: reconsulte os últimos 3 dias. A conta atende duas consultas desta rota ao mesmo tempo: a terceira responde `429` com `Retry-After: 5`."
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "WWW-Authenticate",
                  "value": "Bearer realm=\"gototem-public-api\""
                }
              ],
              "body": "{\n  \"code\": \"invalid_token\",\n  \"reason\": \"revoked\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unauthorized\",\n  \"status\": 401,\n  \"detail\": \"Invalid or missing API key.\"\n}"
            },
            {
              "name": "Erro 403: falta a permissão da rota na chave (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/sales/by-payment-method?from={{date_from}}&to={{date_to}}&place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "sales",
                    "by-payment-method"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "{{date_from}}",
                      "description": "Início do período, **incluído**. Data ISO 8601 com fuso. Com `to`, no máximo 120 dias (sem teto em `/sales/by-payment-method` com `event`)."
                    },
                    {
                      "key": "to",
                      "value": "{{date_to}}",
                      "description": "Fim do período, **não incluído**. Data ISO 8601 com fuso."
                    },
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "event",
                      "value": "{{event_id}}",
                      "description": "O `id` de **um** evento dessa loja, vindo de `/events`. Só os recebimentos gravados com esse evento entram, e o teto de 120 dias deixa de valer. Limitação conhecida: recebimento de uma venda do evento que foi gravado sem o evento fica fora. Lista (`a,b`) responde `422`; evento que não existe ou é de outra loja responde `404` com `param` igual a `event`.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Quanto uma loja recebeu no período, por método de pagamento e com a abertura por bandeira do cartão. Uma loja por chamada; com `event`, só os recebimentos daquele evento, sem o teto de 120 dias. O total soma os recebimentos pagos e **não desconta estornos**; ficam fora recebimento não pago ou cancelado, venda de demonstração, consumo pago com saldo cashless, sangria e suprimento. Venda feita sem conexão chega depois e muda um período já consultado: reconsulte os últimos 3 dias. A conta atende duas consultas desta rota ao mesmo tempo: a terceira responde `429` com `Retry-After: 5`."
              },
              "status": "Forbidden",
              "code": 403,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                }
              ],
              "body": "{\n  \"code\": \"forbidden_permission\",\n  \"required_permission\": \"sale-by-payment-method.view\",\n  \"type\": \"about:blank\",\n  \"title\": \"Forbidden\",\n  \"status\": 403,\n  \"detail\": \"This API key does not have the permission for this route.\"\n}"
            },
            {
              "name": "Erro 422: parâmetro desconhecido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/sales/by-payment-method?from={{date_from}}&to={{date_to}}&place={{place_id}}&status=paid",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "sales",
                    "by-payment-method"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "{{date_from}}",
                      "description": "Início do período, **incluído**. Data ISO 8601 com fuso. Com `to`, no máximo 120 dias (sem teto em `/sales/by-payment-method` com `event`)."
                    },
                    {
                      "key": "to",
                      "value": "{{date_to}}",
                      "description": "Fim do período, **não incluído**. Data ISO 8601 com fuso."
                    },
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "event",
                      "value": "{{event_id}}",
                      "description": "O `id` de **um** evento dessa loja, vindo de `/events`. Só os recebimentos gravados com esse evento entram, e o teto de 120 dias deixa de valer. Limitação conhecida: recebimento de uma venda do evento que foi gravado sem o evento fica fora. Lista (`a,b`) responde `422`; evento que não existe ou é de outra loja responde `404` com `param` igual a `event`.",
                      "disabled": true
                    },
                    {
                      "key": "status",
                      "value": "paid"
                    }
                  ]
                },
                "description": "Quanto uma loja recebeu no período, por método de pagamento e com a abertura por bandeira do cartão. Uma loja por chamada; com `event`, só os recebimentos daquele evento, sem o teto de 120 dias. O total soma os recebimentos pagos e **não desconta estornos**; ficam fora recebimento não pago ou cancelado, venda de demonstração, consumo pago com saldo cashless, sangria e suprimento. Venda feita sem conexão chega depois e muda um período já consultado: reconsulte os últimos 3 dias. A conta atende duas consultas desta rota ao mesmo tempo: a terceira responde `429` com `Retry-After: 5`."
              },
              "status": "Unprocessable Entity",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                }
              ],
              "body": "{\n  \"code\": \"invalid_parameter\",\n  \"param\": \"status\",\n  \"type\": \"about:blank\",\n  \"title\": \"Unprocessable Entity\",\n  \"status\": 422,\n  \"detail\": \"Unknown parameter(s): status. Accepted: from, to, place, event.\"\n}"
            },
            {
              "name": "Erro 429: limite de uso atingido (exemplo)",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/v1/api-public/sales/by-payment-method?from={{date_from}}&to={{date_to}}&place={{place_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "v1",
                    "api-public",
                    "sales",
                    "by-payment-method"
                  ],
                  "query": [
                    {
                      "key": "from",
                      "value": "{{date_from}}",
                      "description": "Início do período, **incluído**. Data ISO 8601 com fuso. Com `to`, no máximo 120 dias (sem teto em `/sales/by-payment-method` com `event`)."
                    },
                    {
                      "key": "to",
                      "value": "{{date_to}}",
                      "description": "Fim do período, **não incluído**. Data ISO 8601 com fuso."
                    },
                    {
                      "key": "place",
                      "value": "{{place_id}}",
                      "description": "O `id` de **uma** loja, vindo de `/places`. Ausente, vazio ou em lista (`a,b`) responde `422`; loja fora da chave (ou que não existe) responde `404` com `param` igual a `place`."
                    },
                    {
                      "key": "event",
                      "value": "{{event_id}}",
                      "description": "O `id` de **um** evento dessa loja, vindo de `/events`. Só os recebimentos gravados com esse evento entram, e o teto de 120 dias deixa de valer. Limitação conhecida: recebimento de uma venda do evento que foi gravado sem o evento fica fora. Lista (`a,b`) responde `422`; evento que não existe ou é de outra loja responde `404` com `param` igual a `event`.",
                      "disabled": true
                    }
                  ]
                },
                "description": "Quanto uma loja recebeu no período, por método de pagamento e com a abertura por bandeira do cartão. Uma loja por chamada; com `event`, só os recebimentos daquele evento, sem o teto de 120 dias. O total soma os recebimentos pagos e **não desconta estornos**; ficam fora recebimento não pago ou cancelado, venda de demonstração, consumo pago com saldo cashless, sangria e suprimento. Venda feita sem conexão chega depois e muda um período já consultado: reconsulte os últimos 3 dias. A conta atende duas consultas desta rota ao mesmo tempo: a terceira responde `429` com `Retry-After: 5`."
              },
              "status": "Too Many Requests",
              "code": 429,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/problem+json"
                },
                {
                  "key": "Retry-After",
                  "value": "60"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "0"
                }
              ],
              "body": "{\n  \"code\": \"rate_limited\",\n  \"type\": \"about:blank\",\n  \"title\": \"Too Many Requests\",\n  \"status\": 429,\n  \"detail\": \"Rate limit exceeded for this API key. Retry after the time in the Retry-After header.\"\n}"
            }
          ]
        }
      ]
    }
  ]
}
