Skip to content

Informações do Merchant

Esta seção contém informações sobre os endpoints de merchant da API OpenDelivery. Através destas rotas, é possível consultar informações completas sobre o estabelecimento, incluindo cardápio, serviços, horários e área de cobertura.

Visão Geral

O módulo de merchant permite que aplicações externas obtenham informações completas sobre um estabelecimento, seguindo o padrão OpenDelivery. Os dados retornados incluem informações básicas, serviços disponíveis (delivery, retirada e consumo no local), horários de funcionamento, área de cobertura, cardápio completo com categorias, itens, grupos de opcionais e disponibilidades.

Endpoints Principais

MétodoEndpointDescrição
GET/opendelivery/v1/merchantObtém informações completas do estabelecimento

Autenticação

Este endpoint utiliza autenticação via API Key.

Header Obrigatório

plaintext
x-api-key: {sua_api_key}
HeaderTipoObrigatórioDescrição
x-api-keystringSimChave de API fornecida pela Goomer para integração com o hub

Importante: O endpoint de merchant é exclusivo para integradores do tipo Ordering Application registrados na plataforma Goomer.

Limites de Uso (Rate Limiting)

Este endpoint possui as seguintes restrições de uso:

LimiteJanela de Tempo
10 requisições1 minuto

Quando o limite é excedido, a API retorna o código de status HTTP 429 (Too Many Requests).

Estrutura de Dados

Campos Raiz

CampoTipoDescrição
lastUpdatestring (ISO 8601)Data e hora da última atualização dos dados
TTLnumberTempo de vida do cache em segundos (entre 500 e 86400)
idstringIdentificador único do merchant no formato {CNPJ}-{UUID}
statusstringStatus do merchant: AVAILABLE ou UNAVAILABLE
basicInfoobjectInformações básicas do estabelecimento
servicesarrayLista de serviços disponíveis
menusarrayCardápios do estabelecimento
categoriesarrayCategorias de produtos
itemOffersarrayOfertas de produtos (preços e disponibilidade)
itemsarrayProdutos disponíveis
optionGroupsarrayGrupos de opcionais (complementos e adicionais)
availabilitiesarrayDisponibilidades especiais (horários diferenciados por item/categoria)

basicInfo

CampoTipoDescrição
namestringNome público do estabelecimento
documentstringCNPJ (14 dígitos, sem formatação)
corporateNamestringRazão social
descriptionstringDescrição do estabelecimento
averageTicketnumber (opcional)Ticket médio em reais
averagePreparationTimenumberTempo médio de preparo em minutos
minOrderValueobjectValor mínimo do pedido { value, currency }
merchantTypestringTipo do estabelecimento (sempre RESTAURANT)
merchantCategoriesstring[]Categorias de culinária (ex: BURGERS, PIZZA, JAPANESE)
addressobjectEndereço completo com coordenadas geográficas
contactEmailsstring[]Lista de e-mails de contato
contactPhonesobjectTelefones de contato { commercialNumber, whatsappNumber? }
logoImageobjectURL da imagem de logo { URL }
bannerImageobject (opcional)URL da imagem de banner { URL }
createdAtstring (ISO 8601)Data de criação do estabelecimento
acceptedCardsstring[]Bandeiras e métodos de pagamento aceitos (ex: VISA, MASTERCARD, PIX)

services

Cada item do array de serviços representa um canal de atendimento (delivery, retirada ou consumo no local).

CampoTipoDescrição
idstring (UUID)Identificador único do serviço
statusstringStatus do serviço: AVAILABLE ou UNAVAILABLE
serviceTypestringTipo: DELIVERY, TAKEOUT ou INDOOR
serviceTimingobject (opcional)Configuração de timing do serviço
serviceTiming.timingstring[]Modos: INSTANT, SCHEDULED, ONDEMAND
serviceTiming.scheduleobject (opcional)Janelas de agendamento
servicePrioritystring[] (opcional)Prioridade do serviço: PRIORITY1 a PRIORITY5
menuIdstring (UUID)ID do cardápio associado a este serviço
targetAppIdstring (UUID, opcional)ID da aplicação destino
serviceAreaobject (opcional)Área de cobertura (apenas para DELIVERY)
serviceHoursobjectHorários de funcionamento do serviço
CampoTipoDescrição
idstring (UUID)Identificador único do cardápio
namestringNome do cardápio
descriptionstring (opcional)Descrição do cardápio
externalCodestringCódigo externo para identificação no sistema do parceiro
disclaimerstring (opcional)Aviso legal do cardápio
disclaimerURLstring (opcional)URL com informações adicionais do aviso
categoryIdstring[]Lista de IDs das categorias pertencentes a este cardápio

categories

CampoTipoDescrição
idstring (UUID)Identificador único da categoria
indexnumberPosição de ordenação da categoria no cardápio
namestringNome da categoria
descriptionstring (opcional)Descrição da categoria
imageobject (opcional)Imagem da categoria { URL }
externalCodestringCódigo externo para identificação no sistema do parceiro
statusstringStatus: AVAILABLE ou UNAVAILABLE
availabilityIdstring[] (opcional)IDs de disponibilidades especiais vinculadas
itemOfferIdstring[] (opcional)IDs das ofertas de itens pertencentes a esta categoria

itemOffers

Representa a oferta de um produto: seu preço atual, status e referências.

CampoTipoDescrição
idstring (UUID)Identificador único da oferta
itemIdstring (UUID)ID do item (produto) relacionado
indexnumberPosição de ordenação dentro da categoria
statusstringStatus: AVAILABLE ou UNAVAILABLE
priceobjectPreço da oferta
price.valuenumberPreço atual em reais
price.originalValuenumberPreço original (sem promoção) em reais
price.currencystringCódigo da moeda (ISO 4217, ex: BRL)
availabilityIdstring[] (opcional)IDs de disponibilidades especiais vinculadas
optionGroupsIdstring[] (opcional)IDs dos grupos de opcionais disponíveis para este item

items

CampoTipoDescrição
idstring (UUID)Identificador único do item
namestringNome do produto
descriptionstringDescrição do produto
externalCodestringCódigo externo para identificação no sistema do parceiro
statusstringStatus: AVAILABLE ou UNAVAILABLE
imageobject (opcional)Imagem principal { URL }
imagesarray (opcional)Lista de imagens com tipo: MAIN ou THUMB
nutritionalInfoobject (opcional)Informações nutricionais e alérgenos
servingnumber (opcional)Porção/quantidade por unidade
unitstringUnidade: UN, KG, L, OZ, LB ou GAL
eanstring (opcional)Código de barras EAN

optionGroups

CampoTipoDescrição
idstring (UUID)Identificador único do grupo
indexnumberPosição de ordenação
namestringNome do grupo (ex: "Escolha o tamanho")
descriptionstring (opcional)Descrição do grupo
externalCodestringCódigo externo para identificação no sistema do parceiro
statusstringStatus: AVAILABLE ou UNAVAILABLE
minPermittednumberQuantidade mínima de opções que o cliente deve selecionar
maxPermittednumberQuantidade máxima de opções que o cliente pode selecionar
priceMethodstringMétodo de cálculo do preço: SUM (soma), MAX (maior valor) ou AVG (média)
optionsarray (opcional)Lista de opções do grupo

availabilities

Define janelas de disponibilidade especiais que podem ser vinculadas a categorias ou itens.

CampoTipoDescrição
idstring (UUID)Identificador único da disponibilidade
startDatestring (opcional)Data de início da vigência
endDatestring (opcional)Data de fim da vigência
hoursarrayHorários semanais de disponibilidade
hours[].dayOfWeekstring[]Dias da semana: MONDAY, TUESDAY, ..., SUNDAY
hours[].timePeriodsobjectPeríodo: { startTime, endTime } no formato HH:mm:ss

Exemplo de Resposta

GET /opendelivery/v1/merchant

http
GET /opendelivery/v1/merchant HTTP/1.1
Host: partner-api.goomer.app
x-api-key: sua_api_key_aqui
json
{
  "lastUpdate": "2025-01-27T10:30:00.000Z",
  "TTL": 86400,
  "id": "12345678901234-550e8400-e29b-41d4-a716-446655440000",
  "status": "AVAILABLE",
  "basicInfo": {
    "name": "Restaurante Exemplo",
    "document": "12345678901234",
    "corporateName": "Restaurante Exemplo LTDA",
    "description": "Restaurante especializado em comida brasileira",
    "averageTicket": 45.50,
    "averagePreparationTime": 30,
    "minOrderValue": {
      "value": 20.00,
      "currency": "BRL"
    },
    "merchantType": "RESTAURANT",
    "merchantCategories": ["BRAZILIAN", "COMFORT_FOOD"],
    "address": {
      "country": "BR",
      "state": "SP",
      "city": "São Paulo",
      "district": "Centro",
      "street": "Rua Exemplo",
      "number": "123",
      "postalCode": "01234567",
      "complement": "Loja 5",
      "latitude": -23.5505,
      "longitude": -46.6333
    },
    "contactEmails": ["contato@restaurante.com.br"],
    "contactPhones": {
      "commercialNumber": "11999999999",
      "whatsappNumber": "11999999999"
    },
    "logoImage": {
      "URL": "https://example.com/logo.png"
    },
    "bannerImage": {
      "URL": "https://example.com/banner.png"
    },
    "createdAt": "2024-01-01T00:00:00.000Z",
    "acceptedCards": ["VISA", "MASTERCARD", "ELO", "PIX"]
  },
  "services": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "status": "AVAILABLE",
      "serviceType": "DELIVERY",
      "serviceTiming": {
        "timing": ["INSTANT", "SCHEDULED"],
        "schedule": {
          "scheduleTimeWindow": "30_MINUTES",
          "scheduleStartWindow": "45_MINUTES",
          "scheduleEndWindow": "60_MINUTES"
        }
      },
      "servicePriority": ["PRIORITY1"],
      "menuId": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "serviceArea": {
        "id": "c3d4e5f6-a7b8-9012-cdef-123456789012",
        "geoRadius": {
          "geoMidpointLatitude": -23.5505,
          "geoMidpointLongitude": -46.6333,
          "radius": [
            {
              "size": 3000,
              "price": {
                "value": 5.00,
                "currency": "BRL"
              },
              "estimateDeliveryTime": 30
            }
          ]
        }
      },
      "serviceHours": {
        "id": "d4e5f6a7-b8c9-0123-def0-123456789abc",
        "weekHours": [
          {
            "dayOfWeek": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"],
            "timePeriods": {
              "startTime": "11:00:00",
              "endTime": "23:00:00"
            }
          },
          {
            "dayOfWeek": ["SATURDAY", "SUNDAY"],
            "timePeriods": {
              "startTime": "11:00:00",
              "endTime": "23:30:00"
            }
          }
        ],
        "holidayHours": []
      }
    },
    {
      "id": "e5f6a7b8-c9d0-1234-ef01-23456789abcd",
      "status": "AVAILABLE",
      "serviceType": "TAKEOUT",
      "serviceTiming": {
        "timing": ["INSTANT"],
        "schedule": {
          "scheduleTimeWindow": "15_MINUTES",
          "scheduleStartWindow": "30_MINUTES",
          "scheduleEndWindow": "45_MINUTES"
        }
      },
      "menuId": "f6a7b8c9-d0e1-2345-f012-3456789abcde",
      "serviceHours": {
        "id": "a7b8c9d0-e1f2-3456-0123-456789abcdef",
        "weekHours": [
          {
            "dayOfWeek": ["MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY"],
            "timePeriods": {
              "startTime": "11:00:00",
              "endTime": "23:00:00"
            }
          }
        ],
        "holidayHours": []
      }
    }
  ],
  "menus": [
    {
      "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901",
      "name": "Cardápio Principal",
      "description": "Cardápio completo do restaurante",
      "externalCode": "1",
      "categoryId": [
        "cat-uuid-001",
        "cat-uuid-002"
      ]
    }
  ],
  "categories": [
    {
      "id": "cat-uuid-001",
      "index": 1,
      "name": "Hambúrgueres",
      "description": "Nossos hambúrgueres artesanais",
      "externalCode": "101",
      "status": "AVAILABLE",
      "itemOfferId": [
        "offer-uuid-001",
        "offer-uuid-002"
      ]
    },
    {
      "id": "cat-uuid-002",
      "index": 2,
      "name": "Bebidas",
      "externalCode": "102",
      "status": "AVAILABLE",
      "itemOfferId": [
        "offer-uuid-003"
      ]
    }
  ],
  "itemOffers": [
    {
      "id": "offer-uuid-001",
      "itemId": "item-uuid-001",
      "index": 1,
      "status": "AVAILABLE",
      "price": {
        "value": 32.90,
        "originalValue": 32.90,
        "currency": "BRL"
      },
      "optionGroupsId": [
        "group-uuid-001"
      ]
    },
    {
      "id": "offer-uuid-002",
      "itemId": "item-uuid-002",
      "index": 2,
      "status": "AVAILABLE",
      "price": {
        "value": 28.90,
        "originalValue": 35.90,
        "currency": "BRL"
      }
    },
    {
      "id": "offer-uuid-003",
      "itemId": "item-uuid-003",
      "index": 1,
      "status": "AVAILABLE",
      "price": {
        "value": 8.00,
        "originalValue": 8.00,
        "currency": "BRL"
      }
    }
  ],
  "items": [
    {
      "id": "item-uuid-001",
      "name": "X-Burguer Clássico",
      "description": "Pão brioche, carne 180g, queijo cheddar, alface e tomate",
      "externalCode": "P001",
      "status": "AVAILABLE",
      "images": [
        {
          "URL": "https://example.com/xburguer.jpg",
          "type": "MAIN"
        }
      ],
      "nutritionalInfo": {
        "description": "Hambúrguer artesanal",
        "calories": "650 Cal",
        "allergen": ["GLUTEN", "MILK", "EGG"],
        "isAlcoholic": false
      },
      "unit": "UN"
    },
    {
      "id": "item-uuid-002",
      "name": "X-Burguer Duplo",
      "description": "Pão brioche, duas carnes 180g, queijo cheddar duplo",
      "externalCode": "P002",
      "status": "AVAILABLE",
      "unit": "UN"
    },
    {
      "id": "item-uuid-003",
      "name": "Refrigerante Lata",
      "description": "Escolha entre Coca-Cola, Guaraná ou Sprite",
      "externalCode": "B001",
      "status": "AVAILABLE",
      "unit": "UN"
    }
  ],
  "optionGroups": [
    {
      "id": "group-uuid-001",
      "index": 1,
      "name": "Ponto da carne",
      "externalCode": "G001",
      "status": "AVAILABLE",
      "minPermitted": 1,
      "maxPermitted": 1,
      "priceMethod": "SUM",
      "options": [
        {
          "id": "opt-uuid-001",
          "itemId": "item-uuid-opt-001",
          "index": 1,
          "status": "AVAILABLE",
          "price": {
            "value": 0.00,
            "originalValue": 0.00,
            "currency": "BRL"
          },
          "maxPermitted": 1
        },
        {
          "id": "opt-uuid-002",
          "itemId": "item-uuid-opt-002",
          "index": 2,
          "status": "AVAILABLE",
          "price": {
            "value": 0.00,
            "originalValue": 0.00,
            "currency": "BRL"
          },
          "maxPermitted": 1
        }
      ]
    }
  ],
  "availabilities": []
}

Códigos de Status

CódigoDescrição
200Sucesso
400Requisição inválida
401API Key inválida ou ausente
429Limite de requisições excedido
500Erro interno do servidor

Cache e TTL

O endpoint retorna dois campos relacionados ao cache dos dados:

  • TTL: Tempo sugerido (em segundos) para que o parceiro armazene a resposta em cache local. Varia entre 500 e 86400 segundos (de ~8 minutos a 24 horas).
  • lastUpdate: Timestamp da última vez que os dados do merchant foram atualizados. Utilize este campo para verificar se sua cópia local está desatualizada.

Recomendamos que parceiros implementem cache local respeitando o TTL retornado para reduzir o número de requisições e evitar atingir o limite de rate limiting.

Documentação Completa

Para informações detalhadas sobre parâmetros, payload e exemplos adicionais, consulte a documentação técnica completa.