API B2B
Descarga comprobantes electrónicos (XML) de tus clientes en formato ZIP directamente desde nuestros servidores.
Base URL
https://ia.blueskyecuador.com/b2b/api
Formato
JSON (errores) · ZIP (descarga exitosa)
Autenticación
Cada request debe incluir dos headers de autenticación. Obtendrás estas credenciales al crear tu cuenta B2B desde el portal.
| Header | Descripción |
|---|---|
| X-Client-Id | Tu identificador único de cliente (ULID). Visible en el panel B2B bajo el menú de usuario. |
| X-Api-Key | Tu clave de API en texto plano. Se muestra una sola vez al crear la cuenta o al regenerarla. |
bash
X-Client-Id: 01JVQH8K3N2XYZABCDEF012345
X-Api-Key: b3BlbnNlc3NhbWU...
Rate Limiting
El límite se aplica por X-Client-Id, no por IP.
60 requests / hora
Al exceder el límite recibirás un 429 Too Many Requests con el tiempo de espera en el header Retry-After.
Errores
Todos los errores devuelven JSON con el campo error.
| Código | Significado |
|---|---|
| 401 | Headers faltantes o credenciales inválidas. |
| 403 | Cuenta suspendida, o el RUC solicitado no pertenece a tu cuenta. |
| 404 | RUC no encontrado, o sin archivos para el período solicitado. |
| 422 | Parámetros inválidos o faltantes. |
| 429 | Rate limit excedido. Espera el tiempo indicado en Retry-After. |
| 500 | Error interno al generar el ZIP. |
GET
/downloadRecibidos
Descarga los XMLs de recibidos de un cliente como un archivo ZIP para el mes indicado.
Query Parameters
| Parámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
| ruc | string | Sí | RUC del contribuyente (13 dígitos, termina en 001). |
| type | string | Sí |
Tipo de comprobante:
factura
credito
retencion
|
| year | integer | Sí | Año del período. Ej: 2026 |
| month | integer | Sí | Mes del período (1–12). Ej: 5 |
Respuesta exitosa
200
El archivo ZIP del período, descargado directamente desde nuestros servidores.
El nombre del archivo tiene el formato
b2b_{type}_{ruc}_{year}{month:02d}.zip
Ejemplos
cURL
bash
curl -X GET \
"https://ia.blueskyecuador.com/b2b/api/downloadRecibidos?ruc=1234567890001&type=factura&year=2026&month=5" \
-H "X-Client-Id: TU_CLIENT_ID" \
-H "X-Api-Key: TU_API_KEY" \
-O -J
Python
python
import requests
headers = {
"X-Client-Id": "TU_CLIENT_ID",
"X-Api-Key": "TU_API_KEY",
}
params = {
"ruc": "1234567890001",
"type": "factura",
"year": 2026,
"month": 5,
}
resp = requests.get("https://ia.blueskyecuador.com/b2b/api/downloadRecibidos", headers=headers, params=params)
if resp.status_code == 200:
filename = f"b2b_{params['type']}_{params['ruc']}_{params['year']}{params['month']:02d}.zip"
with open(filename, "wb") as f:
f.write(resp.content)
else:
print(resp.json()) # {"error": "..."}
PHP
php
$ruc = '1234567890001';
$type = 'factura';
$year = 2026;
$month = 5;
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "https://ia.blueskyecuador.com/b2b/api/downloadRecibidos?" . http_build_query([
'ruc' => $ruc,
'type' => $type,
'year' => $year,
'month' => $month,
]),
CURLOPT_HTTPHEADER => [
'X-Client-Id: TU_CLIENT_ID',
'X-Api-Key: TU_API_KEY',
],
CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
$filename = "b2b_{$type}_{$ruc}_{$year}" . str_pad($month, 2, '0', STR_PAD_LEFT) . '.zip';
file_put_contents($filename, $response);
} else {
$error = json_decode($response, true);
echo $error['error'];
}
Respuesta de error (JSON)
json
{
"error": "No autorizado para este usuario."
}