Documentación API
Usa la API de PJT AI para gestionar proyectos y tareas desde sistemas externos, agentes y sistemas internos.
https://api.pjt.aiAutenticación
La API de PJT AI admite dos métodos de autenticación: Clave API y Token JWT.
Clave API
La Clave API es el método de autenticación recomendado para integraciones de sistemas externos. Genera una Clave API desde la configuración de tu cuenta.
Ve a la sección de Claves API en la configuración de tu cuenta.
Haz clic en el botón 'Crear nueva Clave API' e ingresa un nombre.
Guarda la clave generada de forma segura. La clave completa solo se muestra en el momento de la creación.
Formato del encabezado
X-API-Key: pk_live_xxxxxxxxxxxxEjemplo cURL
curl -X GET "https://api.pjt.ai/api/external/v1/workspaces" \
-H "X-API-Key: pk_live_xxxxxxxxxxxx"Ejemplo JavaScript
const response = await fetch('https://api.pjt.ai/api/external/v1/workspaces', {
method: 'GET',
headers: {
'X-API-Key': 'pk_live_xxxxxxxxxxxx',
'Content-Type': 'application/json',
},
});
const workspaces = await response.json();Token JWT
El Token JWT se usa para autenticación basada en sesión de usuario. Incluye el token emitido después del inicio de sesión en el encabezado Authorization.
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...docs.sections.rateLimiting
docs.auth.rateLimitDescription
| docs.auth.rateLimitType | docs.auth.rateLimitValue |
|---|---|
| docs.auth.rateLimitPerMinute | 60 |
docs.auth.rateLimitExceeded
{
"error": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again later."
}docs.sections.apiUsage
docs.apiUsage.description
docs.apiUsage.stats.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.apiUsage.params.apiKeyId |
Respuesta
{
"apiKeyId": 1,
"todayUsage": 150,
"monthlyUsage": 3420,
"totalUsage": 12500,
"today": "2026-01-20",
"month": "2026-01"
}docs.apiUsage.history.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.apiUsage.params.apiKeyId |
days | query | No | docs.apiUsage.params.days |
Respuesta
{
"apiKeyId": 1,
"history": [
{ "date": "2026-01-20", "count": 150 },
{ "date": "2026-01-19", "count": 230 },
{ "date": "2026-01-18", "count": 180 }
]
}docs.apiUsage.account.description
Respuesta
{
"accountId": 1,
"monthlyUsage": [
{ "month": "2026-01", "count": 3420 },
{ "month": "2025-12", "count": 4500 },
{ "month": "2025-11", "count": 3200 }
]
}docs.sections.workspaces
docs.workspaces.description
docs.workspaces.list.description
Respuesta
{
"content": [
{
"id": 1,
"name": "My Workspace",
"description": "Main workspace",
"createdAt": "2024-01-10T09:00:00Z"
}
],
"totalElements": 1,
"totalPages": 1,
"page": 0,
"size": 20
}docs.workspaces.get.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.workspaces.params.id |
Respuesta
{
"id": 1,
"name": "My Workspace",
"description": "Main workspace",
"members": [...],
"createdAt": "2024-01-10T09:00:00Z"
}Proyectos
Crear, leer, actualizar y eliminar proyectos.
Obtiene una lista de proyectos en el espacio de trabajo.
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
workspaceId | path | Sí | ID del espacio de trabajo |
page | query | No | Número de página (comienza desde 0) |
size | query | No | Tamaño de página (predeterminado: 20) |
Respuesta
{
"content": [
{
"id": 1,
"name": "Website Redesign",
"description": "Complete website overhaul",
"status": "IN_PROGRESS",
"startDate": "2024-01-15",
"endDate": "2024-03-30",
"createdAt": "2024-01-10T09:00:00Z"
}
],
"totalElements": 1,
"totalPages": 1,
"page": 0,
"size": 20
}Obtiene los detalles del proyecto.
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | ID del proyecto |
Respuesta
{
"id": 1,
"name": "Website Redesign",
"description": "Complete website overhaul",
"status": "IN_PROGRESS",
"startDate": "2024-01-15",
"endDate": "2024-03-30",
"tasks": [...],
"createdAt": "2024-01-10T09:00:00Z"
}Crea un nuevo proyecto.
Cuerpo de solicitud
{
"workspaceId": 1,
"name": "New Project",
"description": "Project description",
"startDate": "2024-01-15",
"endDate": "2024-03-30"
}Respuesta
{
"id": 1,
"name": "New Project",
"description": "Project description",
"status": "PLANNING",
"startDate": "2024-01-15",
"endDate": "2024-03-30",
"createdAt": "2024-01-10T09:00:00Z"
}Actualiza la información del proyecto.
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | ID del proyecto |
Cuerpo de solicitud
{
"name": "Updated Project Name",
"status": "IN_PROGRESS"
}Respuesta
{
"id": 1,
"name": "Updated Project Name",
"status": "IN_PROGRESS",
...
}Elimina un proyecto.
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | ID del proyecto |
Respuesta
204 No ContentTareas
Gestiona tareas dentro de un proyecto.
Obtiene una lista de tareas en el proyecto.
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
projectId | path | Sí | ID del proyecto |
Respuesta
[
{
"id": 1,
"title": "Design mockups",
"description": "Create initial design mockups",
"status": "IN_PROGRESS",
"priority": "HIGH",
"dueDate": "2024-01-20",
"assignee": { "id": 1, "name": "John Doe" }
}
]docs.tasks.paged.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
projectId | path | Sí | ID del proyecto |
page | query | No | Número de página (comienza desde 0) |
size | query | No | Tamaño de página (predeterminado: 20) |
Respuesta
{
"content": [
{
"id": 1,
"title": "Design mockups",
"description": "Create initial design mockups",
"status": "IN_PROGRESS",
"priority": "HIGH",
"dueDate": "2024-01-20"
}
],
"totalElements": 1,
"totalPages": 1,
"page": 0,
"size": 20
}docs.tasks.get.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.tasks.params.taskId |
Respuesta
{
"id": 1,
"title": "Design mockups",
"description": "Create initial design mockups",
"status": "IN_PROGRESS",
"priority": "HIGH",
"dueDate": "2024-01-20",
"assignee": { "id": 1, "name": "John Doe" },
"project": { "id": 1, "name": "Website Redesign" }
}Crea una nueva tarea.
Cuerpo de solicitud
{
"projectId": 1,
"title": "New Task",
"description": "Task description",
"priority": "MEDIUM",
"dueDate": "2024-01-25",
"assigneeId": 1
}Respuesta
{
"id": 2,
"title": "New Task",
"description": "Task description",
"status": "TODO",
"priority": "MEDIUM",
"dueDate": "2024-01-25"
}docs.tasks.update.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.tasks.params.taskId |
Cuerpo de solicitud
{
"title": "Updated Task",
"status": "IN_PROGRESS",
"priority": "HIGH"
}Respuesta
{
"id": 1,
"title": "Updated Task",
"status": "IN_PROGRESS",
"priority": "HIGH",
...
}docs.tasks.delete.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.tasks.params.taskId |
Respuesta
204 No Contentdocs.tasks.assigned.description
Respuesta
[
{
"id": 1,
"title": "Design mockups",
"description": "Create initial design mockups",
"status": "IN_PROGRESS",
"priority": "HIGH",
"dueDate": "2024-01-20",
"project": { "id": 1, "name": "Website Redesign" }
}
]Documentos
Gestiona documentos del proyecto.
Obtiene una lista de documentos en el proyecto.
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
projectId | path | Sí | ID del proyecto |
Respuesta
[
{
"id": 1,
"title": "Project Requirements",
"type": "SPECIFICATION",
"createdAt": "2024-01-10T09:00:00Z",
"updatedAt": "2024-01-15T14:30:00Z"
}
]docs.documents.paged.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
projectId | path | Sí | ID del proyecto |
page | query | No | Número de página (comienza desde 0) |
size | query | No | Tamaño de página (predeterminado: 20) |
Respuesta
{
"content": [
{
"id": 1,
"title": "Project Requirements",
"type": "SPECIFICATION",
"createdAt": "2024-01-10T09:00:00Z",
"updatedAt": "2024-01-15T14:30:00Z"
}
],
"totalElements": 1,
"totalPages": 1,
"page": 0,
"size": 20
}docs.documents.get.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.documents.params.documentId |
Respuesta
{
"id": 1,
"title": "Project Requirements",
"type": "SPECIFICATION",
"content": "Document content here...",
"project": { "id": 1, "name": "Website Redesign" },
"createdAt": "2024-01-10T09:00:00Z",
"updatedAt": "2024-01-15T14:30:00Z"
}Crea un nuevo documento.
Cuerpo de solicitud
{
"projectId": 1,
"title": "API Specification",
"type": "SPECIFICATION",
"content": "Document content here..."
}Respuesta
{
"id": 2,
"title": "API Specification",
"type": "SPECIFICATION",
"createdAt": "2024-01-20T10:00:00Z"
}docs.documents.update.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.documents.params.documentId |
Cuerpo de solicitud
{
"title": "Updated Title",
"content": "Updated content..."
}Respuesta
{
"id": 1,
"title": "Updated Title",
"content": "Updated content...",
"updatedAt": "2024-01-20T10:00:00Z"
}docs.documents.delete.description
Parámetros
| Nombre | Tipo | Requerido | Descripción |
|---|---|---|---|
id | path | Sí | docs.documents.params.documentId |
Respuesta
204 No ContentIntegraciones
Integra la API de PJT AI con herramientas de automatización externas para automatizar tus flujos de trabajo.
Configuración de n8n
Para usar la API de PJT AI en n8n, configura la autenticación en el nodo HTTP Request.
Agrega un nodo HTTP Request a tu flujo de trabajo de n8n.
Configura la autenticación como 'Generic Credential Type'.
Crea una credencial 'Header Auth' e ingresa X-API-Key con tu clave API.
Configura la URL base y llama a los endpoints de la API.
Configuración de credenciales
{
"name": "PJT AI API",
"type": "httpHeaderAuth",
"data": {
"name": "X-API-Key",
"value": "pk_live_xxxxxxxxxxxx"
}
}Ejemplos de flujos de trabajo
Ejemplos de automatización de flujos de trabajo usando n8n.
Crear proyecto desde mensaje de Slack
Crea automáticamente un nuevo proyecto cuando se detecta una palabra clave específica en un mensaje de Slack.
{
"nodes": [
{
"name": "Slack Trigger",
"type": "n8n-nodes-base.slackTrigger",
"parameters": {
"channel": "#project-requests"
}
},
{
"name": "Create Project",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://api.pjt.ai/api/external/v1/projects",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{ "name": "Content-Type", "value": "application/json" }
]
},
"sendBody": true,
"bodyParameters": {
"parameters": [
{ "name": "workspaceId", "value": "1" },
{ "name": "name", "value": "={{ $json.text }}" },
{ "name": "description", "value": "Created from Slack" }
]
}
}
}
]
}Notificaciones de tareas vencidas
Verifica diariamente las tareas vencidas y envía notificaciones de Slack a los responsables.
{
"nodes": [
{
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"parameters": {
"rule": { "interval": [{ "field": "hours", "hoursInterval": 1 }] }
}
},
{
"name": "Get Tasks",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "GET",
"url": "https://api.pjt.ai/api/external/v1/projects/{{projectId}}/tasks",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"qs": { "status": "IN_PROGRESS" }
}
},
{
"name": "Filter Overdue",
"type": "n8n-nodes-base.filter",
"parameters": {
"conditions": {
"dateTime": [{
"value1": "={{ $json.dueDate }}",
"operation": "before",
"value2": "={{ $now }}"
}]
}
}
},
{
"name": "Send Notification",
"type": "n8n-nodes-base.slack",
"parameters": {
"channel": "#alerts",
"text": "Overdue task: {{ $json.title }}"
}
}
]
}Crear tarea desde issue de GitHub
Crea automáticamente una tarea en PJT AI cuando se crea un nuevo issue en GitHub.
{
"nodes": [
{
"name": "Webhook",
"type": "n8n-nodes-base.webhook",
"parameters": {
"path": "github-issue",
"httpMethod": "POST"
}
},
{
"name": "Create Task",
"type": "n8n-nodes-base.httpRequest",
"parameters": {
"method": "POST",
"url": "https://api.pjt.ai/api/external/v1/projects/{{projectId}}/tasks",
"authentication": "predefinedCredentialType",
"nodeCredentialType": "httpHeaderAuth",
"sendBody": true,
"bodyParameters": {
"parameters": [
{ "name": "title", "value": "={{ $json.issue.title }}" },
{ "name": "description", "value": "={{ $json.issue.body }}" },
{ "name": "priority", "value": "MEDIUM" }
]
}
}
}
]
}Manejo de errores
La API usa códigos de estado HTTP estándar para indicar el éxito o fracaso de la solicitud.
| Código de estado | Significado | La API usa códigos de estado HTTP estándar para indicar el éxito o fracaso de la solicitud. |
|---|---|---|
200 | OK | Solicitud exitosa. |
201 | Created | Recurso creado exitosamente. |
204 | No Content | Solicitud exitosa sin contenido para devolver. |
400 | Bad Request | Solicitud incorrecta. Verifica el formato de la solicitud. |
401 | Unauthorized | Autenticación requerida o credenciales inválidas. |
403 | Forbidden | Sin permiso para acceder al recurso. |
404 | Not Found | Recurso solicitado no encontrado. |
429 | Too Many Requests | Límite de tasa excedido. Por favor, intenta más tarde. |
500 | Internal Server Error | Error interno del servidor. |
Formato de respuesta de error
{
"error": {
"code": "VALIDATION_ERROR",
"message": "The request body contains invalid data",
"details": [
{
"field": "name",
"message": "Name is required"
}
]
}
}