Autenticación
Llamadas a la API de partner
Realiza llamadas a la API de Rhombus como partner: autentícate con una clave de API de partner, gestiona tus organizaciones cliente con endpoints de partner y dirige las llamadas a nivel de cliente a una organización gestionada con el encabezado x-auth-org.
En esta página
- Descripción general
- Antes de empezar
- Dos tipos de llamadas
- Autenticarse como partner
- Dirigir una llamada a una organización cliente
- Llamadas sin x-auth-org
- Ejemplos
- Paso 1: Lista tus organizaciones cliente
- Paso 2: Llama a un endpoint a nivel de cliente como un cliente gestionado
- La CLI lo hace por ti
- Conexiones WebSocket
- Referencia de endpoints de partner
- Claves de API de partner
- Solución de problemas
- Próximos pasos
Esta página se tradujo automáticamente. Si encuentras errores o tienes sugerencias, escríbenos.
Descripción general
Si eres un partner de Rhombus —un proveedor de servicios gestionados (MSP) o un revendedor que opera muchas organizaciones de clientes bajo una sola cuenta de partner—, tu clave de API funciona de forma distinta a la de una organización estándar. Una única clave de partner te permite:
- Gestionar tu conjunto de organizaciones cliente con endpoints de partner (
/api/partner/...): listar clientes, registrar hardware, consultar licencias y emitir tokens de API. - Acceder a cualquiera de esos clientes y llamar a endpoints a nivel de cliente (cámaras, control de acceso, sensores, usuarios — el resto de la API) como ese cliente, indicando la organización de destino en un solo encabezado de la solicitud.
Esta guía explica los dos tipos de llamadas, cómo se autentican las credenciales de partner y el encabezado x-auth-org que los une, de modo que un único conjunto de credenciales pueda operar en todas las organizaciones que gestionas.
Lo que esta guía no es. Aquí se explica cómo hacer llamadas a la API REST con una clave de API de partner existente. Si necesitas obtener credenciales de partner —el flujo de inicio de sesión OAuth por navegador, detectar cuentas partner o generar claves de partner de larga duración—, consulta Iniciar sesión con Rhombus, que documenta la ruta OAuth de partner y la generación de claves. Esta guía continúa una vez que ya tienes una clave de partner.
Antes de empezar
Para seguir esta guía necesitas:
- Una clave de API de partner (
x-auth-apikey) emitida para tu cuenta de partner. Consulta Iniciar sesión con Rhombus → Trabajar con cuentas partner para saber cómo se generan las claves de partner. El access token OAuth de un usuario partner funciona igual, enviado comoAuthorization: Bearer <token>. - El UUID de la organización cliente sobre la que quieras actuar. No necesitas conocerlo de antemano: la primera llamada de abajo lo devuelve.
- Familiaridad con los encabezados de autenticación estándar (
x-auth-scheme+x-auth-apikey) que se usan en el resto de la API.
Las URL base son las mismas que para cualquier otra llamada a la API de Rhombus; no hay un host de partner aparte. Usa las URL base de tu región (aquí se muestran las de EE. UU.; las organizaciones de la UE usan las variantes .eu.):
| URL base | Propósito |
|---|---|
https://api2.rhombussystems.com | Todos los endpoints de la API, de partner y a nivel de cliente |
https://media.rhombussystems.com | Medios y streaming (clips, transmisiones en vivo, miniaturas) |
Las claves de partner están vinculadas a la región como cualquier otra clave de API, y una cuenta de partner y sus organizaciones cliente viven en la misma región.
Dos tipos de llamadas
Cada solicitud que haces como partner es de uno de dos tipos. La diferencia está en la ruta del endpoint, y en si diriges la llamada a un cliente específico.
| Endpoints de partner | Endpoints a nivel de cliente | |
|---|---|---|
| Prefijo de ruta | /api/ | Todo lo demás (/api/, /api/, /api/, …) |
| Qué hacen | Gestionar tu cartera de clientes: listar organizaciones, registrar dispositivos, consultar licencias, emitir tokens | Operar dentro de una organización: cámaras, puertas, sensores, usuarios, eventos |
| Quién puede llamarlos | Solo cuentas de partner | Cualquier cuenta; un partner apunta a un cliente concreto |
| Esquema de auth | api-token (también se acepta partner-api-token) | api-token (también se acepta partner-api-token) |
Encabezado x-auth-org | No lo envíes: mueve la llamada a esa organización cliente | Obligatorio: indica la organización cliente como la que actuar |
La idea clave: los endpoints de partner operan a nivel de partner; los endpoints a nivel de cliente operan dentro de una organización. Un partner accede a un cliente añadiendo el encabezado x-auth-org —explicado más abajo—. No existen "versiones de partner" de los endpoints de cliente; llamas al mismo endpoint /api/camera/... que usaría un cliente, solo que con credenciales de partner y el encabezado x-auth-org.
Autenticarse como partner
Las credenciales de partner usan los mismos esquemas y encabezados que cualquier otra credencial. api-token, api y api-oauth-token aceptan credenciales de partner, y partner-api-token, partner-api y partner-api-oauth-token se aceptan como alias de ellos. Con una clave de API de partner:
| Encabezado | Valor |
|---|---|
x-auth-scheme | api-token (o su alias partner-api-token) |
x-auth-apikey | Tu clave de API de partner |
Content-Type | application/ |
-H "x-auth-scheme: api-token" \
-H "x-auth-apikey: YOUR_PARTNER_API_KEY" \
-H "Content-Type: application/json"Crea una clave de API de partner en la Consola de Rhombus en Configuración → Gestión de API → Agregar clave de API.
Otras credenciales de partner. Los partners que usan claves de TLS mutuo (basadas en certificado) usan x-auth-scheme: api (o partner-api) con su certificado de cliente; las claves de certificado no se aceptan en el WebSocket de eventos. El access token OAuth de un usuario partner va en Authorization: Bearer <token>. La clave basada en token que se muestra en esta guía es la opción más sencilla y la recomendada para la mayoría de las integraciones.
Trata la clave de API de partner como una llave maestra. Puede alcanzar a todas las organizaciones que gestionas. Guárdala cifrada, nunca la subas al control de versiones y rota o revoca las claves que no uses. Una clave de partner filtrada expone a todos tus clientes, no solo a uno.
Dirigir una llamada a una organización cliente
Para hacer una llamada a nivel de cliente en nombre de un cliente gestionado, añade el encabezado x-auth-org con el UUID de la organización de ese cliente:
| Encabezado | Valor |
|---|---|
x-auth-org | El UUID de la organización cliente de destino (base64 url-safe, ~22 caracteres, p. ej. AAAAAAAAAAAAAAAAAAAAAA) |
Con este encabezado presente, Rhombus trata la solicitud como si proviniera de dentro de esa organización cliente. El servidor comprueba que el cliente haya concedido acceso a tu cuenta de partner (acceso de inicio de sesión, o gestión por tu MSP) y que esa concesión no haya expirado; si no es así, la solicitud se rechaza con 403 PARTNER_CLIENT_ACCESS_DENIED. Un valor que no es un UUID de organización válido se rechaza con 400 INVALID_AUTH_ORG. Dentro de la organización cliente, la llamada puede hacer lo que permita el rol que el cliente concedió a tu cuenta de partner.
x-auth-orges solo un encabezado. Nunca se lee desde un parámetro de consulta.- Significa lo mismo para cualquier credencial de partner: claves de API de partner, claves de certificado de partner y access tokens OAuth de partner.
- Un valor vacío cuenta como ausente.
- La Referencia de la API lo incluye en cada operación, y la CLI de Rhombus lo envía con su opción
--partner-org.
Omite x-auth-org en los endpoints /api/partner/.... Los endpoints de partner operan a nivel de partner; enviar x-auth-org allí mueve la llamada a la organización cliente, así que falla o actúa sobre la organización equivocada.
Llamadas sin x-auth-org
Una credencial de partner que llama a un endpoint a nivel de cliente sin x-auth-org sigue funcionando, y actúa en tu organización de partner, pero la respuesta incluye dos encabezados:
Deprecation: true
Sunset: Tue, 05 Jan 2027 00:00:00 GMTA partir del 5 de enero de 2027, esas llamadas devuelven un error. Envía x-auth-org en cada llamada a nivel de cliente; los endpoints /api/partner/... no lo necesitan. El WebSocket de eventos ya rechaza un handshake de partner sin x-auth-org, con 403 PERMISSION_REQUIRED.
Ejemplos
Paso 1: Lista tus organizaciones cliente
Empieza con un endpoint de partner para descubrir las organizaciones que gestionas y sus UUID. POST /api/partner/getClientsV2 devuelve registros de cliente ligeros (nombre + UUID + conteo de dispositivos), ideal para resolver rápidamente el UUID de un cliente antes de actuar sobre él.
curl -X POST https://api2.rhombussystems.com/api/partner/getClientsV2 \
-H "x-auth-scheme: api-token" \
-H "x-auth-apikey: YOUR_PARTNER_API_KEY" \
-H "Content-Type: application/json" \
-d '{}'import requests
BASE_URL = "https://api2.rhombussystems.com"
headers = {
"x-auth-scheme": "api-token",
"x-auth-apikey": "YOUR_PARTNER_API_KEY",
"Content-Type": "application/json",
}
resp = requests.post(f"{BASE_URL}/api/partner/getClientsV2", headers=headers, json={})
resp.raise_for_status()
for client in resp.json().get("clients", []):
print(client["clientOrgName"], "->", client["clientOrgUuid"])const BASE_URL = "https://api2.rhombussystems.com";
const headers = {
"x-auth-scheme": "api-token",
"x-auth-apikey": "YOUR_PARTNER_API_KEY",
"Content-Type": "application/json",
};
const resp = await fetch(`${BASE_URL}/api/partner/getClientsV2`, {
method: "POST",
headers,
body: JSON.stringify({}),
});
const data = await resp.json();
for (const client of data.clients ?? []) {
console.log(`${client.clientOrgName} -> ${client.clientOrgUuid}`);
}package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
req, _ := http.NewRequest("POST",
"https://api2.rhombussystems.com/api/partner/getClientsV2",
bytes.NewBufferString("{}"))
req.Header.Set("x-auth-scheme", "api-token")
req.Header.Set("x-auth-apikey", "YOUR_PARTNER_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var out struct {
Clients []struct {
ClientOrgName string `json:"clientOrgName"`
ClientOrgUUID string `json:"clientOrgUuid"`
} `json:"clients"`
}
json.NewDecoder(resp.Body).Decode(&out)
for _, c := range out.Clients {
fmt.Printf("%s -> %s\n", c.ClientOrgName, c.ClientOrgUUID)
}
}Una respuesta lista cada cliente gestionado, incluido el clientOrgUuid que pasarás como x-auth-org:
{
"clients": [
{
"clientOrgName": "Acme Corporation",
"clientOrgUuid": "aB_cD1eF2gH3iJ4kL5mN6o",
"totalCameras": 25,
"totalLocations": 3
},
{
"clientOrgName": "Beta Industries",
"clientOrgUuid": "nO_pQ6rS7tU8vW9xY0zZ",
"totalCameras": 12,
"totalLocations": 1
}
]
}Paso 2: Llama a un endpoint a nivel de cliente como un cliente gestionado
Ahora usa un UUID de cliente del Paso 1 en el encabezado x-auth-org para llamar a un endpoint normal a nivel de cliente; aquí, listando las cámaras de un cliente con POST /api/camera/getMinimalCameraStateList. Ten en cuenta que no es un endpoint de partner; es el mismo endpoint de cámaras que usa cualquier organización, dirigido a tu cliente mediante el encabezado.
curl -X POST https://api2.rhombussystems.com/api/camera/getMinimalCameraStateList \
-H "x-auth-scheme: api-token" \
-H "x-auth-apikey: YOUR_PARTNER_API_KEY" \
-H "x-auth-org: aB_cD1eF2gH3iJ4kL5mN6o" \
-H "Content-Type: application/json" \
-d '{}'import requests
BASE_URL = "https://api2.rhombussystems.com"
CLIENT_ORG_UUID = "aB_cD1eF2gH3iJ4kL5mN6o"
headers = {
"x-auth-scheme": "api-token",
"x-auth-apikey": "YOUR_PARTNER_API_KEY",
"x-auth-org": CLIENT_ORG_UUID, # actuar como este cliente gestionado
"Content-Type": "application/json",
}
resp = requests.post(
f"{BASE_URL}/api/camera/getMinimalCameraStateList",
headers=headers,
json={},
)
resp.raise_for_status()
print(resp.json().get("cameraStates", []))const BASE_URL = "https://api2.rhombussystems.com";
const CLIENT_ORG_UUID = "aB_cD1eF2gH3iJ4kL5mN6o";
const headers = {
"x-auth-scheme": "api-token",
"x-auth-apikey": "YOUR_PARTNER_API_KEY",
"x-auth-org": CLIENT_ORG_UUID, // actuar como este cliente gestionado
"Content-Type": "application/json",
};
const resp = await fetch(`${BASE_URL}/api/camera/getMinimalCameraStateList`, {
method: "POST",
headers,
body: JSON.stringify({}),
});
console.log((await resp.json()).cameraStates);package main
import (
"bytes"
"net/http"
)
func main() {
clientOrgUUID := "aB_cD1eF2gH3iJ4kL5mN6o"
req, _ := http.NewRequest("POST",
"https://api2.rhombussystems.com/api/camera/getMinimalCameraStateList",
bytes.NewBufferString("{}"))
req.Header.Set("x-auth-scheme", "api-token")
req.Header.Set("x-auth-apikey", "YOUR_PARTNER_API_KEY")
req.Header.Set("x-auth-org", clientOrgUUID) // actuar como este cliente gestionado
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
// decodificar resp.Body...
}Si quitas el encabezado x-auth-org, la misma llamada apuntaría a tu organización de partner en lugar de al cliente, que normalmente no tiene cámaras propias, y la respuesta incluiría los encabezados Deprecation y Sunset descritos en Llamadas sin x-auth-org. El encabezado es lo que redirige la llamada hacia el cliente gestionado.
La CLI lo hace por ti
La CLI de Rhombus envuelve el mismo mecanismo tras una opción --partner-org, que acepta un UUID o un nombre de cliente y establece x-auth-org por ti:
# Por UUID
rhombus --partner-org aB_cD1eF2gH3iJ4kL5mN6o camera get-minimal-camera-state-list
# Por nombre de cliente (la CLI lo resuelve a un UUID con getClientsV2)
rhombus --partner-org "Acme Corporation" camera get-minimal-camera-state-listConexiones WebSocket
Las conexiones de partner en tiempo real usan las mismas credenciales. En el handshake del WebSocket, envía x-auth-apikey y x-auth-org como encabezados HTTP. x-auth-scheme puede ir en la cadena de consulta o en un encabezado. x-auth-org no se lee desde la cadena de consulta, y es obligatorio: un handshake de partner sin él se rechaza con 403 PERMISSION_REQUIRED. Los navegadores no permiten definir encabezados personalizados en el handshake de un WebSocket, así que conéctate desde un cliente del lado del servidor. Consulta Autenticación de WebSocket para ver el patrón completo.
URL: wss://ws.rhombussystems.com:8443/websocket?x-auth-scheme=api-token
Encabezados: x-auth-apikey: YOUR_PARTNER_API_KEY
x-auth-org: aB_cD1eF2gH3iJ4kL5mN6oReferencia de endpoints de partner
Estos endpoints /api/partner/... operan a nivel de partner y requieren una credencial de partner. Todos son POST. Consulta los esquemas completos de solicitud/respuesta en la Referencia de la API.
| Propósito | Endpoint | Qué hace |
|---|---|---|
| Clientes | getClients | Lista todas las organizaciones cliente (info completa) |
getClientsV2 | Lista clientes con info básica — la forma más rápida de resolver UUID de cliente | |
getClientSummaryInfo | Resumen de un solo cliente | |
getClientStatusMap | Estado agregado de dispositivos y ubicaciones de todos los clientes | |
createPartnerClient | Crea una nueva organización cliente | |
customizeClient | Personaliza una cuenta de cliente | |
deleteClient | Elimina una organización cliente | |
| Dispositivos | getClientDevices | Dispositivos de un cliente específico |
getListOfAllClientDevices | Dispositivos de todos los clientes gestionados | |
getListOfAvailableHardware | Hardware disponible para registro | |
getClaimKeysForPartnerOrg | Claves de reclamación de la organización de partner | |
registerCameraToClient | Registra una cámara en una organización cliente | |
reassignDeviceOrg | Mueve un dispositivo de una organización cliente a otra | |
customizeClientDevice | Personaliza un dispositivo de cliente | |
| Licencias | getLicensesForOrg | Licencias disponibles para una organización cliente |
getDeviceLicensesForOrg | Licencias por dispositivo para una organización cliente | |
updateSendLicenseExpirationEmail | Activa/desactiva las alertas por correo de vencimiento de licencia | |
| Tokens de API | getApiTokens | Lista los tokens de API activos del partner |
getApiTokenApplications | Lista las solicitudes de token pendientes | |
revokeApiToken | Revoca un token de API de partner | |
| Ventas | registerDeal | Registra una oportunidad de venta |
getShipments | Envíos de un cliente específico |
Claves de API de partner
Crea claves de partner en la consola en Configuración → Gestión de API, o con la API. Estos endpoints funcionan a nivel de partner, así que llámalos sin x-auth-org. Todos son POST:
| Acción | Endpoint | Cuerpo | Respuesta |
|---|---|---|---|
| Crear | /api/ | displayName, permissionGroupUuid (un rol de partner), authType (API_TOKEN, o CERT con un csr), expiresAtMs | apiKey, tokenUuid, expiresAtMs; en claves de certificado, cert y certNotAfterMs |
| Rotar | /api/ | tokenUuid, overlapSec opcional (86400 por defecto, como máximo 2592000), csr (obligatorio en claves de certificado), expiresAtMs | Los campos de la creación más previousKeyExpiresAtMs |
| Renovar un certificado | /api/ | csr, y tokenUuid salvo que una clave de certificado renueve su propio certificado | cert, certNotAfterMs |
- Quién puede llamarlos: una sesión de la consola o de la app móvil de partner, el access token OAuth de un usuario partner (con los tres scopes) o una clave de API de partner, cuyo rol de partner incluya la administración de la API. Los tokens federados no pueden.
- Cuando quien llama es una clave de API de partner,
expiresAtMses obligatorio: como máximo 365 días a partir de ahora, y no más tarde que la expiración de la propia clave que llama. La nueva clave se elimina cuando se elimina la clave que la creó. Una clave solo crea y rota claves en su propia organización, así que una clave de partner que envíax-auth-orga estos endpoints recibe 403. - La rotación emite una clave con el mismo rol y mantiene la clave anterior funcionando durante
overlapSecsegundos;previousKeyExpiresAtMsindica cuándo deja de funcionar. - La renovación conserva la misma clave y emite un certificado nuevo, sin solapamiento. Los certificados de partner duran 365 días, y se rechaza una CSR cuya firma no sea válida.
- Las claves expiradas reciben 401
CREDENTIAL_EXPIREDy siguen apareciendo engetApiTokenshasta que las revoques.
# Rota una clave de partner; la clave anterior sigue funcionando un día.
EXPIRES_AT_MS=$(( ($(date +%s) + 90 * 86400) * 1000 ))
curl -X POST "https://api2.rhombussystems.com/api/partner/rotateApiToken" \
-H "x-auth-scheme: api-token" \
-H "x-auth-apikey: YOUR_PARTNER_API_KEY" \
-H "Content-Type: application/json" \
-d "{\"tokenUuid\": \"OLD_TOKEN_UUID\", \"overlapSec\": 86400, \"expiresAtMs\": $EXPIRES_AT_MS}"Gestionar claves con la API documenta los mismos campos para las claves de organización. Para emitir una clave de partner a partir del inicio de sesión de un usuario partner, consulta Iniciar sesión con Rhombus → Trabajar con cuentas partner.
Solución de problemas
401 Unauthorized
Un 401 significa que la credencial falta, está mal formada, es desconocida, expiró o fue revocada. El errorCode del cuerpo indica cuál: UNAUTHENTICATED (no se envió ninguna credencial), INVALID_CREDENTIAL (un valor mal formado, o una clave que se eliminó o pertenece a la otra región), CREDENTIAL_EXPIRED, CREDENTIAL_REVOKED o CERTIFICATE_MISMATCH (un certificado emitido para otra clave). Revisa x-auth-scheme y que la clave esté en x-auth-apikey.
400 INVALID_AUTH_ORG
El valor de x-auth-org no es un UUID de organización válido. Copia el clientOrgUuid exacto de getClientsV2: son UUID base64 url-safe (~22 caracteres), así que un valor truncado o recodificado se rechaza.
403 Forbidden, o la llamada apunta a la organización equivocada
PARTNER_CLIENT_ACCESS_DENIED significa que tu cuenta de partner no tiene acceso a la organización de x-auth-org: no es un cliente que gestiones, o su concesión de acceso expiró. Vuelve a obtener la lista con getClientsV2 y copia el clientOrgUuid exacto. PERMISSION_REQUIRED significa que la credencial es válida, pero el rol (o, en un token OAuth, sus scopes) no permite la llamada. Una clave de organización estándar no puede alcanzar otras organizaciones, sin importar qué x-auth-org envíes.
Respuesta vacía o inesperada en un endpoint de cliente
Si olvidaste x-auth-org, la llamada se ejecutó contra tu organización de partner (que normalmente no tiene cámaras, puertas ni sensores) y devolvió una lista vacía; la respuesta también incluye los encabezados Deprecation y Sunset. Añade el encabezado para dirigir la llamada al cliente.
Un endpoint /api/partner/ falla o actúa sobre la organización equivocada
No envíes x-auth-org a los endpoints de partner: mueve la llamada a la organización cliente. Usa el cuerpo de la solicitud del propio endpoint (por ejemplo, el campo orgUuid en registerCameraToClient) para indicar a qué cliente se aplica la acción.
La autenticación de partner falla por WebSocket
El WebSocket de eventos no acepta claves de certificado. Genera una clave basada en token y usa api-token. En el handshake, x-auth-scheme puede ser un parámetro de consulta, pero x-auth-apikey y x-auth-org deben ser encabezados HTTP. Un handshake de partner sin x-auth-org se rechaza con 403 PERMISSION_REQUIRED. Consulta Autenticación de WebSocket.
Próximos pasos
Obtén credenciales de partner y genera claves de partner de larga duración
Abre conexiones de partner en tiempo real dirigidas a una organización cliente
Usa --partner-org para ejecutar cualquier comando contra un cliente gestionado
Explora todos los endpoints de partner y a nivel de cliente