Introducción
Cada credencial pertenece a un solo proyecto y la crea un owner o admin en Configuración del proyecto › API. Tiene un client ID público, un client secret que se muestra una sola vez y una lista de permisos elegidos por módulo.
Tu servidor cambia la credencial por un token de acceso de corta duración y lo usa en cada petición. La API es de solo lectura: ningún endpoint crea, modifica ni borra datos.
Autenticación
OAuth 2.0 client credentials
Vida del token
1 hora, sin refresh token
Acceso
Solo lectura, un proyecto por credencial
URL base: https://api.wayki.app
Autenticación
Usamos el flujo client credentials de OAuth 2.0 (RFC 6749 §4.4). El secreto viaja solo al endpoint de tokens; cada petición de datos lleva un token que expira solo.
1. Crea una credencial
En Wayki, abre el proyecto › Configuración › API › Nueva credencial. Elige solo los permisos que necesitas y, si puedes, restringe por IP y pon fecha de expiración. Copia el client secret: no se volverá a mostrar. Si no ves la pestaña API, pide a Wayki que active el módulo de API para tu proyecto.
2. Pide un token
Envía client_id y client_secret con HTTP Basic (recomendado) o en el cuerpo, con grant_type=client_credentials. Opcionalmente pide menos permisos con scope.
3. Llama a la API
Manda el token en la cabecera Authorization: Bearer. Reutilízalo hasta poco antes de expires_in y luego pide otro.
curl -X POST https://api.wayki.app/v1/oauth/token -u 'CLIENT_ID:CLIENT_SECRET' -d grant_type=client_credentials
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "issues:read rfis:read"
}
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6/issues?page=1&limit=50' -H 'Authorization: Bearer ACCESS_TOKEN'
{
"data": [
{ "_id": "66f1…", "issueNumber": 128, "title": "Fisura en losa N3", "statusKey": "open", … }
],
"meta": { "page": 1, "limit": 50, "total": 312, "totalPages": 7 }
}
Node.js (con caché del token)
const BASE = "https://api.wayki.app";
const PROJECT = process.env.WAYKI_PROJECT_ID;
let cached = { token: null, expiresAt: 0 };
async function getToken() {
// Reuse the token until one minute before it expires.
if (cached.token && Date.now() < cached.expiresAt - 60_000) return cached.token;
const basic = Buffer.from(
`${process.env.WAYKI_CLIENT_ID}:${process.env.WAYKI_CLIENT_SECRET}`,
).toString("base64");
const res = await fetch(`${BASE}/v1/oauth/token`, {
method: "POST",
headers: {
Authorization: `Basic ${basic}`,
"Content-Type": "application/x-www-form-urlencoded",
},
body: "grant_type=client_credentials",
});
if (!res.ok) throw new Error(`Token request failed: ${res.status}`);
const body = await res.json();
cached = { token: body.access_token, expiresAt: Date.now() + body.expires_in * 1000 };
return cached.token;
}
async function listAllRfis() {
const all = [];
for (let page = 1; ; page++) {
const res = await fetch(
`${BASE}/v1/projects/${PROJECT}/rfis?page=${page}&limit=100`,
{ headers: { Authorization: `Bearer ${await getToken()}` } },
);
if (!res.ok) throw new Error(`RFIs request failed: ${res.status}`);
const { data, meta } = await res.json();
all.push(...data);
if (page >= meta.totalPages) return all;
}
}
import os, requests
BASE = "https://api.wayki.app"
token = requests.post(
f"{BASE}/v1/oauth/token",
auth=(os.environ["WAYKI_CLIENT_ID"], os.environ["WAYKI_CLIENT_SECRET"]),
data={"grant_type": "client_credentials", "scope": "meetings:read"},
timeout=10,
).json()["access_token"]
meetings = requests.get(
f"{BASE}/v1/projects/{os.environ['WAYKI_PROJECT_ID']}/meetings",
headers={"Authorization": f"Bearer {token}"},
params={"from": "2026-09-01", "to": "2026-09-30"},
timeout=10,
).json()["data"]
- Cambia CLIENT_ID, CLIENT_SECRET y ACCESS_TOKEN por tus valores. Los comandos van en una sola línea y funcionan igual en bash y en PowerShell; en Windows PowerShell 5.1 escribe curl.exe en lugar de curl.
- No hay refresh token: cuando el token expira, vuelve a pedir uno con la credencial.
- El token solo sirve para el proyecto de la credencial. Otro projectId responde 403.
- Revocar la credencial, rotar su secreto, quitarle un permiso o archivar el proyecto corta los tokens vivos al instante.
- El endpoint de tokens admite 10 peticiones por minuto por IP: guarda el token en memoria en vez de pedir uno por llamada.
Referencia
Todas las rutas empiezan por /v1/projects/{projectId}. El OpenAPI descargable describe los mismos endpoints.
Proyecto y miembros
Permiso: project:read · members:readDatos generales del proyecto y la lista de miembros con su rol.
- GET
/v1/projects/{projectId}El proyecto (project:read). - GET
/v1/projects/{projectId}/membersMiembros y roles, sin paginar (members:read).
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6' -H 'Authorization: Bearer ACCESS_TOKEN'
Incidencias
Permiso: issues:readLista paginada, detalle, respuestas y configuración (estados, prioridades, tipos) de incidencias.
- GET
/v1/projects/{projectId}/issuesLista paginada. - GET
/v1/projects/{projectId}/issues/{issueId}Detalle. - GET
/v1/projects/{projectId}/issues/{issueId}/repliesRespuestas, de la más antigua a la más reciente (order=desc invierte). - GET
/v1/projects/{projectId}/issues/settingsConfiguración del módulo: catálogos para interpretar los campos.
Orden permitido: createdAt, updatedAt, number, title, dueDate, priority. from / to filtran por fecha de creación.
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6/issues?limit=50&sort=updatedAt' -H 'Authorization: Bearer ACCESS_TOKEN'
RFIs
Permiso: rfis:readLista paginada, detalle, respuestas y configuración (estados, prioridades, tipos) de RFIs.
- GET
/v1/projects/{projectId}/rfisLista paginada. - GET
/v1/projects/{projectId}/rfis/{rfiId}Detalle. - GET
/v1/projects/{projectId}/rfis/{rfiId}/repliesRespuestas, de la más antigua a la más reciente (order=desc invierte). - GET
/v1/projects/{projectId}/rfis/settingsConfiguración del módulo: catálogos para interpretar los campos.
Orden permitido: createdAt, updatedAt, number, title, dueDate, status, priority. from / to filtran por fecha de creación.
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6/rfis?limit=50&sort=updatedAt' -H 'Authorization: Bearer ACCESS_TOKEN'
Órdenes de cambio
Permiso: change-orders:readLista paginada, detalle, respuestas y configuración (estados, prioridades, tipos) de órdenes de cambio.
- GET
/v1/projects/{projectId}/change-ordersLista paginada. - GET
/v1/projects/{projectId}/change-orders/{changeOrderId}Detalle. - GET
/v1/projects/{projectId}/change-orders/{changeOrderId}/repliesRespuestas, de la más antigua a la más reciente (order=desc invierte). - GET
/v1/projects/{projectId}/change-orders/settingsConfiguración del módulo: catálogos para interpretar los campos.
Orden permitido: createdAt, updatedAt, number, title, dueDate, status, priority. from / to filtran por fecha de creación.
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6/change-orders?limit=50&sort=updatedAt' -H 'Authorization: Bearer ACCESS_TOKEN'
No conformidades
Permiso: non-conformances:readLista paginada, detalle, respuestas y configuración (estados, prioridades, tipos) de no conformidades.
- GET
/v1/projects/{projectId}/non-conformancesLista paginada. - GET
/v1/projects/{projectId}/non-conformances/{nonConformanceId}Detalle. - GET
/v1/projects/{projectId}/non-conformances/{nonConformanceId}/repliesRespuestas, de la más antigua a la más reciente (order=desc invierte). - GET
/v1/projects/{projectId}/non-conformances/settingsConfiguración del módulo: catálogos para interpretar los campos.
Orden permitido: createdAt, updatedAt, number, title, dueDate, status, priority. from / to filtran por fecha de creación.
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6/non-conformances?limit=50&sort=updatedAt' -H 'Authorization: Bearer ACCESS_TOKEN'
Reuniones
Permiso: meetings:readReuniones con agenda, participantes y acuerdos, y las actas congeladas de cada sesión cerrada.
- GET
/v1/projects/{projectId}/meetingsLista paginada. - GET
/v1/projects/{projectId}/meetings/{meetingId}Detalle con acuerdos y participantes. - GET
/v1/projects/{projectId}/meetings/{meetingId}/minutesActas congeladas (una por sesión cerrada). - GET
/v1/projects/{projectId}/meetings/{meetingId}/minutes/{versionId}Un acta. - GET
/v1/projects/{projectId}/meetings/settingsEstados y prioridades de acuerdos.
Orden permitido: startPlannedDate, createdAt, title, number. from / to filtran por fecha planificada de inicio.
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6/meetings?from=2026-09-01&to=2026-09-30' -H 'Authorization: Bearer ACCESS_TOKEN'
Formularios
Permiso: forms:readFormularios llenados (inspecciones, checklists, permisos) y su configuración.
- GET
/v1/projects/{projectId}/formsLista paginada. - GET
/v1/projects/{projectId}/forms/{formId}Detalle. - GET
/v1/projects/{projectId}/forms/settingsEstados, prioridades y tipos.
Orden permitido: createdAt, updatedAt, number, name. from / to filtran por fecha de creación.
curl 'https://api.wayki.app/v1/projects/64b7f0c2e4b0a1b2c3d4e5f6/forms?q=concreto' -H 'Authorization: Bearer ACCESS_TOKEN'