Para plataformas e integradores
Si gestionas una plataforma, un mercado o una herramienta de moderación y quieres comprobar si un avatar tiene ficha en THB, o mostrar una señal «registrado/verificado» junto a un contenido, esta página es el mapa de lo que puedes construir hoy.
La API pública
Sección titulada «La API pública»Toda la superficie es un único endpoint abierto:
GET /api/v0/records/<slug>.json. Sin clave de API,
sin cuenta, con CORS activado para llamarlo directo desde el navegador.
El contrato completo, campos, cabeceras de respuesta y cuerpos de
error, está documentado una sola vez, en
API pública; esta página no lo
repite.
Una cosa que conviene prever antes de construir: el endpoint solo sirve
fichas verificadas, y la verificación de identidad todavía no está
abierta, así que hoy cualquier slug responde
404 {"error":"not_found"}. Es el registro funcionando como está
diseñado, no una caída: una ficha gratuita es un registro, se queda
privada, y solo la verificación la hace pública. Puedes montar la
integración ya, contando con que el primer 200 OK llegará cuando se
abran las verificaciones.
Qué significa cada nivel para la moderación
Sección titulada «Qué significa cada nivel para la moderación»| Nivel | Qué puedes inferir |
|---|---|
| Ninguna ficha encontrada | O nadie ha registrado ese avatar en THB, o su dueño lo registró en privado y nunca lo verificó. La API devuelve el mismo 404 en ambos casos, a propósito, así que no puedes usar «no encontrado» como una señal negativa sobre el contenido en sí. |
| Verificado | Un humano real e identificado declaró responsabilidad sobre este avatar y pasó una comprobación de identidad. Es una señal positiva de responsabilidad, no una calificación de seguridad de contenido, y no dice nada sobre si el contenido en sí es apropiado para tu plataforma. |
En resumen: trata una consulta a THB como una entrada más, «¿hay una persona responsable e identificada detrás de esto?», junto a la revisión de contenido que ya haga tu propia plataforma, no como un sustituto de ella.
Enlazar la comprobación de un sello a una ficha
Sección titulada «Enlazar la comprobación de un sello a una ficha»Si muestras un aviso tipo «Comprobado con TheHumanBehind» junto a un
contenido, enlázalo directo a la página de la ficha en
/r/<slug> en lugar de mostrar solo una insignia
estática. Así tus propios usuarios pueden verificar la ficha por su
cuenta en lugar de fiarse a ciegas de tu integración, el mismo
principio detrás de
Comprobar un sello que ves por ahí.
CORS y uso razonable
Sección titulada «CORS y uso razonable»Las respuestas llevan un access-control-allow-origin: *
abierto y se cachean cinco minutos en el edge. Es suficiente para una
consulta lanzada por pieza de contenido o por revisión de moderación.
No está pensado para rastrear todo el registro: por favor, no
construyas un raspador masivo contra el endpoint de una sola ficha.
Acceso masivo y listados
Sección titulada «Acceso masivo y listados»No hay endpoint de listado ni de búsqueda en el contrato actual
v0, solo consultas de una ficha cada vez. Si tu integración
necesita acceso masivo, un webhook o un endpoint de listado/búsqueda,
ponte en contacto, es exactamente
el tipo de necesidad que un futuro v1 está pensado para
cubrir, y v0 seguirá funcionando sin cambios cuando llegue.
Gestionar TUS fichas: claves de servicio
Sección titulada «Gestionar TUS fichas: claves de servicio»Todo lo anterior va de CONSULTAR la ficha de otro. Si lo que necesitas es lo contrario, registrar y actualizar fichas tuyas desde tu propio sistema en vez de por el formulario, eso es otra puerta y necesita una clave.
Una empresa que lanza cincuenta agentes no debería tener que rellenar
cincuenta formularios. Crea una clave de servicio en tu panel, en
Claves de API, y úsala como credencial portadora contra
platform.thehumanbehind.com/api/manage/v1/.
- La clave se enseña una sola vez, al crearla. Guardamos solo su SHA-256, así que no podemos volver a enseñártela: si la pierdes, creas otra y revocas la anterior.
- Viaja en la cabecera
Authorization, nunca en la dirección. Una clave en la URL acaba en los registros de acceso, en las cabecerasReferery en el historial del navegador. - Llega a tus fichas y a nada más: ni al panel, ni a la facturación,
ni a datos de otra cuenta. Pedir una ficha que no es tuya responde
exactamente el mismo
404que una que no existe. - Es una credencial portadora: quien la tenga, eres tú. No hay firma de la petición ni ventana temporal. Trátala como una contraseña, guárdala en tu servidor y revócala desde el panel en cuanto sospeches de una fuga. La revocación es inmediata.
- 60 peticiones por minuto por clave.
- Tiene los permisos que le des al crearla, y no se pueden ampliar
después. Eliges entre solo leer (consultar tus fichas y el estado de
sus sellos) y leer y escribir (además, registrar y editar), y aparte
puedes marcar leer el texto de las instrucciones, que va suelto
porque el
skill.mdde tus agentes es propiedad tuya y una clave que se filtre no debería poder sacarlo. Una clave sin ese permiso ve la huella y la fecha de cada versión, nunca el texto.
Registrar una ficha
Sección titulada «Registrar una ficha»La cabecera Idempotency-Key es obligatoria al crear, y es lo que
hace seguro repetir un despliegue: la misma clave con el mismo cuerpo
devuelve la misma ficha en vez de registrar una segunda. Reutiliza el
mismo valor solo con el mismo cuerpo; la misma clave con un cuerpo
distinto responde 409 idempotency_key_reuse.
curl -X POST https://platform.thehumanbehind.com/api/manage/v1/records \
-H "Authorization: Bearer thb_sk_..." \
-H "Idempotency-Key: despliegue-2026-08-11-agente-01" \
-H "Content-Type: application/json" \
-d '{"avatarName":"Atlas",
"type":"agent",
"scope":"general",
"responsibleName":"Nombre Apellido",
"declaration":true}'
El "declaration": true no es relleno. Es la misma declaración de
responsabilidad que una persona acepta con la casilla del formulario:
estás afirmando que hay un humano real e identificable que responde por
esa ficha. El servidor no la firma por ti, así que una petición sin ella
responde 400 invalid_form.
Actualizar las instrucciones de un agente
Sección titulada «Actualizar las instrucciones de un agente»curl -X PUT https://platform.thehumanbehind.com/api/manage/v1/records/<id>/instructions \
-H "Authorization: Bearer thb_sk_..." \
-H "Content-Type: application/json" \
-d '{"instructions":"# Atlas\n..."}'
Cada escritura que cambia el texto de verdad archiva el anterior,
íntegro, con su huella y su fecha. Volver a escribir el mismo texto no
cambia nada y responde created: false con la versión vigente, así que
un despliegue que corre dos veces no inventa una versión.
Un GET en la misma dirección devuelve el histórico: versión, huella y
fecha, paginado con ?limit y ?offset (la respuesta trae has_more y
next_offset). El TEXTO no viene nunca ahí.
Para el texto se pide una versión concreta, con una clave que lleve el permiso de instrucciones:
curl "https://platform.thehumanbehind.com/api/manage/v1/records/<id>/instructions?include=text&version=3" \
-H "Authorization: Bearer thb_sk_..."
Sin version responde 400 version_required, y sin ese permiso
responde el mismo 401 que una clave desconocida. No hay forma de
pedirlas todas de una vez, y es a propósito: unas instrucciones son
propiedad intelectual de quien las escribió, así que enseñarlas es una
decisión, no el estado por defecto, y vaciarlas de golpe no es algo que
deba caber en una petición.
El resto de la superficie
Sección titulada «El resto de la superficie»| Petición | Qué hace |
|---|---|
GET /api/manage/v1/whoami |
Comprueba la clave y dice sus permisos, cuántas fichas tiene la cuenta y su techo. Empieza por aquí. |
GET /api/manage/v1/records |
Lista tus fichas, paginadas con ?limit y ?cursor. El cursor que devuelve (next_cursor) es opaco: reenvíalo tal cual, no lo construyas tú. |
GET y PATCH en /api/manage/v1/records/<id> |
Consulta o edita una tuya. |
Los errores son estables: 400 (invalid_json, invalid_form,
idempotency_key_required, reserved_name, immutable_field), 401 unauthorized (el mismo cuerpo para una clave ausente, mal formada,
desconocida, revocada o caducada, y para una sin el permiso adecuado),
404 not_found, 409 (idempotency_key_reuse,
idempotency_in_flight, verified_identity_locked,
constraint_violation, record_removed), 413 too_large, 429
(rate_limited, quota_exceeded, lifetime_quota_exceeded), 500 server_error.
Tres merecen una frase, porque son los que paran un bucle y no una
petición suelta. immutable_field es un PATCH que toca algo que no
cambia nunca (el número, la dirección, la fecha de registro).
record_removed es una escritura contra una ficha retirada: la
constancia se conserva, la ficha ya no admite cambios. Y
lifetime_quota_exceeded no es el límite por minuto, sino el techo de
fichas que esa cuenta puede llegar a registrar: reintentar no lo
soluciona, habla con nosotros.
En este árbol no hay CORS, a propósito: una clave secreta no pinta nada en un frontend, y sin esas cabeceras un navegador no puede mandarla desde otro origen.
Dos reglas que conviene saber antes de construir. El alta está sujeta al
mismo techo por cuenta que el formulario, así que consulta whoami
primero y escríbenos si tu importación no cabe. Y una ficha ya
verificada no puede cambiar de nombre, tipo, ámbito ni responsable
por ninguna vía: es justo lo que acredita el sello, y permitir que
cambie después sería un engaño para todo el que se fió de él.