Una API segura para conectar otros sistemas
La integración permite consultar el peso vigente de las balanzas activas y obtener información agregada de las pesadas. No permite operar la balanza, crear, modificar, cerrar ni anular pesadas. Cada credencial queda aislada al establecimiento que la generó.
Un Administrador debe generar una clave desde Configuración → Integraciones. BALCAM muestra el secreto completo una sola vez.
Envíe la clave como Bearer Token
Todas las consultas deben realizarse mediante HTTPS. La clave se envía en el encabezado Authorization, nunca en la URL.
Authorization: Bearer bci1.ID.SECRETO
Accept: application/jsonLas claves pueden revocarse inmediatamente desde BALCAM. No las incluya en repositorios, capturas, registros ni código entregado al cliente.
Consulte las balanzas activas del establecimiento
La petición nace en el sistema externo. BALCAM responde con todas las balanzas activas, su estado de conexión y la lectura vigente de cada una.
GET /api/v1/integrations/scales/livecurl "https://www.balcam.com.ar/api/v1/integrations/scales/live" \
-H "Authorization: Bearer bci1.ID.SECRETO" \
-H "Accept: application/json"{
"establishment": {
"id": "establecimiento-aaaa",
"name": "Establecimiento AAAA",
"timezone": "America/Argentina/Buenos_Aires"
},
"generatedAt": "2026-11-02T14:35:20.000Z",
"scales": [
{
"id": "balanza-principal",
"name": "Balanza principal",
"connected": true,
"weightKg": 28460,
"stable": true,
"readingId": "lectura-123",
"observedAt": "2026-11-02T14:35:19.820Z",
"receivedAt": "2026-11-02T14:35:19.900Z",
"ageMs": 100
}
]
}Cuando BALCAM deja de recibir datos dentro del tiempo configurado para la balanza, devuelve connected: false y weightKg: null. Nunca presenta un peso anterior como si fuera actual.
stable indica si la lectura cumple la configuración de estabilidad de la balanza. observedAt es el momento informado por el Connector y ageMs permite conocer la antigüedad de la última comunicación recibida.
Para una visualización continua, la aplicación puede repetir la consulta aproximadamente una vez por segundo. La clave admite hasta 60 solicitudes por minuto, compartidas entre todos los recursos.
Consulta resumida de pesadas
GET /api/v1/integrations/weighings/summary?cuit=30123456789&from=2026-10-01&to=2026-10-31| Parámetro | Requerido | Descripción |
|---|---|---|
cuit | Sí | CUIT de 11 dígitos, con o sin guiones. |
from | Sí | Fecha inicial, inclusive, en formato AAAA-MM-DD. |
to | Sí | Fecha final, inclusive, en formato AAAA-MM-DD. |
role | No | issuer, sender, carrier o recipient. |
El período máximo permitido es de 366 días. Si se omite role, el CUIT se busca en todos los roles y cada operación se cuenta una sola vez.
Totales claros para conciliación y facturación
{
"establishment": {
"id": "establecimiento-aaaa",
"name": "Establecimiento AAAA"
},
"company": {
"cuit": "30123456789",
"name": "Empresa consultada S.A."
},
"period": {
"from": "2026-10-01",
"to": "2026-10-31",
"timezone": "America/Argentina/Buenos_Aires"
},
"role": null,
"totals": {
"completeWeighings": 42,
"partialWeighings": 7,
"netKg": 1284500
}
}Qué representa cada total
Operaciones cerradas, confirmadas administrativamente y no anuladas dentro del período. No se duplican si la empresa ocupa más de un rol.
Cada captura parcial de las operaciones encontradas. Se informa separada de las completas.
Suma solamente el neto definitivo de las operaciones completas. Los pesos parciales no se acumulan.
Estados HTTP y códigos estables
| HTTP | Código | Significado |
|---|---|---|
| 400 | INVALID_QUERY | CUIT, fechas, período o rol inválidos. |
| 401 | INVALID_CREDENTIAL | Clave ausente, inválida o revocada. |
| 404 | COMPANY_NOT_FOUND | El CUIT no pertenece al ámbito consultable. |
| 429 | RATE_LIMITED | Se superaron 60 consultas por minuto para la clave. |
{
"error": {
"code": "INVALID_QUERY",
"message": "Revisá el CUIT, las fechas y el rol."
}
}Realice la misma consulta desde distintos lenguajes
Los valores son demostrativos. Reemplace la URL, la clave, el CUIT y las fechas antes de ejecutar cada ejemplo.
curl "https://www.balcam.com.ar/api/v1/integrations/weighings/summary?cuit=30123456789&from=2026-10-01&to=2026-10-31" \
-H "Authorization: Bearer bci1.ID.SECRETO" \
-H "Accept: application/json"uses IdHTTP, SysUtils;
var Http: TIdHTTP;
begin
Http := TIdHTTP.Create(nil);
try
Http.Request.CustomHeaders.Values['Authorization'] :=
'Bearer bci1.ID.SECRETO';
Writeln(Http.Get('https://www.balcam.com.ar/api/v1/integrations/weighings/summary?cuit=30123456789&from=2026-10-01&to=2026-10-31'));
finally
Http.Free;
end;
end;#include <curl/curl.h>
CURL* curl = curl_easy_init();
curl_slist* headers = nullptr;
headers = curl_slist_append(headers,
"Authorization: Bearer bci1.ID.SECRETO");
curl_easy_setopt(curl, CURLOPT_URL,
"https://www.balcam.com.ar/api/v1/integrations/weighings/summary?cuit=30123456789&from=2026-10-01&to=2026-10-31");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_perform(curl);
curl_slist_free_all(headers);
curl_easy_cleanup(curl);using System.Net.Http.Headers;
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", "bci1.ID.SECRETO");
var response = await client.GetAsync(
"https://www.balcam.com.ar/api/v1/integrations/weighings/summary?cuit=30123456789&from=2026-10-01&to=2026-10-31");
var json = await response.Content.ReadAsStringAsync();
response.EnsureSuccessStatusCode();import requests
response = requests.get(
"https://www.balcam.com.ar/api/v1/integrations/weighings/summary",
headers={"Authorization": "Bearer bci1.ID.SECRETO"},
params={
"cuit": "30123456789",
"from": "2026-10-01",
"to": "2026-10-31",
},
timeout=30,
)
response.raise_for_status()
print(response.json())const url = new URL(
'https://www.balcam.com.ar/api/v1/integrations/weighings/summary'
);
url.search = new URLSearchParams({
cuit: '30123456789',
from: '2026-10-01',
to: '2026-10-31'
});
const response = await fetch(url, {
headers: {Authorization: 'Bearer bci1.ID.SECRETO'}
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());