API oficial do
Actiz LIMS
Acesse dados laboratoriais com segurança e flexibilidade. REST/OData v4 e gRPC, autenticação JWT multi-tenant, mais de 114 endpoints organizados por domínio.
Filtre, ordene, pagine e expanda com $filter, $orderby, $expand, $select, $top e $skip. Limite de 1 000 registros por chamada.
Cada requisição valida o JWT e isola o banco de dados pelo claim tenant_id. Zero compartilhamento entre tenants.
Escolha o protocolo ideal: REST/OData para integrações HTTP padrão e gRPC para comunicação de alto desempenho entre serviços internos.
GET /api/quote já retorna Customer, Responsáveis, DiscountType, Project, QuoteDetails → Analysis e Packs expandidos — sem parâmetros extras.
Início Rápido
Faça sua primeira chamada em menos de 5 minutos.
POST /api/auth/login
Content-Type: application/json
{
"username": "seu-usuario",
"password": "sua-senha",
"tenantId": "seu-tenant-id"
}{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiresIn": 86400
}Authorization: Bearer em todas as chamadas. O tenant_id já está embutido no JWT.Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...GET /api/quote
Authorization: Bearer {seu-token}# Urgentes, ordenados, limitados
GET /api/quote?$filter=Urgent eq true&$orderby=DateCreation desc&$top=20
# Paginação — página 2 (50 registros)
GET /api/sample?$top=50&$skip=50&$count=true
# Busca por texto
GET /api/analysis?$filter=contains(Name,'metais')
# Expansão manual adicional
GET /api/order?$expand=Customer,OrderDetailsAutenticação
JWT (JSON Web Tokens) com isolamento multi-tenant via claims.
Endpoint de login
/api/auth/loginObter token JWT{
"username": "seu-usuario",
"password": "sua-senha",
"tenantId": "identificador-do-tenant"
}{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expiresIn": 86400
}Usando o token
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Claims do JWT
| Claim | Descrição | Obrigatório |
|---|---|---|
| tenant_id | Identifica o tenant e isola o banco de dados. | Sim |
| sub | Identificador do usuário autenticado. | Sim |
| exp | Data de expiração (Unix timestamp). Token válido por 24 h. | Sim |
Bearer {token}.Endpoints REST
Todos os endpoints suportam OData v4. Use os prefixos /api/ ou /odata/.
📋 Pedidos & Orçamentos
🔬 Análises & Laboratório
🧬 Amostras & Qualidade
👥 Clientes & Inventário
🔧 Instrumentos & Geográfico
📋 Worksheets & Auditoria
⚙️ Administrativo & Sistema
Rotas padrão por entidade
/api/{entidade}Listar com OData/api/{entidade}('{id}')Buscar por ID/api/{entidade}Criar registro/api/{entidade}('{id}')Substituir completamente/api/{entidade}('{id}')Atualizar parcialmente/api/{entidade}('{id}')Remover registro/api/quote/with-detailsCriação atômica Quote + DetalhesOData v4
Referência completa dos operadores de consulta suportados.
/api/ e /odata/ suportam OData v4. Limite: $top=1000 por requisição.Operadores de consulta
| Operador | Descrição | Exemplo |
|---|---|---|
| $filter | Filtra registros por condição | $filter=Urgent eq true |
| $select | Seleciona campos específicos | $select=Oid,Name,Email |
| $expand | Expande propriedades de navegação | $expand=Customer,OrderDetails |
| $orderby | Ordena os resultados | $orderby=DateCreation desc |
| $top | Limita o número de registros (máx. 1 000) | $top=50 |
| $skip | Pula N registros (paginação) | $skip=100 |
| $count | Inclui o total de registros na resposta | $count=true |
Operadores de $filter
| Operador | Significado | Exemplo |
|---|---|---|
| eq / ne | Igual / diferente | $filter=Status eq 'Aprovado' |
| gt / lt | Maior / menor que | $filter=Discount gt 0.1 |
| ge / le | Maior ou igual / menor ou igual | $filter=Quantity ge 10 |
| and / or | Operadores lógicos | $filter=Urgent eq true and Discount gt 0 |
| contains | Contém substring | $filter=contains(Name,'metal') |
| startswith | Começa com | $filter=startswith(Name,'Lab') |
Exemplos práticos
# Página 1
GET /api/sample?$top=50&$skip=0&$count=true&$orderby=DateCreation desc
# Página 2
GET /api/sample?$top=50&$skip=50&$orderby=DateCreation desc# Quote já expande automaticamente — mas você pode adicionar mais
GET /api/quote?$expand=Entitystatus
# Order com Customer selecionando campos + OrderDetails
GET /api/order?$expand=Customer($select=Name,Email),OrderDetails# Orçamentos urgentes com desconto
GET /api/quote?$filter=Urgent eq true and Discount gt 0&$orderby=DateCreation desc&$top=20
# Amostras de um cliente com expansão seletiva
GET /api/sample?$filter=CustomerId eq 'abc-123'&$expand=SampleType&$select=Oid,Code,DateCreationgRPC
27 serviços gRPC para comunicação de alto desempenho. gRPC-Web habilitado para browsers.
Autenticação gRPC
Inclua o JWT no metadata de cada chamada:
authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Serviços disponíveis
Exemplos de Código
Exemplos prontos para cURL, JavaScript, Python e C#.
1. Autenticação
curl -X POST https://seu-servidor/api/auth/login \
-H "Content-Type: application/json" \
-d '{"username":"seu-usuario","password":"sua-senha","tenantId":"seu-tenant"}'const resp = await fetch('/api/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ username: 'seu-usuario', password: 'sua-senha', tenantId: 'seu-tenant' })
});
const { token } = await resp.json();
localStorage.setItem('actiz_token', token);import requests
resp = requests.post('https://seu-servidor/api/auth/login', json={
'username': 'seu-usuario',
'password': 'sua-senha',
'tenantId': 'seu-tenant'
})
token = resp.json()['token']using var client = new HttpClient();
var resp = await client.PostAsJsonAsync("/api/auth/login",
new { username = "seu-usuario", password = "sua-senha", tenantId = "seu-tenant" });
var json = await resp.Content.ReadFromJsonAsync<JsonElement>();
string token = json.GetProperty("token").GetString()!;2. Listar Quotes com filtros
curl "https://seu-servidor/api/quote?\$filter=Urgent eq true&\$top=10&\$orderby=DateCreation desc" \
-H "Authorization: Bearer {seu-token}"const token = localStorage.getItem('actiz_token');
const params = new URLSearchParams({
'$filter': 'Urgent eq true',
'$orderby': 'DateCreation desc',
'$top': '10'
});
const resp = await fetch(`/api/quote?${params}`, {
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await resp.json(); // data.value = array de quotesheaders = {'Authorization': f'Bearer {token}'}
params = {'$filter': 'Urgent eq true', '$orderby': 'DateCreation desc', '$top': 10}
resp = requests.get('https://seu-servidor/api/quote', headers=headers, params=params)
quotes = resp.json()['value']client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", token);
var url = "/api/quote?$filter=Urgent eq true&$orderby=DateCreation desc&$top=10";
var result = await client.GetFromJsonAsync<ODataResponse<Quote>>(url);3. Criar Quote com detalhes (endpoint atômico)
curl -X POST https://seu-servidor/api/quote/with-details \
-H "Authorization: Bearer {seu-token}" \
-H "Content-Type: application/json" \
-d '{
"customerId": "cliente-id",
"entitystatusId": "status-id",
"responsible": "usuario-id",
"urgent": false,
"discount": 0.0,
"quoteDetails": [{
"item": "Análise de Água",
"sampletype": "tipo-id",
"quantity": 1,
"quoteDetailAnalysis": [{
"analysis": "analise-id",
"quantity": 1,
"unitaryvalue": 150.00
}],
"quoteDetailAnalysisPack": []
}]
}'const resp = await fetch('/api/quote/with-details', {
method: 'POST',
headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
customerId: 'cliente-id',
entitystatusId: 'status-id',
responsible: 'usuario-id',
urgent: false,
discount: 0.0,
quoteDetails: [{
item: 'Análise de Água',
sampletype: 'tipo-id',
quantity: 1,
quoteDetailAnalysis: [{ analysis: 'analise-id', quantity: 1, unitaryvalue: 150.00 }],
quoteDetailAnalysisPack: []
}]
})
});
const result = await resp.json();4. PATCH — atualização parcial
curl -X PATCH "https://seu-servidor/api/quote('quote-oid')" \
-H "Authorization: Bearer {seu-token}" \
-H "Content-Type: application/json" \
-d '{"Urgent": true, "Discount": 0.15}'Changelog
Histórico de alterações recentes.