### Install Express and Initialize Node Project Source: https://ereemby.gitbook.io/docs/desenvolvedores/webhooks Use npm to initialize a new Node.js project and install the Express framework. ```bash npm init -y npm i express ``` -------------------------------- ### Dynamic Documentation Query Example Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/categories_all Demonstrates how to query this documentation dynamically by making an HTTP GET request to the page URL with an 'ask' query parameter. This is useful for retrieving specific information not explicitly present on the page. ```http GET https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/categories_all.md?ask= ``` -------------------------------- ### Install Ereemby CLI and Pull Theme Files Source: https://ereemby.gitbook.io/docs/sistema-de-temas/editor-local Install the Ereemby CLI globally and then authenticate your local environment with your theme token. Finally, pull the theme files to your local machine to begin editing. ```bash npm install ereemby-cli -g ereemby login ereemby pull ``` -------------------------------- ### Run Node.js Server Source: https://ereemby.gitbook.io/docs/desenvolvedores/webhooks Execute the Node.js server script to start listening for webhooks. ```bash node server.js ``` -------------------------------- ### Query Documentation Dynamically Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/dates To get additional information not directly available on the page, perform an HTTP GET request with the `ask` query parameter. ```http GET https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/dates.md?ask= ``` -------------------------------- ### Query Documentation via HTTP GET Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/vendas Perform an HTTP GET request to the current page URL, including the `ask` query parameter with your question. The question should be specific and self-contained. The response will provide a direct answer and relevant excerpts. ```http GET https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/vendas.md?ask= ``` -------------------------------- ### Querying Documentation Dynamically Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/variants To get additional information not present on the page, perform an HTTP GET request with the `ask` query parameter. The question should be specific and self-contained. ```HTTP GET https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/variants.md?ask= ``` -------------------------------- ### Display 'Starting from' Price Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/products Shows the minimum price if the product has variants, otherwise displays the product's base price. Useful for products with different options. ```liquid {% if product.variants.size > 0 %}

A partir de R$ {{ product.variants_values.min.price }}

{% else %}

R$ {{ product.price }}

{% endif %} ``` -------------------------------- ### Display Product Name and Price Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/products A basic example demonstrating how to iterate through `catalog.products` and display the product's name and price within an article tag. Ensure to handle the price formatting as it comes as a raw number. ```liquid {% for product in catalog.products %}

{{ product.name }}

R$ {{ product.price }}

{% endfor %} ``` -------------------------------- ### Query Ereemby Documentation via HTTP GET Source: https://ereemby.gitbook.io/docs/introducao To get additional information not directly present on a page, perform an HTTP GET request to the current page URL with the `ask` query parameter. The question should be specific and in natural language. Use this for clarifications, additional context, or retrieving related sections. ```http GET https://ereemby.gitbook.io/docs/introducao.md?ask= ``` -------------------------------- ### Exemplo de Requisição GET com Parâmetro 'ask' Source: https://ereemby.gitbook.io/docs/desenvolvedores/chave-de-api Para obter informações adicionais não presentes diretamente na página, realize uma requisição GET para a URL da página com o parâmetro 'ask' e sua pergunta. ```http GET https://ereemby.gitbook.io/docs/desenvolvedores/chave-de-api.md?ask= ``` -------------------------------- ### Exemplo de Requisição GET para Consultar Documentação Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo Para obter informações adicionais ou esclarecer dúvidas não presentes diretamente nesta página, utilize este endpoint. Substitua '' pela sua pergunta específica em linguagem natural. A resposta incluirá a resposta direta e trechos relevantes da documentação. ```http GET https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo.md?ask= ``` -------------------------------- ### Iterate Through All Products Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/products Use this snippet to loop through all products in the catalog and display their names. This is a basic example for iterating over the `catalog.products` list. ```liquid {% for product in catalog.products %} {{ product.name }} {% endfor %} ``` -------------------------------- ### Display Basic Product Information Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/product Shows how to display the product's name, price, and stock amount. Ensure the product object is available in the scope. ```liquid

{{ product.name }}

R$ {{ product.price }}

{{ product.stock_amount }} em estoque

``` -------------------------------- ### Exemplo Mínimo Viável de Página de Produto Source: https://ereemby.gitbook.io/docs/sistema-de-temas/visao-geral Um bloco simples que exibe informações básicas de um produto em uma página de produto. Usa a variável `product` para acessar detalhes como imagens, nome, preço e estoque. ```liquid {% comment %} Hero da página de produto, usa a variável `product` {% endcomment %}
{% if product.images.size > 0 %} {{ product.name }} {% endif %}

{{ product.name }}

R$ {{ product.price | round: 2 | replace: ".", "," }}

{% if product.stock_amount > 0 %} {% else %} {% endif %}
``` -------------------------------- ### Access Time Components Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/dates Do not access `dates.hours` directly. Use the nested `dates.time` object to get hours, minutes, and seconds. ```liquid dates.time.hours ``` ```liquid dates.time.minutes ``` ```liquid dates.time.seconds ``` -------------------------------- ### Consultar produto com cURL Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo/produtos Use este comando cURL para consultar um produto existente no catálogo. Certifique-se de substituir 'SUA_CHAVE_DE_API' e 'SEU_PRODUCT_ID' pelos valores corretos. ```bash curl -sS \ -H "x-api-key: SUA_CHAVE_DE_API" \ "https://api.ereemby.app/product/SEU_PRODUCT_ID" ``` -------------------------------- ### Get Size of Array or String Source: https://ereemby.gitbook.io/docs/sistema-de-temas/sintaxe-liquid-basica The `size` filter returns the number of elements in an array or the length of a string. Use it to check counts or lengths. ```liquid {{ catalog.products | size }} ``` -------------------------------- ### Iterate Through All Categories Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/categories_all Loop through the complete category tree, displaying each category name and its immediate sub-categories. This is a basic example of accessing the nested structure. ```liquid {% for category in catalog.categories_all %} {{ category.name }} {% for sub in category.sub_categories %} └── {{ sub.name }} {% endfor %} {% endfor %} ``` -------------------------------- ### Atualizar Produto Parcialmente Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo/produtos Utilize este endpoint para atualizar campos específicos de um produto existente. Envie apenas os campos que você deseja modificar. ```json { "openapi": "3.0.0", "info": { "title": "Gestão de Catálogo API", "version": "1.0.0" }, "servers": [ { "url": "https://api.ereemby.app/api/v1", "description": "Servidor de Produção" } ], "security": [ { "ApiKeyAuth": [] } ], "components": { "securitySchemes": { "ApiKeyAuth": { "type": "apiKey", "in": "header", "name": "x-api-key", "description": "Chave de API gerada no painel da Ereemby. Deve ser enviada no header x-api-key em todas as requisições." } }, "schemas": { "ProductUpdate": { "type": "object", "description": "Campos para atualizar um produto. Todos os campos são opcionais - envie apenas o que deseja alterar.", "properties": { "name": { "type": "string", "description": "Nome do produto." }, "price": { "type": "number", "description": "Preço de venda do produto." }, "compare_price": { "type": "number", "description": "Preço original (riscado), para exibição comparativa." }, "description": { "type": "string", "description": "Descrição HTML do produto." }, "category_id": { "type": "string", "description": "ID da categoria à qual o produto pertence." }, "status": { "type": "boolean", "description": "Define se o produto está visível no catálogo." }, "featured": { "type": "boolean", "description": "Marca o produto como destaque." }, "type": { "type": "string", "description": "Tipo de entrega do produto: series (estoque em linhas) ou texto (um único texto sempre enviado ao cliente).", "enum": [ "series", "texto" ] }, "min": { "type": "integer", "description": "Quantidade mínima por pedido." }, "max": { "type": "integer", "description": "Quantidade máxima por pedido." }, "stock": { "type": "array", "description": "Lista de itens em estoque (para entrega automática).", "items": { "type": "string" } }, "automatic": { "type": "boolean", "description": "Ativa a entrega automática do produto." }, "quantity": { "type": "integer", "description": "Quantidade em estoque (para produtos com estoque numérico)." }, "slug": { "type": "string", "description": "Slug único para URL do produto." }, "youtube": { "type": "string", "description": "URL do vídeo do YouTube associado ao produto." }, "images": { "type": "array", "description": "Lista de URLs de imagens adicionais do produto.", "items": { "type": "string" } }, "open_chat": { "type": "boolean", "description": "Abre o chat automaticamente ao adicionar ao carrinho." }, "instructions": { "type": "string", "description": "Instruções de uso entregues ao comprador." }, "affiliate_fee": { "type": "number", "description": "Comissão de afiliado em porcentagem." }, "hide_when_out_of_stock": { "type": "boolean", "description": "Oculta o produto quando o estoque zerar." }, "hide_sold_count": { "type": "boolean", "description": "Oculta o contador de vendas exibido no produto." } } }, "Error": { "type": "object", "properties": { "error": { "type": "string" } } } }, "responses": { "Unauthorized": { "description": "Não autorizado: o header x-api-key está ausente ou inválido.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "RateLimit": { "description": "Muitas requisições - limite de taxa excedido.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } }, "paths": { "/product/{productId}": { "patch": { "tags": [ "Produtos" ], "summary": "Atualizar produto", "description": "Atualiza parcialmente os dados de um produto existente. Envie apenas os campos que deseja alterar.", "parameters": [ { "name": "productId", "in": "path", "required": true, "description": "ID único do produto.", "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProductUpdate" } } } }, "responses": { "200": { "description": "Produto atualizado com sucesso.", "content": { "application/json": {} } }, "401": { "$ref": "#/components/responses/Unauthorized" }, "404": { "description": "Produto não encontrado.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "$ref": "#/components/responses/RateLimit" } } } } } } ``` -------------------------------- ### List Categories with Products Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/categories Iterate through all categories and display their name, sub-title (if available), and products. Each product shows its image, name, and price. ```liquid {% for category in catalog.categories %}

{{ category.name }}

{% if category.sub_title %}

{{ category.sub_title }}

{% endif %}
{% for product in category.products %}
{% if product.images.size > 0 %} {{ product.name }} {% endif %}

{{ product.name }}

R$ {{ product.price }}

{% endfor %}
{% endfor %} ``` -------------------------------- ### Get First or Last Item of an Array Source: https://ereemby.gitbook.io/docs/sistema-de-temas/sintaxe-liquid-basica The `first` and `last` filters retrieve the first or last element from an array, respectively. Useful for accessing specific items in a list. ```liquid {{ product.images | first }} ``` ```liquid {{ product.images | last }} ``` -------------------------------- ### Exibição de categoria com seus produtos e variantes Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog Itera sobre categorias, seus produtos e, para cada produto, lista suas variantes com nome e preço. Requer que `product.variants.size` seja maior que 0 para exibir as variantes. ```liquid {% for category in catalog.categories %}

{{ category.name }}

{% for product in category.products %}

{{ product.name }}

{% if product.variants.size > 0 %}
    {% for variant in product.variants %}
  • {{ variant.name }}, R$ {{ variant.price }}
  • {% endfor %}
{% endif %}
{% endfor %}
{% endfor %} ``` -------------------------------- ### Estrutura da Resposta do Catálogo Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo Define a estrutura de dados esperada para a resposta do endpoint GET /product/catalog. Inclui categorias, produtos, variantes e paginação. ```json { "openapi": "3.0.0", "info": { "title": "Gestão de Catálogo API", "version": "1.0.0" }, "servers": [ { "url": "https://api.ereemby.app/api/v1", "description": "Servidor de Produção" } ], "security": [ { "ApiKeyAuth": [] } ], "components": { "securitySchemes": { "ApiKeyAuth": { "type": "apiKey", "in": "header", "name": "x-api-key", "description": "Chave de API gerada no painel da Ereemby. Deve ser enviada no header x-api-key em todas as requisições." } }, "schemas": { "CatalogResponse": { "type": "object", "description": "Resposta do endpoint GET /product/catalog.", "properties": { "categories": { "type": "array", "items": { "$ref": "#/components/schemas/CatalogCategory" } }, "pagination": { "$ref": "#/components/schemas/CatalogPagination" } } }, "CatalogCategory": { "type": "object", "description": "Categoria do catálogo, podendo conter produtos diretos e/ou subcategorias.", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "slug": { "type": "string" }, "icon": { "type": "string", "nullable": true }, "banner": { "type": "string", "nullable": true }, "position": { "type": "integer" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "products": { "type": "array", "description": "Produtos diretamente associados à categoria (vazio quando a categoria usa subcategorias).", "items": { "$ref": "#/components/schemas/CatalogProduct" } }, "subcategories": { "type": "array", "description": "Subcategorias da categoria. Vazio quando os produtos estão direto na categoria.", "items": { "$ref": "#/components/schemas/CatalogSubcategory" } } } }, "CatalogProduct": { "type": "object", "description": "Produto listado no catálogo, podendo conter variantes.", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "slug": { "type": "string" }, "description": { "type": "string", "nullable": true }, "price": { "type": "number" }, "compare_price": { "type": "number" }, "image": { "type": "string", "nullable": true }, "featured": { "type": "boolean" }, "status": { "type": "boolean" }, "automatic": { "type": "boolean" }, "stock": { "type": "integer" }, "in_stock": { "type": "boolean" }, "has_variants": { "type": "boolean" }, "min_price": { "type": "number", "nullable": true }, "max_price": { "type": "number", "nullable": true }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "variants": { "type": "array", "description": "Lista de variantes do produto. Vazia quando has_variants é false.", "items": { "$ref": "#/components/schemas/CatalogVariant" } }, "categoria_id": { "type": "string", "description": "ID da categoria (ou subcategoria) à qual o produto pertence." } } }, "CatalogVariant": { "type": "object", "description": "Variante de um produto no catálogo.", "properties": { "id": { "type": "integer" }, "product_id": { "type": "string" }, "name": { "type": "string" }, "description": { "type": "string", "nullable": true }, "price": { "type": "number" }, "compare_price": { "type": "number" }, "image": { "type": "string", "nullable": true }, "stock": { "type": "integer" }, "in_stock": { "type": "boolean" }, "status": { "type": "boolean" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" } } }, "CatalogSubcategory": { "type": "object", "description": "Subcategoria dentro de uma categoria pai, contendo seus próprios produtos.", "properties": { "id": { "type": "string" }, "name": { "type": "string" }, "slug": { "type": "string" }, "icon": { "type": "string", "nullable": true }, "banner": { "type": "string", "nullable": true }, "position": { "type": "integer" }, "created_at": { "type": "string", "format": "date-time" }, "updated_at": { "type": "string", "format": "date-time" }, "products": { "type": "array", "items": { "$ref": "#/components/schemas/CatalogProduct" } } } }, "CatalogPagination": { "type": "object", "properties": { "page": { "type": "integer" }, "limit": { "type": "integer" }, "total": { "type": "integer" }, "total_pages": { "type": "integer" } } }, "Error": { "type": "object", "properties": { "error": { "type": "string" } } } } }, "responses": { "Unauthorized": { "description": "Não autorizado: o header x-api-key está ausente ou inválido.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "RateLimit": { "description": "Muitas requisições - limite de taxa excedido.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } }, "paths": { "/product/catalog": { "get": { "tags": [ "Produtos" ], "summary": "Puxar catálogo completo", "description": "Retorna uma lista paginada de produtos, categorias ou variantes do catálogo.", "parameters": [ { "name": "category", "in": "query", "schema": { "type": "string" }, "description": "Filtra os produtos pelo ID de uma categoria específica." }, { "name": "type", "in": "query", "schema": { "type": "string", "enum": [ "all", "category", "products", "variants" ], "default": "all" }, "description": "Define o tipo de conteúdo retornado: `all` (tudo), `category` (só categorias), `products` (só produtos), `variants` (só variantes)." }, { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1, "minimum": 1 }, "description": "Número da página para paginação dos resultados." }, { "name": "search", "in": "query" } ] } } } } ``` -------------------------------- ### Display Parent Category Name Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/catalog/categories Show the parent category's name alongside the current category's name. Requires cross-referencing with `catalog.categories_all` to get the parent's name. ```liquid {% for category in catalog.categories %}

{{ category.name }} {% if category.parent_category %} {% comment %} Pra mostrar o nome do pai, não só o ID, cruze com categories_all. Veja o padrão completo em catalog.categories_all. {% endcomment %} {% endif %}

{% endfor %} ``` -------------------------------- ### Adicionar estoque ao produto Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/estoque Adiciona novas chaves de estoque a um produto existente, sem remover as atuais. É necessário incluir a chave `x-api-key` no cabeçalho da requisição. ```APIDOC ## Adicionar estoque ao produto ### Description Adiciona novas chaves de estoque a um produto existente, sem remover as atuais. ### Method POST ### Endpoint /product/stock/{productId} ### Parameters #### Path Parameters - **productId** (string) - Required - ID do produto para adicionar estoque #### Request Headers - **x-api-key** (string) - Required - Chave de API necessária para autenticação. #### Request Body - **id** (string) - Required - O identificador único do produto. - **stock** (array) - Required - Uma lista de chaves ou códigos de estoque (ex: licenças, seriais, etc) para associar ao produto. - Items are strings. ### Response #### Success Response (200) - **estoques** (array) - Lista de itens de estoque adicionados. - **id** (string) - ID do item de estoque. - **produto** (string) - ID do produto associado. - **estoque** (string) - O item de estoque. - **pos** (integer) - Posição do item. - **updatedAt** (string) - Data e hora da última atualização. - **createdAt** (string) - Data e hora da criação. - **total** (integer) - Número total de itens de estoque. #### Error Response (401) - **error** (string) - Mensagem de erro indicando não autorizado. #### Error Response (404) - **error** (string) - Mensagem de erro indicando produto não encontrado. ``` -------------------------------- ### Display Post-Purchase Instructions Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/product Renders specific post-purchase instructions for a product, such as delivery details. This content is displayed only if the product has associated instructions. ```liquid {% if product.instructions %}

Como funciona a entrega

{{ product.instructions }}
{% endif %} ``` -------------------------------- ### Extract Conversion ID from Google Ads Snippet Source: https://ereemby.gitbook.io/docs/informacoes-gerais/plugins/marketing/google-ads This JavaScript snippet shows where to find the Conversion ID within the Google Ads event snippet configuration. The Conversion ID is the value starting with 'AW-' used for tracking. ```javascript gtag('config', 'AW-11450274184'); ``` -------------------------------- ### Cart Event Payload Example Source: https://ereemby.gitbook.io/docs/informacoes-gerais/notificacoes/notificacoes-de-vendas-proprio This JSON payload represents the 'cart' event, detailing items within a shopping cart. It includes product information, quantities, pricing, and associated order details. Use this to understand the structure of cart data. ```json { "event_name": "cart", "carrinhos": [ { "id": 3792967, "nome": "produto 1", "imagem": "Link da imagem do produto", "valor": 1, "pedido": "ID DO PEDIDO", "produto": "ID DO PRODUTO", "variante": null, "categoria": "ID DA CATEGORIA DO PRODUTO", "quantidade": 1, "automatic": true, "tipo": "series", "createdAt": "2026-01-27T22:22:56.000Z", "updatedAt": "2026-01-27T22:22:56.000Z" }, { "id": 3792968, "nome": "Variante 1", "imagem": "Link da imagem do produto", "valor": 1, "pedido": "ID DO PEDIDO", "produto": "ID DO PRODUTO", "variante": "ID DA VARIANTE", "categoria": "ID DA CATEGORIA DO PRODUTO", "quantidade": 1, "automatic": true, "tipo": "texto", "createdAt": "2026-01-27T22:22:56.000Z", "updatedAt": "2026-01-27T22:22:56.000Z" } ], "pedido": { "id": "ID DO PEDIDO", "nome": "1x produto 1, 1x Produto com Variante(Variante 1)", "quantidade": 2, "total": 2, "metodo": "pix", "status": "sucesso", "link": null, "qr": "QRCODE PIX GERADO", "copiaecola": "CODIGO COPIA E COLA GERADO", "linkPagamento": null, "email": "email@docliente.com", "ip": "ENDEREÇO IPV4/IPV6 DO CLIENTE", "estado": "ESTADO DO CLIENTE", "pais": "PAÍS DO CLIENTE", "loja": "ID DA LOJA", "cupom": null, "banco": "GATEWAY UTILIZADO PELO LOJISTA", "cpf": "", "afiliado": null, "afiliado_lucro": null, "client_name": "Nome do Cliente", "client_address":{ "number":"S/N", "street":"Praça da Sé, Sé, São Paulo, SP", "zipCode":"01001000", "complement":"Complemento do cliente (opcional)", "additionalInfo":"Ponto de referência (opcional)" }, "client_phone":"+55 11912345678", "cpf":"48638566018" }, "cupom": null, "variante": [ { "id": ID DA VARIANTE, "loja": "ID DA LOJA", "produto": "ID DO PRODUTO", "icon": "LINK DO ICONE DA VARIANTE", "desc": "

Descrição do produto com variante

", "nome": "NOME DA VARIANTE", "valor": 1, "status": true, "tipo": "texto", "comparacao": 0, "minima": 1, "maximo": null, "faturado": 1, "vendidos": 1, "vendas": 1, "pos": null, "open_chat": false } ] } ``` -------------------------------- ### Node.js + Express: Receive and Validate Webhook Events Source: https://ereemby.gitbook.io/docs/desenvolvedores/webhooks This example demonstrates how to receive POST requests with JSON payloads, capture the raw request body, validate the `x-webhook-signature` header using HMAC SHA-256, and log the payload after successful validation. It's crucial to process the raw body for accurate signature verification. ```javascript const express = require('express'); const crypto = require('crypto'); const app = express(); const port = 3000; // Use a middleware to capture the raw body app.use(express.json({ verify: (req, res, buf) => { req.rawBody = buf.toString(); } })); app.post('/webhooks/ereemby', (req, res) => { const signature = req.headers['x-webhook-signature']; const secret = process.env.EREEMBY_WEBHOOK_SECRET; // Store your secret in environment variables if (!secret) { console.error('Webhook secret not configured.'); return res.status(500).send('Server configuration error'); } if (!signature) { console.error('Missing webhook signature.'); return res.status(400).send('Bad Request: Missing Signature'); } // Validate the signature const hmac = crypto.createHmac('sha256', secret); hmac.update(req.rawBody); const calculatedSignature = hmac.digest('hex'); if (calculatedSignature !== signature) { console.error('Invalid webhook signature.'); return res.status(401).send('Unauthorized'); } // Signature is valid, process the event console.log('Webhook received and validated:', req.body); // Your logic to handle the event (e.g., process sale, update database) res.status(200).send('Event received'); }); app.listen(port, () => { console.log(`Webhook server listening on port ${port}`); }); ``` -------------------------------- ### Atualizar produto Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo/produtos Atualiza parcialmente os dados de um produto existente. Envie apenas os campos que deseja alterar. ```APIDOC ## PATCH /product/{productId} ### Description Atualiza parcialmente os dados de um produto existente. Envie apenas os campos que deseja alterar. ### Method PATCH ### Endpoint /product/{productId} ### Parameters #### Path Parameters - **productId** (string) - Required - ID único do produto. #### Request Body - **name** (string) - Optional - Nome do produto. - **price** (number) - Optional - Preço de venda do produto. - **compare_price** (number) - Optional - Preço original (riscado), para exibição comparativa. - **description** (string) - Optional - Descrição HTML do produto. - **category_id** (string) - Optional - ID da categoria à qual o produto pertence. - **status** (boolean) - Optional - Define se o produto está visível no catálogo. - **featured** (boolean) - Optional - Marca o produto como destaque. - **type** (string) - Optional - Tipo de entrega do produto: series (estoque em linhas) ou texto (um único texto sempre enviado ao cliente). - **min** (integer) - Optional - Quantidade mínima por pedido. - **max** (integer) - Optional - Quantidade máxima por pedido. - **stock** (array) - Optional - Lista de itens em estoque (para entrega automática). - **automatic** (boolean) - Optional - Ativa a entrega automática do produto. - **quantity** (integer) - Optional - Quantidade em estoque (para produtos com estoque numérico). - **slug** (string) - Optional - Slug único para URL do produto. - **youtube** (string) - Optional - URL do vídeo do YouTube associado ao produto. - **images** (array) - Optional - Lista de URLs de imagens adicionais do produto. - **open_chat** (boolean) - Optional - Abre o chat automaticamente ao adicionar ao carrinho. - **instructions** (string) - Optional - Instruções de uso entregues ao comprador. - **affiliate_fee** (number) - Optional - Comissão de afiliado em porcentagem. - **hide_when_out_of_stock** (boolean) - Optional - Oculta o produto quando o estoque zerar. - **hide_sold_count** (boolean) - Optional - Oculta o contador de vendas exibido no produto. ### Response #### Success Response (200) - Produto atualizado com sucesso. #### Error Response (401) - Não autorizado: o header x-api-key está ausente ou inválido. #### Error Response (404) - Produto não encontrado. #### Error Response (429) - Muitas requisições - limite de taxa excedido. ``` -------------------------------- ### Listar Catálogo de Produtos Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo Recupere uma lista completa do catálogo de produtos da sua loja. Esta rota é útil para sincronizar dados de produtos com sistemas externos. ```APIDOC ## GET /product/catalog ### Description Recupera uma lista completa do catálogo de produtos da sua loja. ### Method GET ### Endpoint /product/catalog ### Headers - **x-api-key** (string) - Required - Sua chave de API para autenticação. ### Rate Limit 2 requisições por segundo. ``` -------------------------------- ### Product Image Gallery Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/product Displays a product image gallery with a main image and thumbnails. Requires `product.images` to be an array of image URLs. The first image is shown as primary, and subsequent images are displayed as clickable thumbnails. ```liquid {% if product.images.size > 0 %}
{{ product.name }}
{% if product.images.size > 1 %}
{% for img in product.images %} {% endfor %}
{% endif %}
{% endif %} ``` -------------------------------- ### Atualizar Variante de Produto Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/gestao-de-catalogo/variantes Atualiza parcialmente os dados de uma variante existente. Envie apenas os campos que deseja alterar. ```json { "openapi": "3.0.0", "info": { "title": "Gestão de Catálogo API", "version": "1.0.0" }, "servers": [ { "url": "https://api.ereemby.app/api/v1", "description": "Servidor de Produção" } ], "security": [ { "ApiKeyAuth": [] } ], "components": { "securitySchemes": { "ApiKeyAuth": { "type": "apiKey", "in": "header", "name": "x-api-key", "description": "Chave de API gerada no painel da Ereemby. Deve ser enviada no header x-api-key em todas as requisições." } }, "schemas": { "VariantUpdate": { "type": "object", "description": "Campos para atualizar uma variante. Todos os campos são opcionais - envie apenas o que deseja alterar.", "properties": { "name": { "type": "string" }, "price": { "type": "number" }, "description": { "type": "string" }, "compare_price": { "type": "number" }, "status": { "type": "boolean" }, "automatic": { "type": "boolean" }, "affiliate_fee": { "type": "number" }, "image": { "type": "string", "nullable": true } } }, "Error": { "type": "object", "properties": { "error": { "type": "string" } } } }, "responses": { "Unauthorized": { "description": "Não autorizado: o header x-api-key está ausente ou inválido.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "RateLimit": { "description": "Muitas requisições - limite de taxa excedido.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } } } }, "paths": { "/products/{productId}/variants/{variantId}": { "patch": { "tags": [ "Variantes" ], "summary": "Atualizar variante", "description": "Atualiza parcialmente os dados de uma variante existente.", "parameters": [ { "name": "productId", "in": "path", "required": true, "description": "ID único do produto.", "schema": { "type": "string" } }, { "name": "variantId", "in": "path", "required": true, "description": "ID único da variante.", "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/VariantUpdate" } } } }, "responses": { "200": { "description": "Variante atualizada com sucesso.", "content": { "application/json": {} } }, "401": { "$ref": "#/components/responses/Unauthorized" }, "404": { "description": "Recurso não encontrado.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Error" } } } }, "429": { "$ref": "#/components/responses/RateLimit" } } } } } } ``` -------------------------------- ### Create Bot Source: https://ereemby.gitbook.io/docs/desenvolvedores/documentacao-api-publica/bot-de-suporte Creates a new bot with the provided name and optional icon. ```APIDOC ## POST /api/v1/bot ### Description Creates a new bot with the provided name and optional icon. ### Method POST ### Endpoint /api/v1/bot ### Parameters #### Request Body - **name** (string) - Required - Name of the bot - **icon** (string) - Optional - URL of the bot's icon ### Request Example { "name": "MyAwesomeBot", "icon": "https://example.com/icon.png" } ### Response #### Success Response (200) - **message** (string) - Confirmation message - **bot** (object) - Details of the created bot - **id** (string) - UUID of the bot - **name** (string) - Name of the bot - **icon** (string) - URL of the bot's icon - **loja** (string) - Store identifier - **updatedAt** (string) - Date and time of last update - **createdAt** (string) - Date and time of creation #### Response Example { "message": "Bot created successfully", "bot": { "id": "a1b2c3d4-e5f6-7890-1234-567890abcdef", "name": "MyAwesomeBot", "icon": "https://example.com/icon.png", "loja": "store123", "updatedAt": "2023-10-27T10:00:00Z", "createdAt": "2023-10-27T09:00:00Z" } } ``` -------------------------------- ### Product Hero Section Source: https://ereemby.gitbook.io/docs/sistema-de-temas/variaveis/product Renders the main product hero section with image, title, price, and a buy button. Includes conditional display for images and stock status. Assumes product images are available in `product.images` and stock in `product.stock_amount`. ```liquid {% comment %} Bloco principal com imagem, título, preço e CTA {% endcomment %}
{% if product.images.size > 0 %}
{{ product.name }}
{% endif %}

{{ product.name }}

{% if product.comparison %} R$ {{ product.comparison }} {% endif %} R$ {{ product.price }}
{% if product.stock_amount > 0 %} {% else %} {% endif %}
```