Prueba Satify y Qando gratis: son nuestros y están en producción

Portal de desarrolladores

Leer este sitio con una máquina

Todo lo que hay acá es público y no necesita credenciales. Está pensado para agentes y para cualquier integración que quiera leer el catálogo de servicios, el blog o el portafolio sin raspar HTML.

Inicio rápido

Tres comandos para tener el mapa completo del sitio: el índice, el contrato y una página cualquiera en markdown.

curl -s https://humancreativelab.cl/llms.txt
curl -s https://humancreativelab.cl/openapi.json
curl -s -H "Accept: text/markdown" https://humancreativelab.cl/servicios

Versionado y deprecación

La versión mayor va en la ruta: /api/v1/…. Dentro de una versión mayor solo se agregan campos y endpoints; nada se quita ni cambia de tipo. Un cambio incompatible estrena una versión mayor nueva, y la anterior sigue respondiendo al menos 12 meses desde el anuncio.

Cada respuesta declara con qué versión te contestamos en Api-Version. Cuando una versión quede marcada para retirarse, sus respuestas viajarán además con Deprecation (RFC 9745) y Sunset (RFC 8594) con la fecha exacta, así que un cliente se entera leyendo cabeceras y no revisando esta página.

Las rutas sin versión, como /api/health, son alias permanentes de la versión vigente y no se van a retirar.

curl -sI https://humancreativelab.cl/api/v1/site

Límites de uso

La API pública acepta 200 peticiones por minuto y por IP. El estado del límite viaja en todas las respuestas, no solo cuando se agota: RateLimit como campo estructurado (RFC 9331) y las X-RateLimit-* de siempre, para que puedas regular el ritmo antes de chocar.

RateLimit: limit=200, remaining=197, reset=54
RateLimit-Policy: 200;w=60
X-RateLimit-Remaining: 197

Al superarlo la respuesta es 429 con Retry-After en segundos. No hay bloqueo permanente: pasada la ventana vuelves a tener cupo.

Autenticación

La superficie pública no usa claves: son lecturas de contenido ya publicado. No hay nada que pedir ni que rotar.

La API de administración de contenidos sí está autenticada y no es pública. Si necesitas acceso de escritura para una integración, escríbenos desde contacto y lo conversamos.

Markdown por negociación de contenido

Cualquier URL pública devuelve markdown si lo pides. Hay dos formas equivalentes, y la respuesta siempre lleva Vary: Accept para que las cachés no mezclen representaciones.

curl -s -H "Accept: text/markdown" https://humancreativelab.cl/faq
curl -s https://humancreativelab.cl/faq.md

Un Accept que no podamos satisfacer devuelve 406, y una ruta inexistente devuelve 404 con un cuerpo markdown que lista las secciones del sitio: un agente perdido siempre recibe el camino de vuelta.

Endpoints

GET/api/v1/site

Ficha del sitio

Identidad, casos de uso y puntos de entrada, con campos en vez de prosa. Es por donde conviene empezar: dice si este dominio resuelve la tarea antes de leer una sola página.

curl -s https://humancreativelab.cl/api/v1/site

GET/api/v1/pages

Índice de páginas publicadas

Todas las URL públicas con su sección, su fecha de modificación y la URL de su representación markdown. Acepta los parámetros section y limit.

curl -s "https://humancreativelab.cl/api/v1/pages?section=servicios&limit=10"

GET/api/v1/services

Catálogo de servicios

Qué construimos, con el enlace al detalle de cada servicio y a su versión markdown.

curl -s https://humancreativelab.cl/api/v1/services

GET/api/v1/projects

Portafolio publicado

Proyectos entregados, con el sitio del cliente cuando sigue en línea: es la evidencia verificable de lo que hemos construido.

curl -s https://humancreativelab.cl/api/v1/projects

GET/api/health

Estado del sitio

Responde sin autenticación y sin caché. Devuelve el estado y el commit desplegado, así que sirve para saber si lo que estás leyendo es la versión actual. Su equivalente versionado es /api/v1/health.

curl -s https://humancreativelab.cl/api/health

GET/llms.txt

Índice del sitio para agentes

Todas las URL publicadas, agrupadas por sección, en markdown. Se arma desde el mismo sitemap que leen los buscadores, así que nunca queda desfasado.

curl -s https://humancreativelab.cl/llms.txt

GET/openapi.json

Especificación OpenAPI 3.1

Contrato completo de la superficie pública: rutas, parámetros, esquemas de respuesta y forma de los errores.

curl -s https://humancreativelab.cl/openapi.json

GET/{ruta}.md

Cualquier página en markdown

Toda página pública tiene representación markdown. Se pide con el sufijo .md o con la cabecera Accept: text/markdown. El contenido sale de la misma página, no de un segundo árbol que mantener.

curl -s https://humancreativelab.cl/servicios.md

GET/api/chatbot/providers

Proveedores de IA configurados

Lista los proveedores y modelos que el asistente del sitio tiene disponibles.

curl -s https://humancreativelab.cl/api/chatbot/providers

POST/api/chatbot/message

Conversar con el asistente

Recibe el historial de la conversación y responde en streaming (text/event-stream). Está limitado por IP; la cabecera X-RateLimit-Remaining dice cuánto queda.

curl -N -X POST https://humancreativelab.cl/api/chatbot/message \
  -H "Content-Type: application/json" \
  -d '{"slug":"human-creative-lab","messages":[{"role":"user","content":"¿Qué hacen?"}]}'

Errores

Todo error de la API pública responde JSON con la misma forma. El campo code es estable: ramifica por él, no por el texto del mensaje.

{
  "error": {
    "code": "not_found",
    "status": 404,
    "message": "No existe el endpoint GET /api/inventado.",
    "hint": "Revisa la especificación OpenAPI en /openapi.json para ver los endpoints disponibles y sus métodos.",
    "documentation": "https://humancreativelab.cl/developers",
    "specification": "https://humancreativelab.cl/openapi.json"
  }
}

Códigos

codeHTTPCuándo aparece
not_found404La ruta no existe en la API pública.
method_not_allowed405La ruta existe pero no acepta ese método.
bad_request400Faltan campos obligatorios o vienen mal formados.
unsupported_media_type415El cuerpo no viene en un tipo que el endpoint acepte.
rate_limited429Se superó el límite por IP. Reintenta más tarde.
upstream_unavailable503Un servicio del que dependemos no responde.
internal_error500Error nuestro. Si se repite, escríbenos.

CLI

@humancreativelab/cli envuelve todo lo anterior para que un agente o un script no tenga que armar peticiones a mano. No necesita instalación previa ni configuración.

npx @humancreativelab/cli health
npx @humancreativelab/cli sitemap
npx @humancreativelab/cli read /servicios
npx @humancreativelab/cli search "landing page"
npx @humancreativelab/cli openapi

Cada comando acepta --json para salida estructurada y --base para apuntar a otro despliegue.

Límites y buen comportamiento

  • Hay límite por IP: 200 peticiones por minuto en la API pública. Al pasarte recibes un 429 con Retry-After.
  • Los agentes de IA conocidos están permitidos en robots.txt. Los raspadores de SEO comerciales, no.
  • Para recorrer el sitio completo, parte del llms.txt en vez de seguir enlaces: es más corto y no genera carga inútil.