Ir al contenido principal

API pública v1

Developer Profile API

API REST pública y abierta para consultar mi perfil, stack, disponibilidad, últimos posts y estadísticas. Sin autenticación. CORS abierto. ISR cacheado en CDN.

Base URL

https://www.luismibriz.dev/api/v1

Auth

Ninguna

Formato

JSON UTF-8

CORS

Abierto (*)

Cache ISR + X-API-Version: Cada endpoint incluye la cabecera X-API-Version: 1. Los datos se cachean en CDN según el TTL de cada endpoint. Un 429 incluye cabecera Retry-After.

Endpoints disponibles

GET/api/v1/developer300s cacheProbar →
GET/api/v1/developer/status60s cacheProbar →
GET/api/v1/blog/latest300s cacheProbar →
GET/api/v1/stack24h cacheProbar →
GET/api/v1/stats300s cacheProbar →
GET/api/v1/cv300s cacheProbar →
GET/api/v1/availability60s cacheProbar →
GET/api/v1/services24h cacheProbar →
GET/api/v1/cases24h cacheProbar →
GET/api/v1/now1h cacheProbar →
GET/api/v1/principles24h cacheProbar →
GET/api/v1/uses24h cacheProbar →
GET/api/v1/developer300s cacheProbar →

Perfil completo del desarrollador: disponibilidad, stack, lo que busca y enlaces.

Rate limit60 req/min por IP

Campos de respuesta

CampoTipoDescripción
namestringNombre completo
rolestringRol profesional
locationstringUbicación
remotebooleanTrabaja en remoto
availablebooleanDisponible para proyectos nuevos
available_fromstring | nullFecha ISO desde la que está disponible
open_to_offersbooleanAcepta propuestas
rate_hintstring | nullTarifa orientativa
looking_forstring | nullTipo de proyectos que busca
not_looking_forstring | nullLo que no busca
stackstring[]Stack principal (array plano)
linksobjectportfolio, readme, cv, blog, contact, offers, api_docs
updated_atstringFecha ISO de última actualización

Ejemplo de respuesta

{
  "name": "Luis Miguel García Briz",
  "role": "Backend Senior Developer",
  "location": "Gijón, España",
  "remote": true,
  "available": true,
  "available_from": null,
  "open_to_offers": true,
  "rate_hint": "consultar",
  "looking_for": "Proyectos de backend, APIs, automatización o IA aplicada.",
  "not_looking_for": "Roles de gestión pura, oficina fija.",
  "stack": [
    "PHP",
    "Symfony",
    "Next.js",
    "TypeScript",
    "n8n",
    "Supabase",
    "Docker"
  ],
  "links": {
    "portfolio": "https://www.luismibriz.dev",
    "readme": "https://www.luismibriz.dev/readme",
    "cv": "https://www.luismibriz.dev/cv",
    "api_docs": "https://www.luismibriz.dev/api/v1"
  },
  "updated_at": "2026-05-11T10:00:00.000Z"
}
GET/api/v1/developer/status60s cacheProbar →

Disponibilidad actual. Endpoint ligero pensado para badges, widgets e integraciones de terceros.

Rate limit120 req/min por IP

Campos de respuesta

CampoTipoDescripción
availablebooleanDisponible ahora mismo
available_fromstring | nullFecha ISO si tiene fecha de disponibilidad futura
open_to_offersbooleanAcepta propuestas en este momento
updated_atstringFecha ISO de última actualización

Ejemplo de respuesta

{
  "available": true,
  "available_from": null,
  "open_to_offers": true,
  "updated_at": "2026-05-11T10:00:00.000Z"
}
GET/api/v1/blog/latest300s cacheProbar →

Últimas entradas publicadas en el blog. Admite filtrado por categoría y límite variable.

Rate limit60 req/min por IP

Query params

ParamTipoDefaultDescripción
limitnumber5Número de posts (máx 10)
categorystringSlug de categoría para filtrar

Campos de respuesta

CampoTipoDescripción
postsPost[]Array de posts (ver campos abajo)
posts[].slugstringSlug único del post
posts[].titlestringTítulo
posts[].excerptstring | nullExtracto
posts[].published_atstring | nullFecha de publicación ISO
posts[].tagsstring[]Etiquetas del post
posts[].category{ slug, name } | nullCategoría
posts[].urlstringURL absoluta al post
totalnumberNúmero de posts devueltos
limitnumberLímite aplicado

Ejemplo de respuesta

{
  "posts": [
    {
      "slug": "claude-mcp-desarrollo-agentes-ia",
      "title": "Claude MCP: desarrollo de agentes IA",
      "excerpt": "Cómo construir agentes con el Model Context Protocol de Anthropic.",
      "published_at": "2026-05-08T09:00:00.000Z",
      "tags": [
        "claude",
        "mcp",
        "ia",
        "agentes"
      ],
      "category": {
        "slug": "ia",
        "name": "IA & Automatización"
      },
      "url": "https://www.luismibriz.dev/blog/claude-mcp-desarrollo-agentes-ia"
    }
  ],
  "total": 1,
  "limit": 5
}
GET/api/v1/stack24h cacheProbar →

Stack técnico categorizado con nivel de experiencia, año de inicio y tecnologías destacadas. Mucho más rico que el array plano del endpoint /developer.

Rate limit60 req/min por IP

Campos de respuesta

CampoTipoDescripción
categoriesRecord<string, Category>Categorías: backend, frontend, infra, ai, tooling
categories[].labelstringEtiqueta legible de la categoría
categories[].iconstringEmoji representativo
categories[].itemsStackItem[]Tecnologías en la categoría
items[].namestringNombre de la tecnología
items[].sincenumberAño de inicio de uso profesional
items[].level"expert" | "proficient" | "learning"Nivel de dominio
items[].highlightboolean?Si es tecnología core / destacada
totalnumberTotal de tecnologías en el stack
highlightednumberNúmero de tecnologías destacadas
updated_atstringFecha de última revisión

Ejemplo de respuesta

{
  "categories": {
    "backend": {
      "label": "Backend",
      "icon": "⚙️",
      "items": [
        {
          "name": "PHP",
          "since": 2009,
          "level": "expert",
          "highlight": true
        },
        {
          "name": "Symfony",
          "since": 2012,
          "level": "expert",
          "highlight": true
        },
        {
          "name": "TypeScript",
          "since": 2021,
          "level": "expert",
          "highlight": true
        }
      ]
    },
    "ai": {
      "label": "IA & Automatización",
      "icon": "🤖",
      "items": [
        {
          "name": "n8n",
          "since": 2023,
          "level": "expert",
          "highlight": true
        }
      ]
    }
  },
  "total": 27,
  "highlighted": 8,
  "updated_at": "2026-05-01T00:00:00.000Z"
}
GET/api/v1/stats300s cacheProbar →

Estadísticas agregadas: años de experiencia, posts publicados, herramientas disponibles, tamaño del stack y actividad. El endpoint más completo para integraciones de dashboard.

Rate limit30 req/min por IP

Campos de respuesta

CampoTipoDescripción
developer.years_experiencenumberAños de experiencia profesional
developer.career_startnumberAño de inicio de carrera
developer.availablebooleanDisponibilidad actual
developer.open_to_offersbooleanAcepta propuestas
content.posts_publishednumberPosts publicados en el blog
content.last_post_atstring | nullFecha del último post
content.tools_availablenumberHerramientas dev disponibles
content.calculators_availablenumberCalculadoras disponibles
content.total_resourcesnumberTotal de recursos (tools + calculadoras)
stack.total_technologiesnumberTecnologías en el stack
stack.categoriesnumberCategorías del stack
stack.highlight_countnumberTecnologías core
activity.open_offersnumberOfertas activas públicas recibidas
meta.api_versionstringVersión de la API
meta.generated_atstringTimestamp de generación
meta.docsstringURL de la documentación

Ejemplo de respuesta

{
  "developer": {
    "years_experience": 17,
    "career_start": 2009,
    "available": true,
    "open_to_offers": true
  },
  "content": {
    "posts_published": 12,
    "last_post_at": "2026-05-08T09:00:00.000Z",
    "tools_available": 24,
    "calculators_available": 18,
    "total_resources": 42
  },
  "stack": {
    "total_technologies": 27,
    "categories": 5,
    "highlight_count": 8
  },
  "activity": {
    "open_offers": 0
  },
  "meta": {
    "api_version": "1",
    "generated_at": "2026-05-11T12:00:00.000Z",
    "docs": "https://www.luismibriz.dev/api/v1",
    "profile": "https://www.luismibriz.dev/readme"
  }
}
GET/api/v1/cv300s cacheProbar →

CV estructurado completo: perfil, disponibilidad, especialidades, servicios y contacto. Perfecto para ATS, herramientas de recruiter, integraciones automáticas y parsers.

Rate limit30 req/min por IP

Campos de respuesta

CampoTipoDescripción
namestringNombre completo
rolestringRol profesional
years_experiencenumberAños de experiencia calculados en tiempo real
career_startnumberAño de inicio de carrera
locationstringUbicación
remotebooleanTrabaja en remoto
availablebooleanDisponible ahora
rate_hintstring | nullTarifa orientativa
specialtiesstring[]Especialidades principales
stack_highlightsstring[]Stack destacado
looking_forstring | nullQué tipo de proyectos busca
not_looking_forstring | nullQué no busca
services{ slug, title, url }[]Servicios ofrecidos
contactobjectURLs de contacto y perfil

Ejemplo de respuesta

{
  "name": "Luis Miguel García Briz",
  "role": "Desarrollador Backend Senior",
  "years_experience": 17,
  "career_start": 2009,
  "location": "Gijón, España",
  "remote": true,
  "available": true,
  "specialties": [
    "PHP / Symfony / Laravel",
    "APIs REST & GraphQL",
    "Automatización e IA aplicada (n8n, Claude API)"
  ],
  "stack_highlights": [
    "PHP",
    "Symfony",
    "Next.js",
    "TypeScript",
    "n8n",
    "Supabase",
    "Docker"
  ],
  "contact": {
    "website": "https://www.luismibriz.dev",
    "cv": "https://www.luismibriz.dev/cv",
    "send_offer": "https://www.luismibriz.dev/ofertas/nueva"
  }
}
GET/api/v1/availability60s cacheProbar →

Estado de disponibilidad en tiempo real. El endpoint más fresco de la API (60s cache). Ideal para badges en tiempo real, widgets de sidebar o integraciones de CRM que necesitan saber si estás disponible antes de contactar.

Rate limit60 req/min por IP

Campos de respuesta

CampoTipoDescripción
availablebooleanDisponible ahora mismo
available_fromstring | nullFecha ISO de disponibilidad futura
open_to_offersbooleanAcepta propuestas
rate_hintstring | nullTarifa orientativa
looking_forstring | nullQué busca
not_looking_forstring | nullQué no busca
stackstring[]Stack principal
messagestringMensaje de disponibilidad legible
last_updatedstring | nullÚltima actualización del perfil
send_offerstringURL para enviar propuesta

Ejemplo de respuesta

{
  "available": true,
  "available_from": null,
  "open_to_offers": true,
  "rate_hint": "consultar",
  "message": "Disponible para proyectos y colaboraciones.",
  "send_offer": "https://www.luismibriz.dev/ofertas/nueva"
}
GET/api/v1/services24h cacheProbar →

Servicios ofrecidos con descripción completa, para quién son ideales, resultados esperados, proceso de trabajo y keywords. Todo lo que un PM necesita para evaluar si encaja.

Rate limit60 req/min por IP

Campos de respuesta

CampoTipoDescripción
servicesService[]Array de servicios
services[].slugstringIdentificador único
services[].titlestringTítulo del servicio
services[].summarystringResumen breve
services[].ideal_forstring[]Para quién es ideal
services[].outcomesstring[]Resultados esperados
services[].processstring[]Pasos del proceso de trabajo
services[].keywordsstring[]Keywords SEO y búsqueda
services[].urlstringURL de la página del servicio
totalnumberTotal de servicios

Ejemplo de respuesta

{
  "services": [
    {
      "slug": "automatizacion-ia",
      "title": "Automatización útil e IA aplicada",
      "summary": "Menos trabajo manual, menos copia y pega y menos procesos rotos entre herramientas.",
      "ideal_for": [
        "Freelance, agencias o pymes que repiten tareas de backoffice."
      ],
      "outcomes": [
        "Mapa claro del proceso actual y sus puntos de fricción."
      ],
      "url": "https://www.luismibriz.dev/servicios/automatizacion-ia"
    }
  ],
  "total": 3
}
GET/api/v1/cases24h cacheProbar →

Casos reales de portfolio con antes/después, qué se hizo, resultados y métricas. Útil para que un cliente potencial o PM evalúe cómo se trabaja antes de contactar.

Rate limit30 req/min por IP

Campos de respuesta

CampoTipoDescripción
casesCase[]Array de casos
cases[].slugstringIdentificador único
cases[].service_slugstringServicio relacionado
cases[].titlestringTítulo del caso
cases[].summarystringResumen
cases[].what_we_didstring[]Qué se hizo exactamente
cases[].outcomesstring[]Resultados obtenidos
cases[].metrics{ label, value, mode }Métricas del caso
cases[].radiograph{ before, after, flow }Radiografía antes/después
cases[].urlstringURL del caso
totalnumberTotal de casos

Ejemplo de respuesta

{
  "cases": [
    {
      "slug": "n8n-para-unir-formularios-crm-y-facturacion",
      "service_slug": "automatizacion-ia",
      "title": "Unir formularios, CRM, email y facturación sin seguir copiando datos a mano",
      "outcomes": [
        "Menos copia y pega entre herramientas.",
        "Menos errores de traspaso."
      ],
      "metrics": {
        "label": "Fricción eliminada",
        "value": "copias y olvidos",
        "mode": "Integración operativa"
      },
      "url": "https://www.luismibriz.dev/casos/n8n-para-unir-formularios-crm-y-facturacion"
    }
  ],
  "total": 4
}
GET/api/v1/now1h cacheProbar →

En qué estoy trabajando ahora mismo. Foco actual, proyecto en curso, qué estoy aprendiendo y leyendo. Actualizado manualmente desde Supabase. El /now page como API.

Rate limit60 req/min por IP

Campos de respuesta

CampoTipoDescripción
focusstringFoco principal actual
current_projectstring | nullProyecto en el que estoy trabajando
learningstring | nullQué estoy aprendiendo
readingstring | nullQué estoy leyendo
updated_atstringCuándo se actualizó
notestringNota sobre la frecuencia de actualización

Ejemplo de respuesta

{
  "focus": "Construyendo Arquitect, una plataforma B2B SaaS multi-tenant para equipos de arquitectura en Europa.",
  "current_project": "Arquitect — módulos de propuestas, pricing, onboarding y automatizaciones.",
  "learning": "MCP (Model Context Protocol), Claude API tool use, patrones multi-agent con LLMs.",
  "reading": "Building a Second Brain — Tiago Forte",
  "updated_at": "2026-05-11T10:00:00.000Z"
}
GET/api/v1/principles24h cacheProbar →

10 principios de ingeniería personales. No son dogmas, son criterios acumulados con 15+ años de práctica. Para developers que quieren entender cómo pienso técnicamente.

Rate limit60 req/min por IP

Campos de respuesta

CampoTipoDescripción
principlesPrinciple[]Array de principios
principles[].idnumberIdentificador
principles[].categorystringCategoría: arquitectura, entrega, colaboracion, producto, seguridad, crecimiento
principles[].titlestringTítulo del principio
principles[].descriptionstringExplicación detallada
totalnumberTotal de principios
categoriesstring[]Categorías disponibles

Ejemplo de respuesta

{
  "principles": [
    {
      "id": 1,
      "category": "arquitectura",
      "title": "No compliques lo que puede ser simple",
      "description": "La complejidad ceremonial cuesta más de lo que da..."
    }
  ],
  "total": 10,
  "categories": [
    "arquitectura",
    "entrega",
    "colaboracion",
    "producto",
    "seguridad",
    "crecimiento"
  ]
}
GET/api/v1/uses24h cacheProbar →

Setup completo del desarrollador: hardware, editor, terminal, software y servicios. Inspirado en uses.tech. Para developers curiosos sobre el entorno de trabajo.

Rate limit60 req/min por IP

Campos de respuesta

CampoTipoDescripción
hardwareobjectcomputer, monitor, keyboard, mouse, headphones
editorobjectname, theme, font, extensions[]
terminalobjectshell, theme, tools[]
softwareobjectbrowser, api_client, database_gui, notes, ai_tools[]
servicesobjecthosting, cdn_dns, database, email, ci_cd, automation
contextobjectlocation, timezone, works_from, languages[]

Ejemplo de respuesta

{
  "hardware": {
    "computer": "MacBook Pro M1"
  },
  "editor": {
    "name": "Visual Studio Code",
    "theme": "One Dark Pro",
    "font": "JetBrains Mono"
  },
  "terminal": {
    "shell": "zsh + Oh My Zsh",
    "tools": [
      "fzf",
      "gh (GitHub CLI)",
      "jq"
    ]
  },
  "services": {
    "hosting": "VPS propio + EasyPanel (Docker)",
    "automation": "n8n (self-hosted)"
  },
  "context": {
    "location": "Gijón, España",
    "timezone": "Europe/Madrid"
  }
}

Ejemplos de uso

Badge de disponibilidad

const res = await fetch(
  'https://www.luismibriz.dev/api/v1/developer/status'
);
const { available } = await res.json();

// Badge dinámico en tu README
const badge = available ? '🟢 Disponible' : '🔴 No disponible';

Stats en un dashboard

const stats = await fetch(
  'https://www.luismibriz.dev/api/v1/stats'
).then(r => r.json());

console.log(
  stats.developer.years_experience,
  stats.content.posts_published,
  stats.stack.total_technologies
);

Últimos posts

const { posts } = await fetch(
  'https://www.luismibriz.dev/api/v1/blog/latest?limit=3'
).then(r => r.json());

posts.forEach(p =>
  console.log(p.title, p.url)
);

Stack completo categorizado

const { categories } = await fetch(
  'https://www.luismibriz.dev/api/v1/stack'
).then(r => r.json());

const experts = categories.backend.items
  .filter(t => t.level === 'expert')
  .map(t => t.name);

¿Usas esta API en algún proyecto? Me interesa saberlo.

Cuéntame →