API pública v1
Developer Profile API
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
Perfil completo del desarrollador: disponibilidad, stack, lo que busca y enlaces.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nombre completo |
role | string | Rol profesional |
location | string | Ubicación |
remote | boolean | Trabaja en remoto |
available | boolean | Disponible para proyectos nuevos |
available_from | string | null | Fecha ISO desde la que está disponible |
open_to_offers | boolean | Acepta propuestas |
rate_hint | string | null | Tarifa orientativa |
looking_for | string | null | Tipo de proyectos que busca |
not_looking_for | string | null | Lo que no busca |
stack | string[] | Stack principal (array plano) |
links | object | portfolio, readme, cv, blog, contact, offers, api_docs |
updated_at | string | Fecha 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"
}Disponibilidad actual. Endpoint ligero pensado para badges, widgets e integraciones de terceros.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
available | boolean | Disponible ahora mismo |
available_from | string | null | Fecha ISO si tiene fecha de disponibilidad futura |
open_to_offers | boolean | Acepta propuestas en este momento |
updated_at | string | Fecha 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"
}Últimas entradas publicadas en el blog. Admite filtrado por categoría y límite variable.
Query params
| Param | Tipo | Default | Descripción |
|---|---|---|---|
limit | number | 5 | Número de posts (máx 10) |
category | string | — | Slug de categoría para filtrar |
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
posts | Post[] | Array de posts (ver campos abajo) |
posts[].slug | string | Slug único del post |
posts[].title | string | Título |
posts[].excerpt | string | null | Extracto |
posts[].published_at | string | null | Fecha de publicación ISO |
posts[].tags | string[] | Etiquetas del post |
posts[].category | { slug, name } | null | Categoría |
posts[].url | string | URL absoluta al post |
total | number | Número de posts devueltos |
limit | number | Lí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
}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.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
categories | Record<string, Category> | Categorías: backend, frontend, infra, ai, tooling |
categories[].label | string | Etiqueta legible de la categoría |
categories[].icon | string | Emoji representativo |
categories[].items | StackItem[] | Tecnologías en la categoría |
items[].name | string | Nombre de la tecnología |
items[].since | number | Año de inicio de uso profesional |
items[].level | "expert" | "proficient" | "learning" | Nivel de dominio |
items[].highlight | boolean? | Si es tecnología core / destacada |
total | number | Total de tecnologías en el stack |
highlighted | number | Número de tecnologías destacadas |
updated_at | string | Fecha 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"
}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.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
developer.years_experience | number | Años de experiencia profesional |
developer.career_start | number | Año de inicio de carrera |
developer.available | boolean | Disponibilidad actual |
developer.open_to_offers | boolean | Acepta propuestas |
content.posts_published | number | Posts publicados en el blog |
content.last_post_at | string | null | Fecha del último post |
content.tools_available | number | Herramientas dev disponibles |
content.calculators_available | number | Calculadoras disponibles |
content.total_resources | number | Total de recursos (tools + calculadoras) |
stack.total_technologies | number | Tecnologías en el stack |
stack.categories | number | Categorías del stack |
stack.highlight_count | number | Tecnologías core |
activity.open_offers | number | Ofertas activas públicas recibidas |
meta.api_version | string | Versión de la API |
meta.generated_at | string | Timestamp de generación |
meta.docs | string | URL 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"
}
}CV estructurado completo: perfil, disponibilidad, especialidades, servicios y contacto. Perfecto para ATS, herramientas de recruiter, integraciones automáticas y parsers.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
name | string | Nombre completo |
role | string | Rol profesional |
years_experience | number | Años de experiencia calculados en tiempo real |
career_start | number | Año de inicio de carrera |
location | string | Ubicación |
remote | boolean | Trabaja en remoto |
available | boolean | Disponible ahora |
rate_hint | string | null | Tarifa orientativa |
specialties | string[] | Especialidades principales |
stack_highlights | string[] | Stack destacado |
looking_for | string | null | Qué tipo de proyectos busca |
not_looking_for | string | null | Qué no busca |
services | { slug, title, url }[] | Servicios ofrecidos |
contact | object | URLs 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"
}
}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.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
available | boolean | Disponible ahora mismo |
available_from | string | null | Fecha ISO de disponibilidad futura |
open_to_offers | boolean | Acepta propuestas |
rate_hint | string | null | Tarifa orientativa |
looking_for | string | null | Qué busca |
not_looking_for | string | null | Qué no busca |
stack | string[] | Stack principal |
message | string | Mensaje de disponibilidad legible |
last_updated | string | null | Última actualización del perfil |
send_offer | string | URL 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"
}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.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
services | Service[] | Array de servicios |
services[].slug | string | Identificador único |
services[].title | string | Título del servicio |
services[].summary | string | Resumen breve |
services[].ideal_for | string[] | Para quién es ideal |
services[].outcomes | string[] | Resultados esperados |
services[].process | string[] | Pasos del proceso de trabajo |
services[].keywords | string[] | Keywords SEO y búsqueda |
services[].url | string | URL de la página del servicio |
total | number | Total 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
}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.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
cases | Case[] | Array de casos |
cases[].slug | string | Identificador único |
cases[].service_slug | string | Servicio relacionado |
cases[].title | string | Título del caso |
cases[].summary | string | Resumen |
cases[].what_we_did | string[] | Qué se hizo exactamente |
cases[].outcomes | string[] | Resultados obtenidos |
cases[].metrics | { label, value, mode } | Métricas del caso |
cases[].radiograph | { before, after, flow } | Radiografía antes/después |
cases[].url | string | URL del caso |
total | number | Total 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
}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.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
focus | string | Foco principal actual |
current_project | string | null | Proyecto en el que estoy trabajando |
learning | string | null | Qué estoy aprendiendo |
reading | string | null | Qué estoy leyendo |
updated_at | string | Cuándo se actualizó |
note | string | Nota 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"
}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.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
principles | Principle[] | Array de principios |
principles[].id | number | Identificador |
principles[].category | string | Categoría: arquitectura, entrega, colaboracion, producto, seguridad, crecimiento |
principles[].title | string | Título del principio |
principles[].description | string | Explicación detallada |
total | number | Total de principios |
categories | string[] | 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"
]
}Setup completo del desarrollador: hardware, editor, terminal, software y servicios. Inspirado en uses.tech. Para developers curiosos sobre el entorno de trabajo.
Campos de respuesta
| Campo | Tipo | Descripción |
|---|---|---|
hardware | object | computer, monitor, keyboard, mouse, headphones |
editor | object | name, theme, font, extensions[] |
terminal | object | shell, theme, tools[] |
software | object | browser, api_client, database_gui, notes, ai_tools[] |
services | object | hosting, cdn_dns, database, email, ci_cd, automation |
context | object | location, 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 →