API Drdim Tech

Integre seu sistema com a mais completa plataforma fiscal do Brasil.
Emita NFe, gerencie produtos e automatize processos fiscais via API REST.

Emissão de NFe

Emita notas fiscais eletrônicas diretamente do seu sistema com validação automática e envio para SEFAZ.

Gestão de Produtos

Sincronize produtos, controle estoque e gerencie variações com total integração fiscal.

CRM Integrado

Gerencie clientes, fornecedores e vendedores com dados fiscais completos e atualizados.

Introdução

A API Dr. DIM Sistema permite que você integre funcionalidades fiscais e de gestão diretamente ao seu sistema, automatizando processos e garantindo conformidade fiscal.

🚀 Recursos Principais

  • Emissão de NFe, NFCe e outros documentos fiscais
  • Gestão completa de produtos e estoque
  • CRM com dados fiscais integrados
  • Relatórios e dashboards em tempo real
  • Automação de processos fiscais

📋 Especificações Técnicas

  • REST API com JSON
  • Autenticação via chaves duplas (Public + Secret)
  • Rate limiting: 1000 req/hora
  • Disponibilidade: 99.9% uptime
  • Ambiente de produção e sandbox

Autenticação

A API Dr. DIM usa um sistema de autenticação baseado em duas chaves para máxima segurança:

Public Key

Identificador público da sua aplicação. Pode ser exposta no frontend.

Header: X-Public-Key
Secret Key

Chave secreta que autentica suas requisições. Nunca exponha no frontend!

Header: X-Secret-Key
Importante: Mantenha suas chaves seguras! A Secret Key nunca deve ser exposta no código frontend ou repositórios públicos.

Exemplo de Autenticação

curl -X GET "https://saas.drdim.com.br/api/v1/produtos" \
  -H "X-Public-Key: pk_sua_chave_publica_aqui" \
  -H "X-Secret-Key: sk_sua_chave_secreta_aqui" \
  -H "Content-Type: application/json"

Principais Endpoints

GET /api/v1/produtos Listar Produtos

Lista todos os produtos cadastrados com suporte a filtros e paginação.

Parâmetros: page, per_page, search, categoria_id
POST /api/v1/produtos Criar Produto

Cria um novo produto com informações fiscais completas.

Requer: nome, preco, categoria_id, ncm, origem
POST /api/v1/nfe Emitir NFe

Emite uma Nota Fiscal Eletrônica com validação automática e envio para SEFAZ.

Requer: destinatario, itens, natureza_operacao
GET /api/v1/clientes Listar Clientes

Lista clientes cadastrados com dados fiscais e comerciais.

Parâmetros: page, search, tipo_pessoa, ativo

Exemplos de Código

Exemplo em PHP

<?php
// Configuração das chaves
$publicKey = 'pk_sua_chave_publica_aqui';
$secretKey = 'sk_sua_chave_secreta_aqui';
$baseUrl = 'https://saas.drdim.com.br/api/v1';

// Função para fazer requisições
function apiRequest($endpoint, $method = 'GET', $data = null) {
    global $publicKey, $secretKey, $baseUrl;
    
    $ch = curl_init();
    
    curl_setopt_array($ch, [
        CURLOPT_URL => $baseUrl . $endpoint,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_HTTPHEADER => [
            'X-Public-Key: ' . $publicKey,
            'X-Secret-Key: ' . $secretKey,
            'Content-Type: application/json',
            'Accept: application/json'
        ]
    ]);
    
    if ($data && in_array($method, ['POST', 'PUT', 'PATCH'])) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
    }
    
    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    
    return [
        'data' => json_decode($response, true),
        'status' => $httpCode
    ];
}

// Exemplo: Listar produtos
$produtos = apiRequest('/produtos');
echo "Status: " . $produtos['status'] . "\n";
print_r($produtos['data']);

// Exemplo: Criar produto
$novoProduto = [
    'nome' => 'Produto de Exemplo',
    'descricao' => 'Descrição do produto',
    'preco' => 29.99,
    'categoria_id' => 1,
    'ncm' => '12345678',
    'origem' => 0,
    'ativo' => true
];

$resultado = apiRequest('/produtos', 'POST', $novoProduto);
echo "Produto criado - Status: " . $resultado['status'] . "\n";
print_r($resultado['data']);
?>

Exemplo em Python

import requests
import json

class DrDimAPI:
    def __init__(self, public_key, secret_key):
        self.public_key = public_key
        self.secret_key = secret_key
        self.base_url = 'https://saas.drdim.com.br/api/v1'
        self.headers = {
            'X-Public-Key': self.public_key,
            'X-Secret-Key': self.secret_key,
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        }
    
    def request(self, endpoint, method='GET', data=None):
        url = f"{self.base_url}{endpoint}"
        
        try:
            if method.upper() == 'GET':
                response = requests.get(url, headers=self.headers)
            elif method.upper() == 'POST':
                response = requests.post(url, headers=self.headers, json=data)
            elif method.upper() == 'PUT':
                response = requests.put(url, headers=self.headers, json=data)
            elif method.upper() == 'DELETE':
                response = requests.delete(url, headers=self.headers)
            
            return {
                'status_code': response.status_code,
                'data': response.json() if response.content else None,
                'success': response.status_code < 400
            }
        except requests.RequestException as e:
            return {
                'status_code': 0,
                'data': {'error': str(e)},
                'success': False
            }

# Uso da classe
api = DrDimAPI(
    public_key='pk_sua_chave_publica_aqui',
    secret_key='sk_sua_chave_secreta_aqui'
)

# Listar produtos
produtos = api.request('/produtos')
print(f"Status: {produtos['status_code']}")
print(f"Produtos: {produtos['data']}")

# Criar produto
novo_produto = {
    'nome': 'Produto Python',
    'descricao': 'Criado via Python',
    'preco': 49.99,
    'categoria_id': 1,
    'ncm': '87654321',
    'origem': 0,
    'ativo': True
}

resultado = api.request('/produtos', 'POST', novo_produto)
print(f"Produto criado - Status: {resultado['status_code']}")
print(f"Resposta: {resultado['data']}")

# Emitir NFe
nfe_data = {
    'destinatario': {
        'nome': 'Cliente Exemplo',
        'documento': '12345678901',
        'email': 'cliente@exemplo.com'
    },
    'itens': [
        {
            'produto_id': 1,
            'quantidade': 2,
            'valor_unitario': 25.00
        }
    ],
    'natureza_operacao': 'Venda de mercadoria'
}

nfe = api.request('/nfe', 'POST', nfe_data)
print(f"NFe - Status: {nfe['status_code']}")
print(f"NFe: {nfe['data']}")

Exemplo em JavaScript

class DrDimAPI {
    constructor(publicKey, secretKey) {
        this.publicKey = publicKey;
        this.secretKey = secretKey;
        this.baseUrl = 'https://saas.drdim.com.br/api/v1';
        this.headers = {
            'X-Public-Key': this.publicKey,
            'X-Secret-Key': this.secretKey,
            'Content-Type': 'application/json',
            'Accept': 'application/json'
        };
    }
    
    async request(endpoint, method = 'GET', data = null) {
        const url = `${this.baseUrl}${endpoint}`;
        
        const config = {
            method: method.toUpperCase(),
            headers: this.headers
        };
        
        if (data && ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())) {
            config.body = JSON.stringify(data);
        }
        
        try {
            const response = await fetch(url, config);
            const responseData = await response.json();
            
            return {
                statusCode: response.status,
                data: responseData,
                success: response.ok
            };
        } catch (error) {
            return {
                statusCode: 0,
                data: { error: error.message },
                success: false
            };
        }
    }
}

// Uso da classe
const api = new DrDimAPI(
    'pk_sua_chave_publica_aqui',
    'sk_sua_chave_secreta_aqui'
);

// Exemplo assíncrono
async function exemploUso() {
    try {
        // Listar produtos
        const produtos = await api.request('/produtos');
        console.log('Produtos:', produtos);
        
        // Criar produto
        const novoProduto = {
            nome: 'Produto JavaScript',
            descricao: 'Criado via JavaScript',
            preco: 39.99,
            categoria_id: 1,
            ncm: '11223344',
            origem: 0,
            ativo: true
        };
        
        const resultado = await api.request('/produtos', 'POST', novoProduto);
        console.log('Produto criado:', resultado);
        
        // Buscar produto específico
        if (resultado.success && resultado.data.id) {
            const produto = await api.request(`/produtos/${resultado.data.id}`);
            console.log('Produto encontrado:', produto);
        }
        
    } catch (error) {
        console.error('Erro:', error);
    }
}

// Executar exemplo
exemploUso();

// Exemplo usando Promises
api.request('/clientes')
    .then(response => {
        console.log('Status:', response.statusCode);
        console.log('Clientes:', response.data);
    })
    .catch(error => {
        console.error('Erro ao buscar clientes:', error);
    });

Exemplos com cURL

# Definir variáveis
PUBLIC_KEY="pk_sua_chave_publica_aqui"
SECRET_KEY="sk_sua_chave_secreta_aqui"
BASE_URL="https://saas.drdim.com.br/api/v1"

# Headers comuns
HEADERS=(
    -H "X-Public-Key: $PUBLIC_KEY"
    -H "X-Secret-Key: $SECRET_KEY"
    -H "Content-Type: application/json"
    -H "Accept: application/json"
)

# 1. Listar produtos
echo "=== Listando produtos ==="
curl -X GET "$BASE_URL/produtos" "${HEADERS[@]}" | jq '.'

# 2. Buscar produto específico
echo -e "\n=== Buscando produto ID 1 ==="
curl -X GET "$BASE_URL/produtos/1" "${HEADERS[@]}" | jq '.'

# 3. Criar produto
echo -e "\n=== Criando produto ==="
curl -X POST "$BASE_URL/produtos" "${HEADERS[@]}" \
  -d '{
    "nome": "Produto cURL",
    "descricao": "Produto criado via cURL",
    "preco": 59.99,
    "categoria_id": 1,
    "ncm": "99887766",
    "origem": 0,
    "ativo": true
  }' | jq '.'

# 4. Listar clientes
echo -e "\n=== Listando clientes ==="
curl -X GET "$BASE_URL/clientes?page=1&per_page=10" "${HEADERS[@]}" | jq '.'

# 5. Emitir NFe
echo -e "\n=== Emitindo NFe ==="
curl -X POST "$BASE_URL/nfe" "${HEADERS[@]}" \
  -d '{
    "destinatario": {
      "nome": "Cliente Teste",
      "documento": "12345678901",
      "email": "teste@exemplo.com",
      "endereco": {
        "logradouro": "Rua Teste, 123",
        "bairro": "Centro",
        "cidade": "São Paulo",
        "uf": "SP",
        "cep": "01234567"
      }
    },
    "itens": [
      {
        "produto_id": 1,
        "quantidade": 2,
        "valor_unitario": 25.50,
        "descricao": "Produto de exemplo"
      }
    ],
    "natureza_operacao": "Venda de mercadoria",
    "observacoes": "NFe emitida via API"
  }' | jq '.'

# 6. Verificar status da NFe
echo -e "\n=== Status da NFe ==="
curl -X GET "$BASE_URL/nfe/1/status" "${HEADERS[@]}" | jq '.'

# 7. Download do XML da NFe
echo -e "\n=== Download XML NFe ==="
curl -X GET "$BASE_URL/nfe/1/xml" "${HEADERS[@]}" \
  --output "nfe_1.xml" \
  --silent --show-error

# 8. Download do PDF da NFe
echo -e "\n=== Download PDF NFe ==="
curl -X GET "$BASE_URL/nfe/1/pdf" "${HEADERS[@]}" \
  --output "nfe_1.pdf" \
  --silent --show-error

echo -e "\n=== Exemplos concluídos! ==="

Códigos de Resposta

Código Status Descrição Exemplo
200 OK Requisição executada com sucesso Lista de produtos retornada
201 Created Recurso criado com sucesso Produto criado, NFe emitida
400 Bad Request Dados inválidos ou incompletos Campo obrigatório ausente
401 Unauthorized Chaves de API inválidas Public/Secret key incorretas
403 Forbidden Sem permissão para este recurso Chave sem permissão de escrita
404 Not Found Recurso não encontrado Produto com ID inexistente
429 Too Many Requests Limite de requisições excedido Mais de 1000 req/hora
500 Internal Server Error Erro interno do servidor Falha no processamento

Rate Limiting

Produção
  • 1.000 requisições por hora
  • 10 requisições por segundo (burst)
  • 5 requisições simultâneas
Sandbox
  • 100 requisições por hora
  • 5 requisições por segundo (burst)
  • 3 requisições simultâneas
Headers de Rate Limiting: As respostas incluem headers com informações sobre os limites:
X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset

Precisa de Ajuda?

Nossa equipe está pronta para ajudar você a integrar com sucesso!