Saltar al contenido

API v1 · contract-first

Documentación de la API de Projekt Republic

Automatiza proyectos, tareas y finanzas desde tus scripts, SDKs e integraciones. REST sobre HTTPS, JSON en cuerpo y respuesta, autenticación con Personal Access Tokens (pjk_live_…) y un contrato OpenAPI que es la fuente de verdad.

Overview

La API de Projekt Republic es REST, habla JSON y es multi-tenant: cada recurso pertenece a una organización. Todo el dominio del producto vive bajo el prefijo de versión /api/v1; /health y /ready quedan fuera (son de infraestructura, no de producto).

Base URL

https://projekt.3xa.es/api/v1

Versionado

Prefijo fijo /api/v1. Los cambios en v1 son siempre aditivos y compatibles; una v2 nacería con un plan de migración explícito.

Contract-first: el contrato se declara en el backend y se materializa como un documento OpenAPI; ese documento alimenta la referencia interactiva de esta página y los SDKs generados. Ningún endpoint existe si no está en el contrato.

Quickstart

1. Consigue un token. Un owner o admin de la organización crea un Personal Access Token en Ajustes → API keys. El token (pjk_live_…) se muestra una sola vez: cópialo y guárdalo en un gestor de secretos.

2. Haz tu primera llamada. Envía el token en la cabecera Authorization. Por ejemplo, para leer tu propio perfil:

bash
curl https://projekt.3xa.es/api/v1/me \
  -H "Authorization: Bearer pjk_live_xxxxxxxxxxxxxxxxxxxx"

3. Recorre tus organizaciones. La mayoría de recursos cuelgan de una organización ({org_id} en la ruta). Lista los proyectos de una:

bash
curl https://projekt.3xa.es/api/v1/organizations/{org_id}/projects \
  -H "Authorization: Bearer pjk_live_xxxxxxxxxxxxxxxxxxxx"

Todas las respuestas incluyen la cabecera X-Request-ID, útil para correlacionar con soporte si algo falla.

Autenticación

La API se autentica con Personal Access Tokens (PAT) de tipo bearer. La sesión del navegador usa cookies HttpOnly; los PATs son el mecanismo para scripts, SDKs e integraciones automatizadas.

header
Authorization: Bearer pjk_live_xxxxxxxxxxxxxxxxxxxx

Alcance del token

Un PAT se emite dentro de una organización y solo alcanza los recursos de esa organización. La pertenencia se resuelve en el servidor a partir del {org_id} de la ruta: nunca se confía en un identificador de organización enviado por el cliente. Quien no es miembro recibe 404 (no se filtra la existencia del recurso). Crear y revocar keys requiere rol owner o admin.

Buenas prácticas

  • El token se muestra una vez al crearlo; en la base de datos solo se guarda su hash. No podrás recuperarlo después.
  • Guárdalo en un gestor de secretos o variable de entorno; nunca lo commitees.
  • Revócalo de inmediato desde Ajustes → API keys si se filtra.
  • Usa un token distinto por integración para poder revocarlos por separado.
  • Envíalo siempre sobre HTTPS.

Errores

Toda respuesta no-2xx usa el mismo envelope. El campo request_id coincide con la cabecera X-Request-ID y ayuda a rastrear el fallo en los logs.

json
{
  "error": {
    "code": "not_found",
    "message": "Resource not found",
    "request_id": "b3f1c2a4-..."
  }
}

Los errores de validación de entrada devuelven 422 con code: "validation_error"; el message enumera los campos inválidos en formato campo: motivo:

json
{
  "error": {
    "code": "validation_error",
    "message": "body.email: value is not a valid email address; body.name: field required",
    "request_id": "b3f1c2a4-..."
  }
}
401unauthorizedToken ausente, inválido o caducado.
403forbiddenAutenticado pero sin permisos para la acción.
404not_foundEl recurso no existe o no eres miembro de su organización.
409conflictConflicto de estado (p. ej. un valor único duplicado).
422validation_errorEl cuerpo o los parámetros no pasan validación.
429too_many_requestsSe superó el rate limit; reintenta más tarde.

Rate limits

Los endpoints sensibles —principalmente los de autenticación— están limitados por IP de origen y por cuenta mediante una ventana fija. Al superar el cupo, la API responde 429 con el envelope estándar (code: "too_many_requests").

El límite es fail-open: si el backend de límites no está disponible, la petición no se bloquea — prevalece la disponibilidad. Diseña tus clientes para reintentar con backoff exponencial ante un 429 y evita ráfagas innecesarias.

Conectar paso a paso

De cero a integrado en tres pasos: emite una key, llama al API con ella y, si trabajas con un asistente, engánchalo por MCP. Cada paso enlaza a la sección con el detalle completo.

  1. 1

    Crea un Personal Access Token

    Un owner o admin genera la key en Ajustes → API keys. El token pjk_live_… se muestra una sola vez y solo alcanza los recursos de esa organización.

    Autenticación
  2. 2

    Llama a /api/v1 con Bearer

    Envía el token en la cabecera Authorization: Bearer. Valida con /me y sigue por las rutas de tu organización; toda respuesta trae X-Request-ID.

    Quickstart
  3. 3

    Conecta tu IA por MCP

    Añade https://projekt.3xa.es/mcp como conector: el cliente abre el flujo OAuth y hereda tus permisos reales. Si no soporta OAuth, el mismo PAT en la cabecera.

    MCP — conecta tu IA

Referencia API

El catálogo completo de endpoints, esquemas, parámetros y respuestas se renderiza a continuación directamente desde el contrato OpenAPI en vivo. Cada operación muestra el candado de autenticación (bearer PAT) que exige la API. No existe ninguna lista manual que pueda quedarse obsoleta: el contrato es la documentación.

¿Prefieres las herramientas nativas de FastAPI? Abre Swagger UI o el openapi.json crudo.

MCP — conecta tu IA

La forma más rápida de darle Projekt Republic a tu asistente: un servidor MCP remoto ya alojado. Una única URL a la que Claude —o cualquier cliente Model Context Protocol— se conecta por Streamable HTTP. No hay nada que instalar ni alojar: al conectar se abre un flujo OAuth con tu cuenta de Projekt Republic y el acceso queda ligado a tus permisos reales.

Endpoint remoto

https://projekt.3xa.es/mcp

Transporte Streamable HTTP. Autenticación: OAuth automático al conectar (el cliente descubre el flujo y abre el navegador), o un PAT en la cabecera Authorization: Bearer pjk_live_… si prefieres no usar OAuth.

claude.ai (web / desktop)

  1. Abre Ajustes → Conectores.
  2. Pulsa «Añadir conector personalizado» y pega la URL https://projekt.3xa.es/mcp.
  3. Al conectar se abre el login OAuth: entra con tu cuenta Projekt Republic y pulsa Permitir.

Claude Code

bash
claude mcp add --transport http projekt https://projekt.3xa.es/mcp

Claude Desktop y cualquier cliente MCP

Cualquier cliente compatible con MCP sobre Streamable HTTP solo necesita la URL. En una configuración JSON (p. ej. claude_desktop_config.json o .mcp.json):

json
{
  "mcpServers": {
    "projekt": {
      "type": "http",
      "url": "https://projekt.3xa.es/mcp"
    }
  }
}

Si tu cliente no soporta el flujo OAuth, usa un PAT como alternativa: añade "headers": { "Authorization": "Bearer pjk_live_…" } a esa entrada (cómo crear el token, en Autenticación).

Qué puede hacer

ProyectosListar y consultar los proyectos de tus organizaciones.
TareasCrear, actualizar, comentar y mover tareas.
SprintsPlanificar sprints y seguir su progreso.
TiempoRegistrar y consultar tiempo trabajado.
DocumentosLeer y escribir la documentación de proyecto.
BúsquedaBúsqueda global sobre el contenido de tu organización.

Fuera de alcance

Finanzas, nóminas y RRHH quedan fuera por diseño: el MCP no expone esas superficies aunque tu rol tenga acceso a ellas en la app.

MCP local (stdio) — servidor autoalojado

El Projekt Republic MCP Server expone la API REST como un servidor Model Context Protocol (MCP), el protocolo estándar para que un LLM lea y mute datos de herramientas externas de forma segura. Claude Desktop, Claude Code y cualquier cliente MCP compatible pueden conectarse a él con un pjk_live_… PAT y empezar a trabajar sobre proyectos, tareas y miembros del equipo sin procesar HTML ni scrapers.

Transporte

stdio — el cliente lanza el proceso como un subcomando local y se comunica por stdin/stdout. No hay servidor HTTP que exponer ni puertos que abrir. Si prefieres no ejecutar nada en tu máquina, usa el endpoint remoto de la sección anterior.

Superficie de seguridad

Solo se exponen herramientas de lectura y escritura segura. No existe ninguna herramienta de borrado, administración, finanzas, nóminas ni RRHH en v1. El token hereda el rol del usuario en la organización; el org-scoping lo valida el servidor.

Variables de entorno

PROJEKT_API_TOKENreq.Tu PAT pjk_live_… Se envía como Authorization: Bearer.
PROJEKT_API_URLopt.Base URL del API v1. Por defecto: https://projekt.3xa.es/api/v1
PROJEKT_ORG_IDopt.Organización por defecto para las herramientas que la necesitan (evita pasarla en cada llamada).

Configuración del cliente (Claude Desktop / Claude Code)

Añade esta entrada a tu claude_desktop_config.json (Claude Desktop) o a tu .mcp.json (Claude Code) apuntando al servidor compilado:

json
{
  "mcpServers": {
    "projekt": {
      "command": "node",
      "args": ["/RUTA/ABSOLUTA/apps/mcp/dist/index.js"],
      "env": {
        "PROJEKT_API_TOKEN": "pjk_live_tu_token",
        "PROJEKT_API_URL": "https://projekt.3xa.es/api/v1",
        "PROJEKT_ORG_ID": "tu-uuid-de-org"
      }
    }
  }
}

Alternativamente, desde la raíz del repositorio con Claude Code CLI:

bash
claude mcp add projekt \
  --env PROJEKT_API_TOKEN=pjk_live_tu_token \
  -- node "$(pwd)/apps/mcp/dist/index.js"

Catálogo de herramientas

El servidor expone 11 herramientas. Projekt Republic llama “tasks” a las issues; list_issues y list_tasks son el mismo endpoint (alias de conveniencia).

whoamiUsuario autenticado (id / email / nombre). Confirma que el token funciona.
list_organizationsOrganizaciones a las que perteneces (id, nombre, slug, rol, contadores).
list_membersMiembros de una organización (user_id, nombre, email, rol). Útil para resolver assignees.
list_projectsProyectos de una organización (id, key, nombre, estado).
get_projectDetalle de un proyecto por id.
list_issues / list_tasksTareas de un proyecto paginadas por limit/offset.
list_my_workTus tareas asignadas en todos los proyectos, con filtro de estado y overdue.
create_issueCrea una tarea (estado inicial todo, sin asignar). Asigna luego con update_issue.
update_issueActualiza estado, assignee y campos de una tarea (PATCH parcial).
add_commentComenta en una tarea. El campo del texto es body.

Dominio del modelo

  • Estado de tarea: todo · in_progress · done · cancelled.
  • Prioridad: low · medium · high · urgent.
  • Tipo: epic · story · task · bug · spike · chore.
  • Las tareas se crean sin asignar (todo); usa update_issue con el user_id de list_members para asignar.
  • El MCP reintenta una vez ante 429/503 con backoff y agota en 30 s.

Projects belong to the people.

© 2026 Projekt Republic · 3XA ECOM LLC. Todos los derechos reservados.