Sobre a Adm360
O Adm360 é uma API (Application Programming Interface) do Fastcommerce permite a sistematização remota de diversas tarefas realizadas regularmente pelos usuários através do site administrativo da loja virtual. Com esta API é possível integrar aplicativos externos tais como ERPs, CRMs, sistemas de BI, gateways de pagamento etc, e através destes aplicativos executar métodos da API para gerenciamento de produtos e pedidos, obter dados de relatórios e executar utilitários do Fastcommerce.
1 - Acessando a API
O acesso à API ocorre sempre através do protocolo HTTPS (porta 443), com certificação EV SSL. A execução de cada método inicia-se através de uma solicitação enviada via FORM POST e termina em seguida com uma única resposta em XML.
A resposta à execução de cada método é síncrona e pode ocorrer de forma quase imediata ou pode demorar até alguns minutos, dependendo do método e da quantidade de registros lidos ou alterados.
ATENÇÃO:
Existe um limite no volume de acessos por hora aos métodos da API. Veja os detalhes no parágrafo 2 do item Melhores Práticas).
2 - Histórico de Versões
A versão atual da API é 1.0.
| Versão | Data | Detalhes |
|---|---|---|
| 1.0 | 06/01/2025 | Criação do documento |
3 - Loja para testes
O Fastcommerce não tem um ambiente de sandbox para realizar testes. Sugerimos portanto que crie uma loja para testes para desenvolver com a API.
Acesse o endereço http://novaloja.fastcommerce.com.br para criar sua loja de testes. Após cadastrá-la, avise-nos qual é o nome e o ID desta nova loja através do e-mail comercial@fastcommerce.com.br para que possamos deixar a loja em implantação e a mesma não seja cancelada após o prazo de avaliação.
4 - Usuário para testes
O usuário que vai consumir a API precisa basicamente de acesso aos relatórios e utilitários da loja, pois é através dele que as consultas e alterações são feitas.
Essa etapa deve ser realizada por um usuário da loja com permissão para criar novos usuários.
Acesse a administração da loja e no menu "Usuários" clique na opção "Incluir usuário".
O cadastro pode ser preenchido como no exemplo abaixo.
5 - Melhores Práticas
Seguem algumas dicas para melhor utilização da API:
5.1) Para maximizar a performance na alteração de pedidos, inclua no JSON somente os campos obrigatórios e os campos que serão alterados. Não inclua no JSON campos que não serão alterados.
5.2) Existe um limite de até 100 chamadas à API de pedidos por hora. Para maximizar o uso de cada chamada ao comando OrderManagement (OMN), é possível incluir mais de um registro que será afetado em cada chamada. Por exemplo, é possível incluir e alterar vários pedidos em uma mesma chamada. Se este limite for excedido, novas requisições serão bloqueadas até a próxima virada da hora. Por exemplo, se forem feitas mais de 100 requisições entre 13h e 14h, somente após as 14h será possível fazer novos acessos à API, e assim por diante. Quando o limite for excedido, o erro "ErrOrdersAccessLimit" será retornado pela API, com a seguinte mensagem: Reached limit of access per hour.
6 - Comandos da API
O comando informa qual a ação desejada na chamada à API. Cada chamada deve obrigatoriamente conter um dos comandos abaixo:
- LIN (Login) - Login para obtenção do token
- OMN (Order Management) - Inclusão e alteração de pedidos
A comunicação se inicia através de um FORM POST para o seguinte endereço:
https://www.rumo.com.br/adm/Adm360.asp
Seguem abaixo os campos obrigatórios deste POST:
| Nome Campo | Descrição |
|---|---|
| StoreName | Nome da loja |
| StoreID | ID da Loja |
| Username | Nome do usuário |
| Password | Senha do usuário |
| cmd | Comando que será utilizado |
| token | Token gerado pelo comando LIN (usado nos demais comandos) |
Caso o comando seja OMN (Order Management) os campos são:
| Nome do Campo | Descrição |
|---|---|
| token | Token de segurança para autenticar |
| OrdersData | JSON com os dados dos pedidos |
Exemplo de FORM para Login (LIN):
<form name="Logon" action="https://www.rumo.com.br/adm/Adm360.asp" method="POST">
<input type="text" name="StoreName" value="Nome da loja">
<input type="text" name="StoreID" value="99999">
<input type="text" name="Username" value="Admin">
<input type="password" name="Password" value="******">
<input type="text" name="cmd" value="LIN">
</form>
Exemplo de FORM para Order Management (OMN):
<form name="Logon" action="https://www.rumo.com.br/adm/Adm360.asp" method="POST">
<input type="text" name="StoreID" value="99999">
<input type="text" name="token" value="9999999999999">
<input type="text" name="cmd" value="LIN">
<input type="text" name="OrdersData" value="{...JSON...}"> <!-- *** -->
</form>
7 - Permissões de acesso
Para o acesso a API, é necessário que o usuário tenha permissões de acordo com cada método:
| Comando | Permissão de usuário |
|---|---|
| OMN | Acesso aos utilitários de pedidos |
Atenção:
Acessos à API não devem estar diretamente relacionados aos acessos a qualquer página da loja virtual, ou seja, cada acesso de cliente da loja não deve corresponder a um acesso à API. Para evitar que isto ocorra, existe uma limitação no volume de acessos por hora aos métodos da API.
Obs: É extramente recomendado criar um usuário específico para cada aplicação que for utilizar a API. Este usuário deve ter nome de usuário e senha fortes e únicas. Insira as permissões de acordo com que a aplicação irá utilizar. Por exemplo, se a aplicação irá apenas acessar os dados de pedidos, basta inserir acesso a relatórios de pedidos e em todos os demais campos deixar sem acesso.
8 - Exemplos de requisições
8.1 - API de pedidos
Estrutura do JSON:
Para inclusão o comando (cmd) dentro de cada registro do array "orders" deve ser insert e para atualização update. Para alteração devem ser enviados somente os campos que tiverem alterações, não é necessário enviar todos os campos.
{
"send-webhook-notifications": true,
"sync-marketplaces": true,
"sync-stores": true,
"manage-stock": true,
"accept-only-store-products": true,
"orders": [
{
"cmd": "insert/update",
"order": {
"number": "165240550",
"ref_number": "MYNUMBER00001",
"transaction_status": "WAITING PAYMENT",
"payment_status": "PENDING",
"custom_data": "Informações personalizadas",
"invoice": "111111111111111111111",
"amount_without_shipping": 31.5,
"coupon_discount": 0,
"discount_without_shipping": 10,
"short_obs": "OBS CURTA",
"status": "New"
},
"customer": {
"name": "Nome da pessoa",
"gender": "male",
"birth_date": "1978-01-01T03:00:00Z",
"email": "email@cliente.com.br",
"phone": "(21) 5555-1234",
"cellphone": "11988886666",
"custom_1": "info 1",
"custom_2": "info 2",
"custom_3": "info 3",
"document": {
"type": "CPF",
"number": "01234567890"
},
"additional_document": {
"type": "RG",
"number": "1111111111"
},
"address": {
"country": "Brasil",
"street": "Rua Sete de Setembro",
"street_number": "123",
"complement": "Comp1",
"neighborhood": "Centro Casa",
"city": "Rio de Janeiro",
"state": "RJ",
"zipcode": "20050-001"
}
},
"payment": {
"method": "Cartão de Crédito",
"processed_by": "Pagar.me",
"brand": "VISA",
"installments": 3,
"interest": 0
},
"shipping": {
"name": "Nome destinatário",
"email": "email@destino.com.br",
"amount": 10.5,
"amount_packaging": 0,
"custom_1": "info 1",
"custom_2": "info 2",
"custom_3": "info 3",
"discount": 0,
"message": "Mensagem do cliente",
"gift": false,
"phone": "(21) 2222-2222",
"info": "CEP 04516-001 (SEDEX 10)",
"obs": "3 dias",
"tracking_code": "SDX00011",
"delivery_date": "",
"address": {
"country": "Brasil",
"street": "Rua Sete de Setembro",
"street_number": "123",
"complement": "comple",
"neighborhood": "Centro Casa",
"city": "Rio de Janeiro",
"state": "RJ",
"zipcode": "20050-001"
}
},
"items": [
{
"id": 170070,
"sku_code": "111",
"name": "Camiseta",
"category_name": "Moda",
"bar_code": null,
"descriptor_1": null,
"descriptor_2": "P",
"descriptor_3": null,
"simple_descriptor_1": null,
"simple_descriptor_2": null,
"simple_descriptor_3": null,
"color": "Branco",
"filters": null,
"unit_price": 11,
"quantity": 1,
"weight": 12000
},
{
"id": 170071,
"sku_code": "222",
"name": "Camiseta",
"category_name": "Moda",
"bar_code": null,
"descriptor_1": null,
"descriptor_2": "M",
"descriptor_3": null,
"simple_descriptor_1": null,
"simple_descriptor_2": null,
"simple_descriptor_3": null,
"color": "Branco",
"filters": null,
"unit_price": 12,
"quantity": 2,
"weight": 0
}
]
}
]
}
É possível incluir/alterar múltiplos pedidos por vez.
O resultado desta operação será retornado em JSON. Segue o modelo:
{
"begin": "2025-01-16T20:08:02-03:00",
"srv": "serverName",
"cmd": "OMN",
"send-webhook-notifications": true,
"sync-marketplaces": true,
"sync-stores": true,
"manage-stock": true,
"accept-only-store-products": true,
"order_1": {
"cmd": "insert",
"ref_number": "MYNUMBER00001",
"shipping_amount": 10.5,
"order_totalItems": 35,
"order_amount_without_shipping": 31.5,
"order_totalAmount": 42,
"customer_id": 2449,
"customer_updated": true,
"customer_inserted": false,
"order_updated": false,
"order_inserted": true,
"order_id": 6240,
"order_number": 165240724,
"items_1": "OK: inserted [170070]",
"items_2": "OK: inserted [170071]",
"err": "OK"
},
"received": 1,
"valid": 1,
"invalid": 0,
"inserted": 1,
"updated": 0,
"sess": "173403027",
"end": "2025-01-16T20:08:02-03:00",
"et": 200
}
Obs: Note que o order_number gerado automaticamente pelo sistema é retornado neste JSON.
Veja a lista com os possíveis códigos de erros (<err>) e suas descrições (<errDescr>):
| err | errDescr |
|---|---|
| ErrOK | OK |
| ErrOrderManagementNoAccess | Access denied to handle orders |
| ErrOrderManagementNoData | OrderData not sent |
| ErrOrderManagementInvData | Invalid OrderData |
| ErrOrdersInvalid | Invalid Orders |
| ErrOrdersRecordsLimit | Records limit exceeded |
| ErrOrdersAccessLimit | Reached limit of access per hour |
| ErrOrderInvCmd | Invalid command |
| ErrProcessingOrders | An error occurred in one or more records |
Se houver erros, o resultado desta operação será retornado em JSON da seguinte forma:
{
"begin": "2025-01-16T20:10:45-03:00",
"srv": "dom0web7",
"cmd": "OMN",
"err": "ErrOrderManagementInvData",
"errDescr": "Invalid OrderData",
"sess": "173403027",
"end": "2025-01-16T20:10:45-03:00",
"et": 32
}
{
"begin": "2025-01-16T20:12:36-03:00",
"srv": "dom0web7",
"cmd": "OMN",
"send-webhook-notifications": true,
"sync-marketplaces": true,
"sync-stores": true,
"manage-stock": true,
"accept-only-store-products": true,
"order_1": {
"cmd": "update",
"order_number": 1652405501,
"ref_number": "MYNUMBER00001",
"shipping_amount": 10.5,
"order_amount_without_shipping": 31.5,
"order_totalAmount": 42,
"err": "order.number not found"
},
"order_2": {
"cmd": "update",
"order_number": 165240551,
"ref_number": "MYNUMBER00001",
"shipping_amount": 10.5,
"order_amount_without_shipping": 31.5,
"order_totalAmount": 42,
"customer_id": 2433,
"customer_updated": true,
"customer_inserted": false,
"order_updated": true,
"order_inserted": false,
"order_id": 6060,
"err": "OK"
},
"received": 2,
"valid": 1,
"invalid": 1,
"inserted": 0,
"updated": 1,
"err": "ErrProcessingOrders",
"errDescr": "An error occurred in one or more records",
"sess": "173403027",
"end": "2025-01-16T20:12:36-03:00",
"et": 104
}
Sempre serão retornados os registros e indicado em cada registro se ocorreu ou não erro ao processar aquele registro.
Outras informações do retorno:
| Atributo | Descrição |
|---|---|
| received | Número de registros recebidos |
| valid | Número de registros válidos |
| invalid | Número de registros inválidos |
| inserted | Número de registros inseridos |
| updated | Número de registros atualizados |
| err | Erro |
| errDescr | Descrição do erro |
9 - Realizando Testes
Disponibilizamos uma página para facilitar a realização de testes de integração via navegador e assim conhecer melhor o funcionamento da API. Segue o endereço:
9.1 Comando LIN
Neste teste, será possível ver o processo para fazer login e obter token para as requisições da API.
No campo Cmd selecione a opção Login (LIN). Preencha os campos e clique em Entrar.
Campos retornados pela API:
| Campo | Descrição |
|---|---|
| cmd | Comando utilizado |
| id | ID da loja |
| st | Nome da loja |
| usr | Usuário |
| err | Erro |
| errDescr | Descrição do erro |
| tk | Token para chamadas à API dos demais comandos |
Como resultado, teremos a seguinte estrutura:
{
"begin": "2025-01-17T18:09:43-03:00",
"srv": "dom0web7",
"cmd": "LIN",
"id": 184,
"st": "SP Departamentos",
"usr": "Alexandre",
"err": "ErrOK",
"errDescr": "OK",
"sess": "179662158",
"tk": "2032158669138",
"end": "2025-01-17T18:09:43-03:00",
"et": 16
}
9.2 Comando OMN
Neste teste, serão alterados dois pedidos
No campo Cmd selecione a opção OMN. Preencha os campos IDLoja, Token e no campo OrdersData informe o JSON com os registros que deseja alterar e clique em Entrar.
Exemplo
{
"send-webhook-notifications": true,
"sync-marketplaces": true,
"sync-stores": true,
"manage-stock": true,
"accept-only-store-products": true,
"orders": [
{
"cmd": "update",
"order": {
"number": "165240550",
"status": "New"
}
},
{
"cmd": "update",
"order": {
"number": "165240551",
"status": "Approved"
}
}
]
}
Como resultado, teremos a seguinte estrutura:
{
"begin": "2025-01-17T18:25:22-03:00",
"srv": "dom0web7",
"cmd": "OMN",
"send-webhook-notifications": true,
"sync-marketplaces": true,
"sync-stores": true,
"manage-stock": true,
"accept-only-store-products": true,
"order_1": {
"cmd": "update",
"order_number": 165240550,
"customer_inserted": false,
"customer_updated": false,
"customer_id": 2433,
"order_updated": true,
"order_inserted": false,
"order_id": 6059,
"err": "OK"
},
"order_2": {
"cmd": "update",
"order_number": 165240551,
"customer_inserted": false,
"customer_updated": false,
"customer_id": 2433,
"order_updated": true,
"order_inserted": false,
"order_id": 6060,
"err": "OK"
},
"received": 2,
"valid": 2,
"invalid": 0,
"inserted": 0,
"updated": 2,
"err": "ErrOK",
"errDescr": "OK",
"sess": "179662158",
"end": "2025-01-17T18:25:22-03:00",
"et": 124
}
10 - Dicionário de Dados
Order Management [Comando OMN]
JSON de API de pedidos [Inclusão/Alteração]
| Campo | Tipo/Opções | Descrição |
|---|---|---|
| send-webhook-notifications | Boolean (true/false) | Indica se notificações via webhook devem ser enviadas. |
| sync-marketplaces | Boolean (true/false) | Indica se os marketplaces devem ser sincronizados. |
| sync-stores | Boolean (true/false) | Indica se as lojas devem ser sincronizadas. |
| manage-stock | Boolean (true/false) | Indica se o gerenciamento de estoque está ativo. |
| accept-only-store-products | Boolean (true/false) | Indica se apenas produtos da loja são aceitos. |
| orders[].cmd | String ("insert/update") | Indica o comando a ser executado para o pedido. |
| orders[].order.number | String | Número do pedido. (OBRIGATÓRIO quando for alteração) |
| orders[].order.ref_number | String | Número de referência personalizado do pedido. |
| orders[].order.transaction_status | String ("WAITING PAYMENT", "PAID", etc.) | Status da transação do pedido. |
| orders[].order.payment_status | String ("PENDING", "PAID", etc.) | Status do pagamento do pedido. |
| orders[].order.custom_data | String | Dados personalizados do pedido. |
| orders[].order.invoice | String | Número da nota fiscal do pedido. |
| orders[].order.amount_without_shipping | Float | Valor total do pedido, sem incluir o frete. |
| orders[].order.coupon_discount | Float | Desconto aplicado via cupom. |
| orders[].order.discount_without_shipping | Float | Desconto aplicado, excluindo o valor do frete. |
| orders[].order.short_obs | String | Observação curta sobre o pedido. |
| orders[].order.status | String ("New", "Processed", etc.) | Status geral do pedido. |
| orders[].customer.name | String | Nome completo do cliente. |
| orders[].customer.gender | String ("male", "female") | Gênero do cliente. |
| orders[].customer.birth_date | String (ISO 8601) | Data de nascimento do cliente no formato ISO 8601 (ex.: 1978-01-01T03:00:00Z). |
| orders[].customer.email | String | Email do cliente. (OBRIGATÓRIO) |
| orders[].customer.phone | String | Telefone fixo do cliente. |
| orders[].customer.cellphone | String | Celular do cliente. |
| orders[].customer.custom_1 | String | Informação personalizada 1 do cliente. |
| orders[].customer.custom_2 | String | Informação personalizada 2 do cliente. |
| orders[].customer.custom_3 | String | Informação personalizada 3 do cliente. |
| orders[].customer.document.type | String ("CPF", "CNPJ") | Tipo do documento principal do cliente. |
| orders[].customer.document.number | String | Número do documento principal do cliente. |
| orders[].customer.additional_document.type | String ("RG", etc.) | Tipo de documento adicional do cliente. |
| orders[].customer.additional_document.number | String | Número do documento adicional do cliente. |
| orders[].customer.address.country | String | País do endereço do cliente. |
| orders[].customer.address.street | String | Logradouro do endereço do cliente. |
| orders[].customer.address.street_number | String | Número do endereço do cliente. |
| orders[].customer.address.complement | String | Complemento do endereço do cliente. |
| orders[].customer.address.neighborhood | String | Bairro do endereço do cliente. |
| orders[].customer.address.city | String | Cidade do endereço do cliente. |
| orders[].customer.address.state | String | Estado do endereço do cliente. |
| orders[].customer.address.zipcode | String | CEP do endereço do cliente. |
| orders[].payment.method | String | Método de pagamento utilizado no pedido (ex.: "Cartão de Crédito", "Boleto", etc.). |
| orders[].payment.processed_by | String | Nome do processador de pagamento (ex.: "Pagar.me", "PayPal", etc.). |
| orders[].payment.brand | String | Bandeira do cartão de crédito (ex.: "VISA", "MasterCard", etc.). |
| orders[].payment.installments | Integer | Número de parcelas escolhidas pelo cliente. |
| orders[].payment.interest | Decimal | Valor dos juros aplicados ao pagamento parcelado. |
| orders[].shipping.name | String | Nome do destinatário do pedido. |
| orders[].shipping.email | String | Email do destinatário. |
| orders[].shipping.amount | Decimal | Valor do frete do pedido. |
| orders[].shipping.amount_packaging | Decimal | Valor adicional para embalagem no pedido. |
| orders[].shipping.custom_1 | String | Campo customizável 1 relacionado ao frete. |
| orders[].shipping.custom_2 | String | Campo customizável 2 relacionado ao frete. |
| orders[].shipping.custom_3 | String | Campo customizável 3 relacionado ao frete. |
| orders[].shipping.discount | Decimal | Valor de desconto aplicado no frete. |
| orders[].shipping.message | String | Mensagem personalizada do cliente sobre o frete. |
| orders[].shipping.gift | Boolean | Indica se o pedido é um presente (true ou false). |
| orders[].shipping.phone | String | Telefone do destinatário do pedido. |
| orders[].shipping.info | String | Informações detalhadas sobre o envio (ex.: tipo de entrega, CEP). |
| orders[].shipping.obs | String | Observações adicionais sobre o frete. |
| orders[].shipping.tracking_code | String | Código de rastreamento do pedido. |
| orders[].shipping.delivery_date | String (ISO 8601) | Data prevista para entrega do pedido (formato ISO 8601). |
| orders[].shipping.address.country | String | País do destinatário. |
| orders[].shipping.address.street | String | Rua do endereço de entrega. |
| orders[].shipping.address.street_number | String | Número do endereço de entrega. |
| orders[].shipping.address.complement | String | Complemento do endereço. |
| orders[].shipping.address.neighborhood | String | Bairro do endereço de entrega. |
| orders[].shipping.address.city | String | Cidade do endereço de entrega. |
| orders[].shipping.address.state | String | Estado do endereço de entrega (ex.: "RJ", "SP"). |
| orders[].shipping.address.zipcode | String | CEP do endereço de entrega. |
| orders[].items[].id | Integer | ID único do item no pedido. |
| orders[].items[].sku_code | String | Código SKU (Stock Keeping Unit) do produto. |
| orders[].items[].name | String | Nome do item no pedido. |
| orders[].items[].category_name | String | Nome da categoria à qual o item pertence. |
| orders[].items[].bar_code | String | Código de barras do item (pode ser null). |
| orders[].items[].descriptor_1 | String | Descritor adicional 1 do item (pode ser null). |
| orders[].items[].descriptor_2 | String | Descritor adicional 2 do item (pode ser null). |
| orders[].items[].descriptor_3 | String | Descritor adicional 3 do item (pode ser null). |
| orders[].items[].simple_descriptor_1 | String | Descritor simplificado 1 do item (pode ser null). |
| orders[].items[].simple_descriptor_2 | String | Descritor simplificado 2 do item (pode ser null). |
| orders[].items[].simple_descriptor_3 | String | Descritor simplificado 3 do item (pode ser null). |
| orders[].items[].color | String | Cor do item no pedido. |
| orders[].items[].filters | String | Filtros aplicáveis ao item (pode ser null). |
| orders[].items[].unit_price | Decimal | Preço unitário do item. |
| orders[].items[].quantity | Integer | Quantidade do item no pedido. |
| orders[].items[].weight | Decimal | Peso do item em gramas. |
11 - Tratamento de Erros
Os erros são retornados em "err" e "errDescr" respectivamente.
No exemplo o retorno aponta que não tiverem erros:
"err": "ErrOK",
"errDescr": "OK",
Exemplo de retorno da API quando ocorre erro:
"err": "ErrOrderManagementInvData",
"errDescr": "Invalid OrderData",