API Publica v1

Integre seus dados de pesquisa com seu ERP ou BI

REST + JSON. Autenticação por X-API-Key. Cada chave enxerga apenas os dados do seu cliente. Rate limit de 1.000 requests/hora por chave.

1. Gere uma chave

No portal do cliente, abra "Chaves de API" e crie uma nova chave. Ela aparece apenas uma vez — guarde em local seguro.

2. Consulte seus dados

Liste pesquisas, coletas, produtos, locais e relatórios já consolidados. Tudo via GET com paginacao e filtros.

3. Envie seus preços

POST /prices em bulk (até 5k itens) para comparar seus preços com os dos concorrentes coletados em campo.

Base URL

https://api.workanflow.com.br/api/public/v1

Autenticação

Envie a chave no header X-API-Key em todas as requisicoes.

curl -H "X-API-Key: SUA_CHAVE_AQUI" \
  https://api.workanflow.com.br/api/public/v1/researches

Endpoints

GET/researchesLista suas pesquisas
GET/researches/:idDetalhe de uma pesquisa
GET/collectionsPreços coletados em campo
GET/collections/exportExport CSV das coletas
GET/productsProdutos usados nas suas pesquisas
GET/locationsLocais das suas pesquisas
GET/reports/price-comparisonComparativo entre locais
GET/reports/price-evolutionEvolução temporal de preços
GET/pricesLe seus preços (filtros + presets ERP)
POST/pricesEnvia os seus preços (até 5.000/req)

POSTEnviar seus preços

Envie os preços da sua empresa para habilitar insights de competitividade e relatórios comparativos. Produtos são identificados pelo EAN. Até 5.000 itens por requisicao.

Preço padrão vs preço por loja

Cada item aceita o campo opcional store_code:

  • Vazio / ausente → preco PADRAO do cliente, vale para todas as suas lojas.
  • Preenchido → preco ESPECIFICO daquela loja propria. Use o codigo que voce ja definiu na aba "Codigos" (em "Lojas e Concorrentes").
  • Upsert composto: chave de unicidade e (EAN, store_code). O mesmo produto pode ter preco diferente em cada loja sua.
  • Lookup priorizado: o sistema busca primeiro o preco da loja-foco; se nao houver, usa o padrao.
  • Restrição: a loja precisa ser PROPRIA do cliente. Tentar setar preco em loja concorrente ou de outro cliente retorna 403;store_code inexistente retorna 404(na linha — outras linhas seguem normal).

Preço de custo (fornecedor) — opcional

O campo opcional cost_price aceita o custo de aquisicao do produto. Quando informado, habilita:

  • Calculo de margem em /portal/cenarios em tempo real conforme você move o slider de preço.
  • Alerta no Comparativo 1-vs-1 quando concorrente vende abaixo do seu custo (sinal de guerra de preços).
  • Aviso vermelho no simulador quando você arrasta o preço para baixo do custo (margem negativa).

Comportamento: ausente / null / "" preserva o valor anterior (nao zera). Negativos sao rejeitados. Aliases ERP comuns: custo, precoCusto, custo_unitario. Nunca obrigatorio — voce decide se vai compartilhar.

cURL

curl -X POST \
  -H "X-API-Key: SUA_CHAVE" \
  -H "Content-Type: application/json" \
  https://api.workanflow.com.br/api/public/v1/prices \
  -d '{"items": [
    {"ean": "7891234567890", "price": "5.49"},                                       // padrão
    {"ean": "7891234567890", "price": "5.20", "store_code": "LP-001"},               // loja LP-001
    {"ean": "7891234567890", "price": "5.79", "store_code": "LP-002"},               // loja LP-002
    {"ean": "7891234567891", "price": "12.99", "is_promotional": true,
     "store_code": "LP-001"},
    {"ean": "7891234567892", "price": "8.99", "cost_price": "6.20"}                  // com custo (opcional)
  ]}'

Python

import requests

API_KEY = "SUA_CHAVE_AQUI"
BASE = "https://api.workanflow.com.br/api/public/v1"

payload = {
    "items": [
        # Preço padrão (vale para todas as lojas)
        {"ean": "7891234567890", "price": "5.49"},
        # Preço específico por loja (codigo gerenciado em "Codigos")
        {"ean": "7891234567890", "price": "5.20", "store_code": "LP-001"},
        {"ean": "7891234567891", "price": "12.99",
         "is_promotional": True, "store_code": "LP-001"},
        # Preço + custo (cost_price opcional — habilita margem em Cenarios)
        {"ean": "7891234567892", "price": "8.99", "cost_price": "6.20"},
    ]
}

res = requests.post(
    f"{BASE}/prices",
    headers={"X-API-Key": API_KEY, "Content-Type": "application/json"},
    json=payload,
    timeout=30,
)
data = res.json()["data"]
print(f"Importados: {data['imported']}, não encontrados: {data['not_found']}")
for err in data.get("errors", []):
    print(f"  ! {err['ean']} (loja={err.get('store_code')}): {err['error']}")

Resposta

{
  "data": {
    "imported": 3,
    "not_found": 0,
    "errors": [
      {
        "ean": "7891234567892",
        "error": "Codigo de loja não encontrado",
        "store_code": "LP-XYZ"
      }
    ]
  },
  "meta": null
}

Erros por linha (EAN ausente, store_code invalido, preco invalido) não impedem as outras linhas — vem em errorscom o store_code preservado para depuracao.

POST /prices com vigencia

Cada item aceita valid_from e valid_until (ISO date). Pre-cadastre promocoes (ex: dia das maes) com antecedencia. Sem valid_from assume hoje; sem valid_until vale indefinidamente até próximo upsert em (EAN, store_code).

{
  "items": [
    {"ean": "7891234567890", "price": "9.90"},
    {"ean": "7891234567891", "price": "7.90",
     "is_promotional": true,
     "valid_from": "2026-05-01",
     "valid_until": "2026-05-15"}
  ]
}

GETBuscar seus preços

Le os precos que voce ja enviou. Suporta filtros, paginacao, sync incremental (updated_after) e presets de formato pra integracao direta com ERPs.

Filtros (query params)

ParâmetroTipoDefaultO que faz
eanstring ou lista-Filtra por EAN; aceita repeticao (ean=A&ean=B).
store_codestring-Codigo de loja própria. Vazio = padrão.
valid_atdate-Preços vigentes na data (valid_from ≤ X ≤ valid_until).
valid_from_min/maxdate range-Janela de criação da vigencia.
is_promotionalbool-Filtrar so promocoes.
sourceenum-csv_upload, manual, api.
updated_afterdatetime ISO-Sync incremental: so registros > este timestamp.
page, per_pageint1, 50Paginacao. per_page max=500.
formatenumcanonicalcanonical, consinco, bluesoft, linx, sap, csv, csv_simple.
fieldscsv string-Field selection: ean,price,valid_from,...

cURL canonical

curl -X GET -H "X-API-Key: SUA_CHAVE" \
  "https://api.workanflow.com.br/api/public/v1/prices?ean=7891234567890"

Sync incremental do ERP

# Roda toda madrugada via cron, traz so o que mudou desde ontem,
# ja com nomes de campo no padrao Consinco:
curl -X GET -H "X-API-Key: SUA_CHAVE" \
  "https://api.workanflow.com.br/api/public/v1/prices?updated_after=2026-04-27T00:00:00Z&format=consinco"

Presets de formato (Consinco / Bluesoft / Linx / SAP)

Mesmo dado, nomes de campo diferentes. Use ?format=... e receba a resposta no padrão do seu ERP — sem ETL no meio.

CanonicoConsincoBluesoftLinxSAP
eanCodigoproductCodecodigo_produtoMATERIAL
pricePreçopriceValuepreco_vendaPRICE
valid_fromDataInicioVigenciavalidFromdata_inicioVALID_FROM
valid_untilDataFimVigenciavalidTodata_fimVALID_TO
store_codeCodigoFilialstoreCodefilialPLANT
is_promotionalEmPromocaoisPromopromocionalIS_PROMO

Consinco

curl -X GET -H "X-API-Key: SUA_CHAVE" \
  "https://api.workanflow.com.br/api/public/v1/prices?format=consinco"

# Resposta
[
  {
    "Codigo": "7891234567890",
    "Preço": "5.49",
    "DataInicioVigencia": "2026-04-27",
    "DataFimVigencia": null,
    "CodigoFilial": "LP-001",
    "EmPromocao": false
  }
]

Bluesoft

curl -X GET -H "X-API-Key: SUA_CHAVE" \
  "https://api.workanflow.com.br/api/public/v1/prices?format=bluesoft"

# Resposta
[
  {
    "productCode": "7891234567890",
    "priceValue": "5.49",
    "validFrom": "2026-04-27",
    "validTo": null,
    "storeCode": "LP-001",
    "isPromo": false
  }
]

CSV (download direto)

curl -X GET -H "X-API-Key: SUA_CHAVE" \
  "https://api.workanflow.com.br/api/public/v1/prices?format=csv" \
  -o preços.csv

# preços.csv (UTF-8 com BOM, separador ;)
ean;price;valid_from;valid_until;store_code;is_promotional
7891234567890;5.49;2026-04-27;;LP-001;false

💡 Pra integrar com seu ERP: GET /prices?updated_after=ontem&format=SEU_ERP roda toda noite via cron, traz so precos updated_after=ontem, ja com nomes de campo certos. Zero ETL. Combine com fields= pra reduzir payload.

Seguranca e limites

  • Toda chave enxerga apenas os dados do cliente dono da chave.
  • Rate limit: 1.000 requests/hora por chave. Acima disso: HTTP 429.
  • Cada request e logado (endpoint, método, status, IP, user agent) e visível no portal.
  • Desative ou exclua uma chave a qualquer momento em /portal/api-keys.
  • Chaves são exibidas apenas uma vez no momento da criação. Guarde em local seguro.

Pronto para integrar?

Entre no portal e gere sua primeira chave.

Acessar portal