AMBIENTE TESTLos cambios realizados aquí no afectan Producción.
BALCAM · Pesaje inteligente
DOCUMENTACIÓN PARA DESARROLLADORES

Conecte su sistema con la balanza y las pesadas de BALCAM.

Consulte el peso actual de las balanzas activas o los totales históricos de pesadas completas, parciales y kilogramos netos desde un ERP, software de facturación o desarrollo propio.

ComenzarConsultar peso actual
SOLO LECTURA

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ó.

Antes de comenzar

Un Administrador debe generar una clave desde Configuración → Integraciones. BALCAM muestra el secreto completo una sola vez.

AUTENTICACIÓN

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.

HTTP
Authorization: Bearer bci1.ID.SECRETO
Accept: application/json

Las claves pueden revocarse inmediatamente desde BALCAM. No las incluya en repositorios, capturas, registros ni código entregado al cliente.

LECTURA EN VIVO

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.

HTTP
GET /api/v1/integrations/scales/live
cURL
curl "https://www.balcam.com.ar/api/v1/integrations/scales/live" \
  -H "Authorization: Bearer bci1.ID.SECRETO" \
  -H "Accept: application/json"
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
    }
  ]
}
Lecturas vencidas

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.

RECURSO

Consulta resumida de pesadas

HTTP
GET /api/v1/integrations/weighings/summary?cuit=30123456789&from=2026-10-01&to=2026-10-31
ParámetroRequeridoDescripción
cuitSíCUIT de 11 dígitos, con o sin guiones.
fromSíFecha inicial, inclusive, en formato AAAA-MM-DD.
toSíFecha final, inclusive, en formato AAAA-MM-DD.
roleNoissuer, 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.

RESPUESTA

Totales claros para conciliación y facturación

JSON
{
  "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
  }
}
CÓMPUTO

Qué representa cada total

Pesadas completas

Operaciones cerradas, confirmadas administrativamente y no anuladas dentro del período. No se duplican si la empresa ocupa más de un rol.

Pesadas parciales

Cada captura parcial de las operaciones encontradas. Se informa separada de las completas.

Kilogramos netos

Suma solamente el neto definitivo de las operaciones completas. Los pesos parciales no se acumulan.

ERRORES

Estados HTTP y códigos estables

HTTPCódigoSignificado
400INVALID_QUERYCUIT, fechas, período o rol inválidos.
401INVALID_CREDENTIALClave ausente, inválida o revocada.
404COMPANY_NOT_FOUNDEl CUIT no pertenece al ámbito consultable.
429RATE_LIMITEDSe superaron 60 consultas por minuto para la clave.
JSON
{
  "error": {
    "code": "INVALID_QUERY",
    "message": "Revisá el CUIT, las fechas y el rol."
  }
}
EJEMPLOS

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
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"
Delphi
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;
C++ · libcurl
#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);
C# · .NET
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();
Python · requests
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())
JavaScript · Node.js
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());