# Autenticação
Source: https://docs.martan.app/api-reference/authentication
As rotas de **Orders** e **Products** utilizam autenticação por **API Key** do tipo `orders`.
## Headers Obrigatórios
Todas as requisições devem incluir os seguintes headers:
Sua API key do tipo `orders`
ID da sua loja
Deve ser `application/json`
```bash theme={null}
curl -X POST https://api.appmartan.com.br/orders \
-H "X-API-Key: sua-api-key-aqui" \
-H "X-Store-Id: 123" \
-H "Content-Type: application/json" \
-d '{
"order_id": "ORD-12345",
"order_date": "2024-01-01T00:00:00.000Z",
"delivery_date": "2024-01-05T00:00:00.000Z",
"products": [...],
"customers": [...]
}'
```
## Erros de Autenticação
Código HTTP do erro
Código de erro específico da API
Mensagem de erro em inglês
Mensagens de erro traduzidas
Mensagem em inglês
Mensagem em português
### Códigos de Erro
| Status | Código | Descrição |
| ------ | ------- | ---------------------------------------------- |
| 401 | 8121200 | API key ausente no header X-API-Key |
| 417 | 8121201 | Store ID ausente no header X-Store-Id |
| 401 | 8121202 | API key inválida ou inativa |
| 401 | 8121203 | Store inativa |
| 401 | 8121204 | API key expirada |
| 403 | 8121205 | Store ID não corresponde à API key |
| 403 | 8121206 | Limite de uso de pedidos excedido para o plano |
### Exemplo de Resposta de Erro
```json theme={null}
{
"status": 401,
"error_code": 8121202,
"message": "Invalid or inactive API key",
"user_message": {
"en_us": "Invalid or inactive API key",
"pt_br": "API key inválida ou inativa"
},
"more_info": null
}
```
# Tratamento de Erros
Source: https://docs.martan.app/api-reference/error-handling
Formato padrão de erros e códigos de erro da API
Todas as respostas de erro seguem um formato padrão consistente, facilitando o tratamento e debugging.
## Formato Padrão de Erro
Código HTTP do erro
Código de erro específico da API Martan
Mensagem de erro em inglês
Mensagens de erro traduzidas
Mensagem em inglês
Mensagem em português
Informações adicionais sobre o erro (quando disponível)
## Códigos de Erro por Categoria
### Autenticação
| Status | Código | Descrição |
| ------ | ------- | ---------------------------------------------- |
| 401 | 8121200 | API key ausente no header X-API-Key |
| 417 | 8121201 | Store ID ausente no header X-Store-Id |
| 401 | 8121202 | API key inválida ou inativa |
| 401 | 8121203 | Store inativa |
| 401 | 8121204 | API key expirada |
| 403 | 8121205 | Store ID não corresponde à API key |
| 403 | 8121206 | Limite de uso de pedidos excedido para o plano |
### Orders
| Status | Código | Descrição |
| ------ | ------ | ------------------------------------------- |
| 400 | 802030 | Body JSON mal formatado ou validação falhou |
| 422 | 103 | Pedido já existe (duplicado) |
### Products
| Status | Código | Descrição |
| ------ | ------ | --------------------------------------------------- |
| 400 | 802030 | Body JSON mal formatado ou validação falhou |
| 422 | 103 | Produto já existe (mesmo `product_id` e `store_id`) |
| 500 | 520 | Erro inesperado ao buscar ou criar produto |
## Exemplos de Respostas de Erro
### Erro de Validação
```json theme={null}
{
"status": 400,
"error_code": 802030,
"message": "Bad-formatted JSON body, details in user_message",
"user_message": {
"en_us": "products: Array must contain at least 1 element(s)",
"pt_br": "products: Array must contain at least 1 element(s)"
},
"more_info": null
}
```
**Causas comuns:**
* Array vazio em `products` ou `customers`
* Campo obrigatório ausente
* Tipo de dado incorreto
* Valor fora do intervalo permitido (ex: preço negativo)
### Erro de Duplicação (Orders)
```json theme={null}
{
"status": 422,
"error_code": 103,
"message": "Order has already been sent",
"user_message": {
"en_us": "Duplicated, Order has already been sent",
"pt_br": "Pedido já encontra-se criado"
},
"more_info": null
}
```
**Causa:** Já existe um pedido com o mesmo `order_id` e `store_id`.
**Solução:** Use um `order_id` único ou verifique se o pedido já foi criado anteriormente.
### Erro de Duplicação (Products)
```json theme={null}
{
"status": 422,
"error_code": 103,
"message": "Product has already been sent",
"user_message": {
"en_us": "Duplicated, Product has already been sent",
"pt_br": "Produto já encontra-se criado"
},
"more_info": null
}
```
**Causa:** Já existe um produto com o mesmo `product_id` e `store_id`.
**Solução:** Use um `product_id` único ou atualize o produto existente.
### Erro de Limite de Uso
```json theme={null}
{
"status": 403,
"error_code": 8121206,
"message": "Order usage limit exceeded",
"user_message": {
"en_us": "Order usage limit exceeded for your plan",
"pt_br": "Limite de uso de pedidos excedido para o seu plano"
},
"more_info": null
}
```
**Causa:** O plano da sua conta atingiu o limite de pedidos permitidos.
**Solução:** Entre em contato com o suporte ou faça upgrade do seu plano.
### Erro de Autenticação
```json theme={null}
{
"status": 401,
"error_code": 8121202,
"message": "Invalid or inactive API key",
"user_message": {
"en_us": "Invalid or inactive API key",
"pt_br": "API key inválida ou inativa"
},
"more_info": null
}
```
**Causas comuns:**
* API key ausente no header
* API key inválida ou inativa
* API key expirada
* API key não é do tipo `orders`
**Solução:** Verifique se a API key está correta e ativa no painel da Martan.
### Erro de Store ID
```json theme={null}
{
"status": 403,
"error_code": 8121205,
"message": "Store ID does not match API key",
"user_message": {
"en_us": "Store ID does not match API key",
"pt_br": "Store ID não corresponde à API key"
},
"more_info": null
}
```
**Causa:** O `X-Store-Id` fornecido não corresponde à store associada à API key.
**Solução:** Verifique se o `X-Store-Id` está correto e corresponde à store da sua API key.
## Tratamento de Erros no Código
### JavaScript/TypeScript
```typescript theme={null}
try {
const response = await fetch('https://api.appmartan.com.br/orders', {
method: 'POST',
headers: {
'X-API-Key': 'sua-api-key',
'X-Store-Id': '123',
'Content-Type': 'application/json'
},
body: JSON.stringify(orderData)
});
if (!response.ok) {
const error = await response.json();
switch (error.error_code) {
case 802030:
console.error('Erro de validação:', error.user_message.pt_br);
break;
case 103:
console.error('Duplicação:', error.user_message.pt_br);
break;
case 8121206:
console.error('Limite excedido:', error.user_message.pt_br);
break;
default:
console.error('Erro desconhecido:', error);
}
throw new Error(error.user_message.pt_br);
}
const result = await response.json();
console.log('Pedido criado:', result.id);
} catch (error) {
console.error('Erro na requisição:', error);
}
```
## Boas Práticas
1. **Sempre verifique o status HTTP**: Use `response.ok` ou verifique o código de status antes de processar a resposta.
2. **Trate erros específicos**: Use os códigos de erro para implementar lógica específica para cada tipo de erro.
3. **Exiba mensagens ao usuário**: Use `user_message.pt_br` ou `user_message.en_us` para exibir mensagens amigáveis.
4. **Log de erros**: Registre os erros completos para debugging, incluindo `error_code` e `message`.
5. **Retry para erros temporários**: Implemente retry logic para erros 5xx (erros do servidor).
# Criar Pedido
Source: https://docs.martan.app/api-reference/orders
POST /orders
Cria um novo pedido no Martan
## Headers
Sua API key do tipo `orders`
ID da sua loja
Deve ser `application/json`
## Body
ID único do pedido no seu sistema
Data do pedido no formato ISO 8601 (ex: `2024-01-01T00:00:00.000Z`)
Data de entrega do pedido no formato ISO 8601
Data para solicitar review (opcional). Se não fornecido, será calculado automaticamente baseado nas configurações da store, evitando fins de semana.
Array de produtos do pedido (mínimo 1 produto)
ID do produto no seu sistema
SKU do produto
Nome do produto
Preço do produto (0 a 9999999999)
URL do produto
Array de URLs de imagens do produto
Código GTIN do produto
Código MPN do produto
Array de clientes do pedido (mínimo 1 cliente)
Nome do cliente
Email do cliente
Telefone do cliente
Origem do cliente (ex: "website", "mobile", etc.)
## Response
ID único do pedido criado no sistema Martan
## Erros Possíveis
| Status | Código | Descrição |
| ------ | ------- | ---------------------------------------------- |
| 400 | 802030 | Body JSON mal formatado ou validação falhou |
| 422 | 103 | Pedido já existe (duplicado) |
| 403 | 8121206 | Limite de uso de pedidos excedido para o plano |
`request_review_at` não foi fornecido, então será calculado automaticamente baseado nas configurações da Loja.
# Criar Produto
Source: https://docs.martan.app/api-reference/products
POST /products
Cria um novo produto no Martan.
## Headers
Sua API key do tipo `orders`
ID da sua loja
Deve ser `application/json`
## Body
ID único do produto no seu sistema
Nome do produto
Preço do produto (0 a 9999999999). Se não fornecido, será 0 por padrão.
SKU do produto
Código GTIN do produto
Código MPN do produto
URL do produto
Array de URLs de imagens do produto
## Response
ID único do produto criado no sistema Martan
## Erros Possíveis
| Status | Código | Descrição |
| ------ | ------ | --------------------------------------------------- |
| 400 | 802030 | Body JSON mal formatado ou validação falhou |
| 422 | 103 | Produto já existe (mesmo `product_id` e `store_id`) |
| 500 | 520 | Erro inesperado ao buscar ou criar produto |
# Schemas de Validação
Source: https://docs.martan.app/api-reference/schemas
Estrutura e validação dos dados para Orders e Products
## Orders Schema
O schema de Orders utiliza validação **strict**.
```typescript theme={null}
{
order_id: string; // Obrigatório
order_date: string; // Obrigatório (ISO 8601)
delivery_date: string; // Obrigatório (ISO 8601)
request_review_at?: string; // Opcional (ISO 8601)
products: Array<{ // Obrigatório (mínimo 1)
product_id: string; // Obrigatório
sku: string; // Obrigatório
name: string; // Obrigatório
price: number; // Obrigatório (0-9999999999)
url: string; // Obrigatório
pictures?: string[]; // Opcional
gtin?: string; // Opcional
mpn?: string; // Opcional
}>;
customers: Array<{ // Obrigatório (mínimo 1)
name: string; // Obrigatório
email: string; // Obrigatório
phone: string; // Obrigatório
origin?: string; // Opcional
}>;
}
```
### Características do Schema de Orders
* **Schema strict**: não permite campos adicionais
* **Validação mínima**: produtos e clientes devem ter pelo menos 1 item
* **Datas em ISO 8601**: formato `YYYY-MM-DDTHH:mm:ss.sssZ`
### Validações de Orders
| Campo | Tipo | Obrigatório | Validação |
| ----------------------- | ------ | ----------- | ---------------- |
| `order_id` | string | Sim | - |
| `order_date` | string | Sim | Formato ISO 8601 |
| `delivery_date` | string | Sim | Formato ISO 8601 |
| `request_review_at` | string | Não | Formato ISO 8601 |
| `products` | array | Sim | Mínimo 1 item |
| `products[].product_id` | string | Sim | - |
| `products[].sku` | string | Sim | - |
| `products[].name` | string | Sim | - |
| `products[].price` | number | Sim | 0 a 9999999999 |
| `products[].url` | string | Sim | - |
| `products[].pictures` | array | Não | Array de strings |
| `products[].gtin` | string | Não | - |
| `products[].mpn` | string | Não | - |
| `customers` | array | Sim | Mínimo 1 item |
| `customers[].name` | string | Sim | - |
| `customers[].email` | string | Sim | - |
| `customers[].phone` | string | Sim | - |
| `customers[].origin` | string | Não | - |
## Products Schema
O schema de Products utiliza validação **strict**, não permitindo campos adicionais.
```typescript theme={null}
{
product_id: string; // Obrigatório
name: string; // Obrigatório
price: number; // Obrigatório (0-9999999999, padrão: 0)
sku: string; // Obrigatório
gtin: string; // Obrigatório
mpn: string; // Obrigatório
url: string; // Obrigatório
pictures?: string[]; // Opcional
}
```
### Características do Schema de Products
* **Schema strict**: não permite campos adicionais
* **Preço tem valor padrão**: se não fornecido, será 0
* **Todos os campos (exceto `pictures`) são obrigatórios**
### Validações de Products
| Campo | Tipo | Obrigatório | Validação |
| ------------ | ------ | ----------- | -------------------------- |
| `product_id` | string | Sim | - |
| `name` | string | Sim | - |
| `price` | number | Sim | 0 a 9999999999 (padrão: 0) |
| `sku` | string | Sim | - |
| `gtin` | string | Sim | - |
| `mpn` | string | Sim | - |
| `url` | string | Sim | - |
| `pictures` | array | Não | Array de strings |
## Exemplos de Validação
### Orders - Exemplo Válido
```json theme={null}
{
"order_id": "ORD-12345",
"order_date": "2024-01-01T00:00:00.000Z",
"delivery_date": "2024-01-05T00:00:00.000Z",
"products": [
{
"product_id": "PROD-001",
"sku": "SKU-001",
"name": "Produto Exemplo",
"price": 99.90,
"url": "https://example.com/produto",
"pictures": ["https://example.com/img1.jpg"],
"gtin": "1234567890123",
"mpn": "MPN-001"
}
],
"customers": [
{
"name": "João Silva",
"email": "joao@example.com",
"phone": "+5511999999999",
"origin": "website"
}
]
}
```
### Orders - Exemplo Inválido
```json theme={null}
{
"order_id": "ORD-12345",
"order_date": "2024-01-01T00:00:00.000Z",
"delivery_date": "2024-01-05T00:00:00.000Z",
"products": [],
"customers": [],
"invalid_field": "valor" // ❌ Não permitido (schema strict)
}
```
**Erro retornado:**
* `products: Array must contain at least 1 element(s)`
* `customers: Array must contain at least 1 element(s)`
* `invalid_field: Unrecognized key(s) in object`
### Products - Exemplo Válido
```json theme={null}
{
"product_id": "PROD-001",
"name": "Produto Exemplo",
"price": 99.90,
"sku": "SKU-001",
"gtin": "1234567890123",
"mpn": "MPN-001",
"url": "https://example.com/produto",
"pictures": [
"https://example.com/img1.jpg",
"https://example.com/img2.jpg"
]
}
```
### Products - Exemplo Inválido
```json theme={null}
{
"product_id": "PROD-001",
"name": "Produto Exemplo",
"price": 99.90,
"sku": "SKU-001",
"invalid_field": "valor" // ❌ Não permitido (schema strict)
}
```
**Erro retornado:**
* `gtin: Required`
* `mpn: Required`
* `url: Required`
* `invalid_field: Unrecognized key(s) in object`
## Formato de Datas
Todas as datas devem estar no formato **ISO 8601**:
```
YYYY-MM-DDTHH:mm:ss.sssZ
```
**Exemplos:**
* `2024-01-01T00:00:00.000Z`
* `2024-01-15T10:30:00.000Z`
* `2024-12-31T23:59:59.999Z`
## Validação de Preços
Os preços devem estar no intervalo:
* **Mínimo**: 0
* **Máximo**: 9.999.999.999
Valores negativos ou acima do máximo resultarão em erro de validação.
# E-Com Plus
Source: https://docs.martan.app/integracoes/ecomplus
Saiba como integrar sua loja com Martan.
Para utilizar o Martan em sua loja na E-Com Plus precisamos configurar alguns passos.
Primeiramente precisamos instalar nosso aplicativo na sua loja, e após isso configuramos nossos widgets.
### Instalar Aplicativo
Passo 1: Instale o aplicativo Martan na sua loja, isso pode ser feito através do [market](https://market.e-com.plus/apps/martan-avaliacao-de-produtos).
Siga as instruções para instalar na sua loja, esse app será responsável pela sincronização de pedidos e produtos.
Obs: é necessario criar a sua conta antes da instalação do app para seguir fluxo de oauth.
Após esta etapa o aplicativo está pronto para se comunicar com nossa API sincronizando novos pedidos automaticamente.
# Introdução
Source: https://docs.martan.app/introduction
Bem vindo à documentação oficial do Martan
O Martan é uma plataforma completa de **avaliações e perguntas para e-commerce**, projetada para aumentar a confiança dos clientes e impulsionar suas vendas através de prova social.
Nossa documentação foi organizada para ajudar você a integrar nossas soluções da maneira mais eficiente possível, seja utilizando nossos Widgets prontos, conectando-se via API ou utilizando nossas integrações nativas.
## O que você pode fazer
Implemente avaliações, ratings e perguntas em sua loja usando nossos Web Components modernos e customizáveis.
Explore nossa API REST para criar integrações personalizadas, gerenciar produtos e pedidos programaticamente.
Veja como conectar o Martan facilmente com plataformas de e-commerce como a E-Com Plus.
Precisa de ajuda? Entre em contato com nosso time de suporte para resolver suas dúvidas.
## Funcionalidades Principais
Nossos widgets são construídos para performance e facilidade de uso:
* **Reviews Widget**: Exiba avaliações detalhadas com fotos e filtros.
* **Rating Widget**: Mostre a média de estrelas nos cards de produtos para aumentar o CTR.
* **Questions Widget**: Permita que clientes tirem dúvidas diretamente na página do produto.
Comece agora mesmo explorando a seção de [Widgets](/widgets/introduction).
# Formato de Dados da API
Source: https://docs.martan.app/widgets/api-format
Estrutura de dados esperada pela API Martan
## Reviews Widget
O widget consome a API Martan e espera o seguinte formato de resposta:
```json theme={null}
{
"result": [
{
"id": "string",
"display_name": "string",
"rating": 5,
"body": "string",
"title": "string",
"created_at": "2024-01-15T00:00:00Z",
"verified_purchase": true,
"is_recommended": true,
"pictures": []
}
],
"count": 100,
"meta": {
"limit": 10,
"offset": 0,
"query": {
"product_sku": "PROD-123"
}
}
}
```
### Campos do Review
| Campo | Tipo | Descrição |
| ------------------- | ------- | -------------------------- |
| `id` | string | ID único da avaliação |
| `display_name` | string | Nome do avaliador |
| `rating` | number | Nota de 1 a 5 |
| `body` | string | Texto da avaliação |
| `title` | string | Título da avaliação |
| `created_at` | string | Data de criação (ISO 8601) |
| `verified_purchase` | boolean | Se a compra foi verificada |
| `is_recommended` | boolean | Se o produto é recomendado |
| `pictures` | array | Array de URLs de imagens |
## Rating Widget
O widget de rating consome a API Martan no endpoint `/api/v1/ratings.json?expand=metrics` e espera o seguinte formato:
```json theme={null}
{
"result": [
{
"sku": "PROD-123",
"product_id": "123",
"average": 4.5,
"total": 120,
"recommended": 100,
"not_recommended": 5,
"recommended_percentage": 83.33,
"rate": {
"one": 0,
"two": 2,
"three": 8,
"four": 30,
"five": 80
}
}
],
"count": 1
}
```
### Campos do Rating
| Campo | Tipo | Descrição |
| ------------------------ | ------ | --------------------------------------- |
| `sku` | string | SKU do produto |
| `product_id` | string | ID do produto |
| `average` | number | Média de avaliações (0-5) |
| `total` | number | Total de avaliações |
| `recommended` | number | Número de recomendações |
| `not_recommended` | number | Número de não recomendações |
| `recommended_percentage` | number | Percentual de recomendações |
| `rate` | object | Distribuição por estrelas |
| `rate.one` | number | Quantidade de avaliações com 1 estrela |
| `rate.two` | number | Quantidade de avaliações com 2 estrelas |
| `rate.three` | number | Quantidade de avaliações com 3 estrelas |
| `rate.four` | number | Quantidade de avaliações com 4 estrelas |
| `rate.five` | number | Quantidade de avaliações com 5 estrelas |
O widget faz cache dos dados no localStorage por 24 horas para otimizar performance. Apenas uma requisição à API é feita por página, mesmo com múltiplos componentes.
# Configuração Global
Source: https://docs.martan.app/widgets/configuration
Configure credenciais uma única vez e compartilhe entre todos os widgets
Para evitar repetir `data-store-id` e `data-store-key` em cada widget, você pode configurar essas credenciais uma única vez e compartilhar entre todos os widgets.
## Opção 1: Via JavaScript (Recomendado)
Configure antes de carregar os widgets:
```html theme={null}
```
## Opção 2: Via Data Attributes
Defina no elemento `
` ou ``:
```html theme={null}
```
## Uso com Configuração Global
Após configurar globalmente, você pode usar os widgets sem repetir as credenciais:
```html theme={null}
```
Se um widget tiver `data-store-id` ou `data-store-key` definidos localmente, esses valores terão
**prioridade** sobre a configuração global. Isso permite sobrescrever a configuração global para
casos específicos.
# Customização
Source: https://docs.martan.app/widgets/customization
Personalize os widgets usando CSS variables
Os widgets podem ser customizados usando CSS variables, permitindo que você adapte as cores, espaçamentos e tipografia para combinar com o design da sua loja.
## Variáveis CSS Disponíveis
### Cores
| Variável | Descrição |
| ------------------------- | ------------------------------------------------------ |
| `--rw-primary-color` | Cor primária (botões, links) |
| `--rw-text-color` | Cor do texto principal |
| `--rw-text-secondary` | Cor do texto secundário |
| `--rw-border-color` | Cor das bordas |
| `--rw-bg-color` | Cor de fundo |
| `--rw-bg-secondary` | Cor de fundo secundária |
| `--rw-star-color` | Cor das estrelas preenchidas |
| `--rw-star-empty` | Cor das estrelas vazias |
| `--rw-progress-bar-color` | Cor das barras de progresso (distribuição de estrelas) |
### Espaçamentos
| Variável | Descrição |
| ----------------- | ------------------------- |
| `--rw-spacing-xs` | Espaçamento extra pequeno |
| `--rw-spacing-sm` | Espaçamento pequeno |
| `--rw-spacing-md` | Espaçamento médio |
| `--rw-spacing-lg` | Espaçamento grande |
| `--rw-spacing-xl` | Espaçamento extra grande |
### Tipografia
| Variável | Descrição |
| --------------------- | ------------------------ |
| `--rw-font-family` | Família de fontes |
| `--rw-font-size-base` | Tamanho de fonte base |
| `--rw-font-size-sm` | Tamanho de fonte pequeno |
| `--rw-font-size-lg` | Tamanho de fonte grande |
### Outros
| Variável | Descrição |
| -------------------- | --------------- |
| `--rw-border-radius` | Raio das bordas |
| `--rw-shadow` | Sombra padrão |
| `--rw-shadow-md` | Sombra média |
## Exemplo de Customização
```html theme={null}
```
## Customização por Widget
Você pode customizar cada widget individualmente:
```html theme={null}
```
## Customização Global
Para aplicar customizações a todos os widgets:
```html theme={null}
```
# Uso com Storefront v1 (E-Com.Plus)
Source: https://docs.martan.app/widgets/ecomplus-storefront-v1
Configuração dos widgets no Storefront v1 da E-Com Plus
[Demo](https://demo.martan.app)
### Configurar Widgets
Integrado ao storefront disponibilizamos três tipos de widgets; Rating, Reviews e Perguntas e Responstas.
Para usá-lo basta procurar o widget do Martan na coleção de Widget no seu CMS.
Após habilitar o Widget basta configurar quais widgets quer exibir e outras opções.
## Configurações
Identificador da Loja [Ver](https://dash.martan.app/stores).
Web Id [Ver](https://dash.martan.app/stores).
Opção para habilitar exibição dos widgets no storefront.
Feita as configurações iniciais podemos configurar quais widgets iremos usar.
### Widget Rating (Card Produtos)
## Opções
Opção para habilitar exibição do widget no storefront.
Opção para exibir widget no card de produtos na página de pesquisa
Tamanho do icone das estrelas
Cor do icone
Estilo do Widget: Pode ser Completo ou Compacto.
Quando exibir o widget: Exibir sempre ou apenas quando o produto tiver mais de 1 avaliação.
### Widget Reviews
## Opções
Opção para habilitar exibição do widget no storefront.
Título do Widget (exibido na página de produtos)
Cor do icone
Opções: Padrão, Histogram, Compacto, Centralizado, Resumo
Opções: Grid ou Lista
### Widget Perguntas e Respostas
## Opções
Opção para habilitar exibição do widget no storefront.
Título do Widget (exibido na página de produtos)
Habilitar novas perguntas
# Exemplos Completos
Source: https://docs.martan.app/widgets/examples
Exemplos práticos de uso dos widgets Martan
## Exemplo Completo com Configuração Global
Exemplo completo usando configuração global:
```html theme={null}
Exemplo - Widgets Martan
Rating do Produto
Avaliações do Produto
Perguntas e Respostas
```
## Alternativa com Data Attributes
```html theme={null}
```
## Exemplo com Customização CSS
```html theme={null}
Widgets Customizados
```
## Exemplo com Auto-Discovery (Rating)
```html theme={null}
Auto-Discovery Rating
```
# Uso com Frameworks
Source: https://docs.martan.app/widgets/frameworks
Integre os widgets Martan em React, Vue e outros frameworks
Os widgets Martan são Web Components padrão e podem ser usados diretamente em qualquer framework moderno.
## React
### 1. Configuração Inicial
Primeiro, carregue o script dos widgets no seu `index.html` ou `_document.tsx` (Next.js):
```html theme={null}
```
### 2. Declarar Tipos TypeScript (opcional)
Crie um arquivo `martan-widgets.d.ts` para tipagem:
```typescript theme={null}
// src/types/martan-widgets.d.ts
declare namespace JSX {
interface IntrinsicElements {
'martan-rating': React.DetailedHTMLProps<
React.HTMLAttributes & {
'data-store-id'?: string
'data-store-key'?: string
'data-product-id'?: string
'data-product-sku'?: string
'data-star-color'?: string
'data-theme'?: string
'data-disable-auto-fetch'?: boolean
rating?: number
'total-reviews'?: number
},
HTMLElement
>
'martan-reviews': React.DetailedHTMLProps<
React.HTMLAttributes & {
'data-store-id'?: string
'data-store-key'?: string
'data-product-id'?: string
'data-product-sku'?: string
'data-items-per-page'?: number
'data-header-type'?: string
'data-list-type'?: string
},
HTMLElement
>
'martan-questions': React.DetailedHTMLProps<
React.HTMLAttributes & {
'data-store-id'?: string
'data-store-key'?: string
'data-product-id'?: string
'data-product-sku'?: string
'data-enable-new-questions'?: boolean
},
HTMLElement
>
}
}
```
### 3. Componentes React
```tsx theme={null}
// components/ProductRating.tsx
import React from 'react'
interface ProductRatingProps {
productSku: string
productId?: string
starColor?: string
theme?: 'compact' | null
}
export const ProductRating: React.FC = ({
productSku,
productId,
starColor,
theme
}) => {
return (
)
}
```
```tsx theme={null}
// components/ProductReviews.tsx
import React from 'react'
interface ProductReviewsProps {
productSku: string
productId?: string
itemsPerPage?: number
headerType?: 'default' | 'histogram' | 'compact' | 'minimal' | 'centered'
listType?: 'grid' | 'list'
}
export const ProductReviews: React.FC = ({
productSku,
productId,
itemsPerPage = 10,
headerType = 'default',
listType = 'grid'
}) => {
return (
)
}
```
```tsx theme={null}
// components/ProductQuestions.tsx
import React from 'react'
interface ProductQuestionsProps {
productSku: string
productId?: string
enableNewQuestions?: boolean
}
export const ProductQuestions: React.FC = ({
productSku,
productId,
enableNewQuestions = true
}) => {
return (
)
}
```
### 4. Uso em uma Página
```tsx theme={null}
// pages/ProductPage.tsx
import React from 'react'
import { ProductRating } from '../components/ProductRating'
import { ProductReviews } from '../components/ProductReviews'
import { ProductQuestions } from '../components/ProductQuestions'
const ProductPage: React.FC<{ productSku: string }> = ({ productSku }) => {
return (
)
}
export default ProductPage
```
### SSR (Server-Side Rendering)
Os widgets são client-side only. Em Next.js, use `dynamic` import:
```tsx theme={null}
// Next.js
import dynamic from 'next/dynamic'
const ProductRating = dynamic(
() => import('../components/ProductRating'),
{ ssr: false }
)
```
## Vue
### 1. Configuração Inicial
No seu `index.html` ou `nuxt.config.ts` (Nuxt.js):
```html theme={null}
```
### 2. Componentes Vue
```vue theme={null}
```
```vue theme={null}
```
```vue theme={null}
```
### 3. Uso em uma Página
```vue theme={null}
```
### 4. Nuxt.js - Configuração Global
Para Nuxt.js, você pode adicionar o script no `nuxt.config.ts`:
```typescript theme={null}
// nuxt.config.ts
export default defineNuxtConfig({
app: {
head: {
scripts: [
{
innerHTML: `
window.MartanConfig = window.MartanConfig || {}
window.MartanConfig.init({
storeId: 'seu-store-id',
storeKey: 'sua-store-key'
})
`,
type: 'text/javascript'
},
{
src: 'https://cdn.martan.app/widgets.js',
type: 'module'
}
]
}
}
})
```
### SSR (Server-Side Rendering)
Em Nuxt.js, use `ClientOnly` wrapper:
```vue theme={null}
```
## Notas Importantes
1. **Atributos com hífen**: Em React, use `data-product-sku` (com hífen) ou `dataProductSku` (camelCase). Em Vue, use `:data-product-sku` ou `data-product-sku`.
2. **Configuração Global**: Configure `window.MartanConfig` antes de carregar os widgets para evitar repetir credenciais.
3. **TypeScript**: Os tipos são opcionais, mas recomendados para melhor experiência de desenvolvimento.
4. **SSR (Server-Side Rendering)**: Os widgets são client-side only. Use `dynamic` import (Next.js) ou `ClientOnly` wrapper (Nuxt.js).
# Instalação
Source: https://docs.martan.app/widgets/installation
Como instalar e usar os widgets Martan
## Uso Básico
### Incluir o Script no HTML
O widget é um módulo ES, então **sempre** precisa ser carregado com `type="module"`. Sem isso, você receberá o erro `Uncaught SyntaxError: Unexpected token 'export'`.
```html theme={null}
```
Os componentes são registrados automaticamente como ``, `` e ``, então você não precisa importar as classes se estiver usando apenas HTML.
## Exemplo Mínimo
```html theme={null}
Widgets Martan
```
# Introdução aos Widgets
Source: https://docs.martan.app/widgets/introduction
Coleção de widgets usando Web Components (Lit) para uso em e-commerces
Os widgets Martan são componentes web construídos com **Web Components (Lit)** que podem ser facilmente integrados em qualquer e-commerce. Os widgets são distribuídos via CDN como módulos ES e oferecem uma experiência completa de avaliações, ratings e perguntas e respostas.
## Widgets Disponíveis
Widget completo de avaliações com múltiplos layouts e funcionalidades
Widget simples de exibição de rating com estrelas e total de avaliações
Widget de perguntas e respostas sobre produtos
## Características Principais
* ✅ **Web Components padrão** - Funcionam em qualquer framework ou HTML puro
* ✅ **Distribuição via CDN** - Fácil integração sem build steps
* ✅ **Módulos ES** - Suporte moderno e tree-shaking
* ✅ **Customizável** - CSS variables para personalização completa
* ✅ **Responsivo** - Layouts adaptáveis a diferentes telas
* ✅ **Performance** - Cache inteligente e requisições otimizadas
# Questions Widget
Source: https://docs.martan.app/widgets/questions-widget
Widget de perguntas e respostas sobre produtos
O widget de perguntas e respostas permite que clientes façam perguntas sobre produtos e visualizem respostas de outros clientes e lojistas.
## Uso Básico
O widget de perguntas e respostas permite que clientes façam perguntas sobre produtos e visualizem respostas:
```html theme={null}
```
Ou usando `product-id`:
```html theme={null}
```
**Com configuração global:**
```html theme={null}
```
## Propriedades
### Atributos HTML
| Atributo | Tipo | Obrigatório | Descrição |
| --------------------------- | ------- | ----------- | ---------------------------------------------- |
| `data-store-id` | string | Sim\* | ID da loja na API Martan |
| `data-store-key` | string | Sim\* | Chave da API (web\_id) da loja |
| `data-product-id` | string | Sim\* | ID do produto na API Martan |
| `data-product-sku` | string | Sim\* | SKU do produto na API Martan |
| `data-enable-new-questions` | boolean | Não | Permite criar novas perguntas (padrão: `true`) |
\* `data-store-id` e `data-store-key` podem ser omitidos se configurados globalmente. É necessário fornecer `data-product-id` OU `data-product-sku` (não ambos).
### Propriedades JavaScript
| Propriedade | Tipo | Descrição |
| -------------------- | ------- | ----------------------------- |
| `storeId` | string | ID da loja |
| `storeKey` | string | Chave da API |
| `productId` | string | ID do produto |
| `productSku` | string | SKU do produto |
| `enableNewQuestions` | boolean | Permite criar novas perguntas |
## Exemplos
## Funcionalidades
* ✅ Integração com API Martan
* ✅ Listagem de perguntas e respostas
* ✅ Busca por palavras-chave
* ✅ Formulário para criar novas perguntas (via iframe)
* ✅ Carregamento incremental (mostrar mais perguntas)
* ✅ Suporte a respostas de lojistas
# Rating Widget
Source: https://docs.martan.app/widgets/rating-widget
Widget simples de exibição de rating com estrelas e total de avaliações
O widget de rating exibe a avaliação média de um produto com estrelas e o total de avaliações. Ele pode buscar dados automaticamente da API Martan ou receber valores diretos.
## Uso Direto
O widget de rating pode ser usado diretamente com props para buscar automaticamente da API:
```html theme={null}
```
Ou usando `product-id`:
```html theme={null}
```
## Auto-Discovery
O widget também suporta auto-discovery, procurando automaticamente elementos no DOM com classes específicas:
```html theme={null}
```
E então inicializar o auto-discovery:
```javascript theme={null}
window.MartanRating.init({
store_id: 'seu-store-id',
web_id: 'sua-store-key',
widget_rating: {
star_color: '#fbbf24',
theme: 'compact',
custom_class: '.minha-classe-custom',
},
})
```
O widget irá:
* Criar automaticamente componentes `` nos elementos encontrados
* Observar o DOM para novos elementos adicionados dinamicamente
## Propriedades
### Atributos HTML
| Atributo | Tipo | Obrigatório | Descrição |
| ------------------------- | ------- | ----------- | ---------------------------------------------------- |
| `data-store-id` | string | Sim\* | ID da loja na API Martan |
| `data-store-key` | string | Sim\* | Chave da API (web\_id) da loja |
| `data-product-id` | string | Sim\* | ID do produto na API Martan |
| `data-product-sku` | string | Sim\* | SKU do produto na API Martan |
| `data-star-color` | string | Não | Cor das estrelas (padrão: `#ffc107`) |
| `data-theme` | string | Não | Tema do widget (padrão: `null`) |
| `data-disable-auto-fetch` | boolean | Não | Desabilita busca automática da API (padrão: `false`) |
\* `data-store-id` e `data-store-key` podem ser omitidos se configurados globalmente. É necessário
fornecer `data-product-id` OU `data-product-sku` (não ambos).
**Valores possíveis para `data-theme`:**
* `compact` - Exibe apenas uma estrela com rating
* `null` (padrão) - Exibe 5 estrelas com rating e total
### Propriedades JavaScript
| Propriedade | Tipo | Descrição |
| ------------------ | ------- | ---------------------------------------------------- |
| `storeId` | string | ID da loja |
| `storeKey` | string | Chave da API |
| `productId` | string | ID do produto |
| `productSku` | string | SKU do produto |
| `starColor` | string | Cor das estrelas |
| `theme` | string | Tema do widget (`compact` ou `null`) |
| `rating` | number | Rating direto (0-5) - se fornecido, não busca da API |
| `totalReviews` | number | Total de avaliações - se fornecido, não busca da API |
| `disableAutoFetch` | boolean | Desabilita busca automática |
## Exemplos
### Tema Padrão (5 estrelas)
```html theme={null}
```
### Tema Compacto
```html theme={null}
```
### Com Cor Customizada
```html theme={null}
```
### Com Tamanho Customizado
```html theme={null}
```
### Com Dados Diretos (sem buscar da API)
```html theme={null}
```
### Customização Avançada
Para mais opções de estilização usando variáveis CSS, consulte a página de [Customização](/widgets/customization).
## Funcionalidades
* ✅ Integração com API Martan
* ✅ Auto-discovery de elementos no DOM
* ✅ Requisição única à API (compartilhada entre múltiplos componentes)
* ✅ Dois temas: padrão (5 estrelas) e compacto (1 estrela)
* ✅ Customização de cor das estrelas
* ✅ Suporte a dados diretos (sem buscar da API)
* ✅ Observação automática do DOM para novos elementos
* ✅ Customização via CSS variables
# Reviews Widget
Source: https://docs.martan.app/widgets/reviews-widget
Widget completo de avaliações com múltiplos layouts e funcionalidades
O widget de avaliações permite que clientes visualizem e interajam com avaliações de produtos. Ele oferece múltiplos layouts, filtros, busca e paginação.
## Uso Básico
O widget sempre busca as avaliações da API Martan. Configure as credenciais e o produto:
```html theme={null}
```
Ou usando SKU do produto com layout em lista:
```html theme={null}
```
## Propriedades
### Atributos HTML
| Atributo | Tipo | Obrigatório | Descrição |
| --------------------- | ------ | ----------- | ------------------------------------------------------ |
| `data-store-id` | string | Sim\* | ID da loja na API Martan |
| `data-store-key` | string | Sim\* | Chave da API (web\_id) da loja |
| `data-product-id` | string | Sim\* | ID do produto na API Martan |
| `data-product-sku` | string | Sim\* | SKU do produto na API Martan |
| `data-items-per-page` | number | Não | Número de itens por página (padrão: 10) |
| `data-header-type` | string | Não | Tipo de header a exibir (padrão: "default") |
| `data-list-type` | string | Não | Tipo de layout da lista de avaliações (padrão: "grid") |
\* `data-store-id` e `data-store-key` podem ser omitidos se configurados globalmente. É necessário
fornecer `data-product-id` OU `data-product-sku` (não ambos).
**Valores possíveis para `data-header-type`:**
* `default` - Header padrão com estatísticas
* `histogram` - Header com histograma de distribuição
* `compact` - Header compacto
* `minimal` - Header minimalista
* `centered` - Header centralizado
**Valores possíveis para `data-list-type`:**
* `grid` - 2 cards lado a lado (padrão)
* `list` - 1 card por linha, full width
### Propriedades JavaScript
| Propriedade | Tipo | Descrição |
| -------------- | ------ | -------------------------------------- |
| `storeId` | string | ID da loja |
| `storeKey` | string | Chave da API |
| `productId` | string | ID do produto |
| `productSku` | string | SKU do produto |
| `itemsPerPage` | number | Itens por página |
| `headerType` | string | Tipo de header |
| `listType` | string | Tipo de layout da lista (grid ou list) |
## Exemplos
### Padrão
### Customizando aparencia com CSS Variable
```html theme={null}
```
### Headers Disponíveis
## Funcionalidades
* ✅ Integração com API Martan
* ✅ Listagem de avaliações com layout responsivo
* ✅ Múltiplos tipos de header (default, histogram, compact, minimal, centered)
* ✅ Filtros por número de estrelas
* ✅ Busca por texto (via API)
* ✅ Ordenação (data, rating)
* ✅ Paginação e carregamento incremental
* ✅ Estatísticas (média, distribuição de estrelas)
* ✅ Customização via CSS variables
* ✅ Debounce na busca para melhor performance