VenddorDocumentação API
API atualAPI legada
Guia rápidoReferência completa
Carregando índice…
API atual/Referência completa/Plataforma e integrações

GraphQL da vitrine

Consulta catálogo, categorias, sellers, páginas, carrinho e dados do cliente logado com uma única requisição GraphQL.

O endpoint /graphql é a API da vitrine em GraphQL: ele devolve exatamente os campos que você pedir, em uma só requisição. É útil para sites e apps que montam telas de catálogo, carrinho e conta do cliente. Para administrar a loja (criar produto, mudar pedido) use a API REST administrativa, o GraphQL não tem essas operações.

Todos os valores em dinheiro são inteiros em centavos (30000 = R$ 300,00). Os ids são UUID em string. Datas saem como texto.

Pontos-chave
  • Use POST /graphql com corpo JSON {"query", "variables", "operationName"}. GET /graphql?query=... também funciona.
  • Qualquer outro método (PUT, PATCH, DELETE, HEAD, TRACE...) responde 405. OPTIONS é tratado como pré-requisição CORS.
  • A loja é escolhida pelo host ou por X-Tenant-ID, como em toda a API.
  • Erros de GraphQL voltam com HTTP 200 e um vetor errors. Só validações de entrada (JSON inválido, consulta vazia, limites) usam 400.
  • Em produção, a introspecção (__schema, __type) só é permitida a administradores.

Autenticação

O endpoint aceita três formas, todas opcionais:

FormaComo enviarPara quê
Nenhumasem cabeçalhocatálogo, categorias, sellers e páginas públicas
Token de clienteAuthorization: Bearer <jwt>customer, e carrinho do usuário logado
Sessão de visitanteX-Session-ID: <texto livre estável>carrinho de quem não fez login
Chave de API da vitrineAuthorization: Bearer sfk_...integrações de servidor, com limite de requisições por chave

Uma chave sfk_ inválida ou revogada devolve 401 invalid or revoked API key. Passando do limite da chave, 429 rate limit exceeded com Retry-After: 60.

As operações de carrinho exigem token ou X-Session-ID. Sem nenhum dos dois: authentication or X-Session-ID header required for cart operations. A consulta customer sem login devolve null e o erro authentication required.

Limites

LimiteValorErro
Profundidade da consulta10 níveis400, query depth N exceeds maximum allowed depth of 10
Complexidade (total de campos pedidos)200400, query complexity N exceeds maximum allowed complexity of 200
first em listasmáximo 100 (acima disso vale 100)sem erro
POST/graphqlAutenticada

Executar uma consulta ou mutação GraphQL

Corpo da requisição

querystringobrigatório
Texto da consulta ou mutação.
variablesobject
Valores das variáveis declaradas na consulta.
operationNamestring
Nome da operação, quando o texto tem mais de uma.

Cabeçalhos

X-Tenant-IDstring
Slug da loja, quando o host não identifica a loja.
Authorizationstring
Bearer <jwt> do cliente ou Bearer sfk_.... Opcional.
X-Session-IDstring
Identifica o carrinho de um visitante sem login. Escolha um valor aleatório e reutilize.
GET/graphqlAutenticada

Executar uma consulta via query string

Mesmas regras do POST, com os parâmetros na URL. Prefira o POST: a URL tem tamanho limitado e aparece em logs. Mutações não devem ser enviadas por GET.

Parâmetros de consulta

querystringobrigatório
Texto da consulta (codificado na URL).
variablesstring
Objeto JSON com as variáveis, como texto.
operationNamestring
Nome da operação.

Exemplo de requisição

bash
curl -X POST "$BASE_URL/graphql" \
  -H "Content-Type: application/json" \
  -d '{"query":"query($n:Int){ products(first:$n){ totalCount pageInfo{hasNextPage endCursor} edges{cursor node{id name slug price inStock}} } }","variables":{"n":2}}'

Resposta

200Consulta executada
json
{
  "data": {
    "products": {
      "totalCount": 4976,
      "pageInfo": { "hasNextPage": true, "endCursor": "Y3Vyc29yOjE=" },
      "edges": [
        {
          "cursor": "Y3Vyc29yOjA=",
          "node": {
            "id": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766",
            "name": "Camisa do Flamengo Masculina I 26 Adidas",
            "slug": "camisa-flamengo-masculina-i-26-adidas",
            "price": 30000,
            "inStock": true
          }
        }
      ]
    }
  }
}

Campos da resposta

dataobject
Resultado, com a forma da sua consulta. Vem null quando a operação inteira falha.
errorsarray
Presente só quando algo falhou. Cada item tem message e, quando aplicável, locations e path.

Erros

StatusQuandoCorpo de exemplo
200Erro de execução (campo inexistente ou não autenticado){"data":null,"errors":[{"message":"Cannot query field \"nope\" on type \"Query\"."}]}
400Corpo que não é JSON{"errors":[{"message":"invalid JSON body"}]}
400Consulta vazia{"errors":[{"message":"query is required"}]}
400Profundidade ou complexidade acima do limite{"errors":[{"message":"query depth 11 exceeds maximum allowed depth of 10"}]}
401Chave sfk_ inválida{"errors":[{"message":"invalid or revoked API key"}]}
403Introspecção em produção sem ser administrador{"errors":[{"message":"introspection is disabled in production"}]}
405Método diferente de GET e POST{"errors":[{"message":"only GET and POST are supported"}]}
429Limite da chave sfk_ excedido{"errors":[{"message":"rate limit exceeded"}]}

Consultas (Query)

ConsultaArgumentosDevolve
productsfirst (padrão 20, máx. 100), after, filter, sort; antigos: page, perPage, categoryId, searchProductConnection
productid ou slugProduct ou null
categoriesparentIdlista de Category
categoryid ou slugCategory ou null
vendorsfirst, after, searchVendorConnection
vendorid ou slugVendor ou null
cartnenhumCart (exige token ou X-Session-ID para ter itens)
customernenhumCustomer (exige token de cliente)
pagestypelista de Page
pageslug (obrigatório)Page ou null

filter (ProductFilter) aceita categoryId, vendorId, search, minPrice e maxPrice (centavos) e inStock. sort (ProductSort) aceita PRICE_ASC, PRICE_DESC, NEWEST, NAME_ASC, NAME_DESC, BEST_SELLING e TOP_RATED.

Paginação

As listas products e vendors usam cursor estilo Relay: leia pageInfo.endCursor e envie em after para a próxima página, enquanto hasNextPage for verdadeiro. Trate o cursor como texto opaco. Quando você manda first, ele vale mais que o perPage.

Mutações (Mutation)

MutaçãoArgumentosEfeito
addToCartproductId (obrigatório), quantity (obrigatório), options (JSON)Adiciona o produto e devolve o Cart
updateCartItemproductId, quantityMuda a quantidade de um item
removeFromCartproductIdRemove o item
clearCartnenhumEsvazia o carrinho
createCheckoutcartId (obrigatório), guestEmail, guestName, guestPhoneCria a sessão de checkout a partir do carrinho. guestEmail é necessário em compra de visitante

Exemplo de mutação, com a resposta real do ambiente de teste:

graphql
mutation {
  addToCart(productId: "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766", quantity: 2) {
    id itemCount subtotal total currency
    items { productId name unitPrice quantity total }
  }
}
json
{
  "data": {
    "addToCart": {
      "id": "e040ceb9-9bbf-44b9-8820-f51a7b6984ba",
      "itemCount": 2,
      "subtotal": 60000,
      "total": 60000,
      "currency": "BRL",
      "items": [
        { "productId": "22fbd12a-1b6e-41ea-a84f-4d9cf06c8766", "name": "Camisa do Flamengo Masculina I 26 Adidas", "unitPrice": 30000, "quantity": 2, "total": 60000 }
      ]
    }
  }
}

Tipos

TipoCampos principais
Productid, name, slug, description, shortDescription, sku, price, listPrice (centavos), images, category, vendor, inStock, stockQuantity, options, averageRating, reviewCount, freeShipping, weight, createdAt
ProductImageid, url, altText, position, isPrimary
ProductOption / OptionValueid, name, type, required, position, values; valor: value, priceModifier (centavos), position
Categoryid, parentId, name, slug, description, imageUrl, position, productCount, children
Vendorid, companyName, slug, logoUrl, description, city, state
Cart / CartItemcarrinho: id, items, itemCount, subtotal, shippingTotal, taxTotal, discountTotal, total, currency; item: productId, name, imageUrl, unitPrice, quantity, total
Pageid, title, slug, body, pageType, seoTitle, seoDescription, createdAt, updatedAt
Customerid, email, firstName, lastName, phone, cpf, createdAt, addresses, orders(first, after), wishlist(first)
CustomerAddressid, label, isDefault, firstName, lastName, addressLine1, addressLine2, city, state, postalCode, country, district, phone
Order / OrderItempedido: id, orderNumber, status, subtotal, shippingTotal, taxTotal, discountTotal, total, currency, paymentMethod, paymentStatus, shippingMethod, trackingNumber, customerNotes, items, createdAt; item: id, productId, productName, productSku, productImage, unitPrice, quantity, discount, tax, total
WishlistItemid, productId, productName, productSlug, productImage, currentPrice, priceAtAdd, inStock, priority, addedAt
CheckoutSessionid, cartId, step, subtotal, shippingCost, discount, tax, total, createdAt
PageInfohasNextPage, hasPreviousPage, startCursor, endCursor

ProductConnection também expõe os campos items, total, page, perPage e totalPages, para quem pagina por número de página.

GET/graphql/playgroundPública

Abrir o playground do GraphQL

Devolve uma página HTML com um editor de consultas apontando para /graphql. Ela não expõe dados: para consultar algo que exige login, cole seu cabeçalho Authorization no painel de cabeçalhos do playground. O editor carrega seus scripts de uma CDN pública.

HTTP 200 não significa sucesso

No GraphQL, uma consulta pode voltar com status 200 e ainda assim trazer errors. Sempre verifique se o campo errors existe antes de usar data.

Peça só o que vai usar

O limite de 200 campos conta cada campo pedido, inclusive os aninhados. Em listas grandes, selecione apenas o necessário e pagine com first.

Veja também

  • Paginação, filtros e ordenação
  • Ids, dinheiro e datas
  • Visão geral da seção
Anterior
Saúde da API
Próxima
Webhooks e eventos
Nesta página
  • Autenticação
  • Limites
  • Exemplo de requisição
  • Resposta
  • Erros
  • Consultas (Query)
  • Paginação
  • Mutações (Mutation)
  • Tipos
  • Veja também