Tutoriales
Medium profile en JavaScript
Una llamada autenticada a /api/v1/medium/profile?handle=markmanson, la respuesta que devolvió, y la línea que saca un campo de ella.
Lo que necesitas
Node 18 o posterior, donde fetch es global. Ningún paquete que instalar. El mismo código corre en un navegador, salvo que un navegador dejaría tu clave a la vista — llama a esto desde tu servidor.
La llamada
const url = "https://honesthook.com/api/v1/medium/profile?handle=markmanson";
const response = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.HH_KEY}` },
});
if (!response.ok) {
throw new Error(`HTTP ${response.status}`);
}
const envelope = await response.json();
console.log(envelope.success, envelope.platform, envelope.endpoint);
Lo que volvió
{
"success": true,
"platform": "medium",
"endpoint": "medium/profile",
"data": {
"author": {
"id": "db77b01f3f54",
"handle": "markmanson",
"name": "Mark Manson",
"followers": 83742,
"following": 217,
"posts_count": null,
"verified": null,
"is_private": null
}
},
"error": null,
"cached": false
}
Respuesta registrada, capturada el 27 Sep 2026. Una llamada en vivo devuelve el valor del momento en que preguntas, no este.
Todos los campos de esa captura
| En JavaScript | Tipo en esta captura |
|---|
envelope.success | boolean |
envelope.platform | string |
envelope.endpoint | string |
envelope.data.author.id | string |
envelope.data.author.handle | string |
envelope.data.author.name | string |
envelope.data.author.followers | number |
envelope.data.author.following | number |
envelope.data.author.posts_count | null |
envelope.data.author.verified | null |
envelope.data.author.is_private | null |
envelope.error | null |
envelope.cached | boolean |
Un campo que no podemos leer vuelve null, nunca 0. Un cero sería una afirmación sobre la cuenta; null es un hecho sobre nuestra recolección. La lista completa de lo que esta ruta no devuelve está en medium-api/profile.
Leer un campo
console.log(envelope.data.author.followers);
envelope es el objeto del bloque de arriba. Deja la clave en el servidor: una clave enviada a un navegador es una clave que cualquiera puede leer.
Medium tiene una trampa que atrapa a casi todo primer intento: un handle que no existe devuelve 200. No un 404 — una respuesta correcta que trae dentro una página de "no encontrado".
Así que cualquier código que compruebe el código de estado y luego parsee va a tratar una errata como una cuenta real. No se va a romper. Va a producir una nada con forma de perfil.
El ancla, no el código de estado
Este endpoint decide si la lectura funcionó buscando el propio objeto de perfil en el estado de Apollo de la página. Si ese objeto no está, la respuesta es un error, diga lo que diga el código de estado. El número también vive en ese estado y no en el marcado visible, que es una segunda razón para no leer Medium con una coincidencia de patrón sobre el HTML.
Ahí está todo el valor de la ruta: aquí el código de estado no es prueba, y lo que sí es prueba no está en el texto de la página.
Qué estás llamando
Un GET autenticado a nuestro endpoint, con tu clave en una cabecera Authorization. El handle del ejemplo es el que produjo la respuesta registrada más abajo.
Antes de copiar el bloque
Guarda la clave en una variable de entorno — los tres ejemplos leen HH_KEY.
Luego lee la lista de campos. No hay un número fiable de publicaciones públicas, así que ese campo viene null en lugar de contar lo que por casualidad se hubiera renderizado en la página.
El endpoint en sí
Parámetros, el formato del handle, lo que la ruta no devuelve y lo que cuesta una llamada: medium-api/profile.
La misma llamada en curl · Python.
← Tutoriales · medium-api · Precios