Conceptos
Paginación y formatos
Las listas se paginan con un cursor. Las respuestas son JSON con convenciones predecibles.
Paginación por cursor#
Todos los endpoints que devuelven una lista aceptan dos parámetros de consulta:
| Parámetro | Detalles |
|---|---|
limit | Elementos por página, de 1 a 100. Valor predeterminado: consulta el endpoint en la Referencia de la API. |
cursor | El valor next_cursor de la página anterior. Omítelo en la primera página. |
La respuesta siempre tiene esta forma:
{
"data": [ { "id": "1043", "...": "..." } ],
"next_cursor": "eyJpZCI6IjEwNDMifQ"
}
Cuando next_cursor es null, no hay más páginas. Los cursores son cadenas opacas: no los construyas ni los modifiques, y no los guardes durante mucho tiempo.
Leer todas las páginas#
curl "https://api.linework.app/open/v1/me/posts?limit=50" \
-H "Authorization: Bearer $LINEWORK_API_KEY"
# next page: pass the next_cursor you received
curl "https://api.linework.app/open/v1/me/posts?limit=50&cursor=eyJpZCI6IjEwNDMifQ" \
-H "Authorization: Bearer $LINEWORK_API_KEY"
async function* all(path) {
let cursor = null;
do {
const url = new URL(`https://api.linework.app/open/v1${path}`);
url.searchParams.set("limit", "100");
if (cursor) url.searchParams.set("cursor", cursor);
const res = await fetch(url, {
headers: { Authorization: `Bearer ${process.env.LINEWORK_API_KEY}` },
});
const page = await res.json();
yield* page.data;
cursor = page.next_cursor;
} while (cursor);
}
for await (const post of all("/me/posts")) console.log(post.id);
import os, requests
API = "https://api.linework.app/open/v1"
s = requests.Session()
s.headers["Authorization"] = f"Bearer {os.environ['LINEWORK_API_KEY']}"
def all_items(path):
cursor = None
while True:
params = {"limit": 100}
if cursor:
params["cursor"] = cursor
page = s.get(API + path, params=params, timeout=30).json()
yield from page["data"]
cursor = page.get("next_cursor")
if not cursor:
break
for post in all_items("/me/posts"):
print(post["id"])
Convenciones JSON#
- Los nombres de los campos están en
camelCase(por ejemplo,createdAt,mediaIds). La única excepción esnext_cursoren las respuestas de lista. - Los ids son cadenas, aunque parezcan números. No los conviertas a números.
- Las fechas son cadenas ISO 8601 en UTC, por ejemplo
2026-10-14T09:30:00.000Z. - Los cuerpos de las solicitudes son JSON (
Content-Type: application/json), exceptoPOST /media, que esmultipart/form-data. - Los valores opcionales ausentes son
nullo se omiten; trata ambos casos de la misma forma. - Se pueden añadir campos nuevos a las respuestas en cualquier momento: ignora los campos que no conozcas.
Versionado#
La versión forma parte de la ruta (/open/v1). Dentro de v1 solo hacemos cambios retrocompatibles: nuevos endpoints, nuevos parámetros opcionales, nuevos campos en las respuestas, nuevos códigos de error. Los cambios incompatibles llegarán como /open/v2 y se anunciarán en el registro de cambios con suficiente antelación.