PJT AI
Use CasesBlogPricingDocs
Use CasesBlogPricingDocs
LoginSign Up
  • Introduction
  • Authentication
    • API Key
    • JWT Token
    • Rate Limiting
  • API Usage
    • Usage Stats
    • Daily Usage
    • Account Usage
  • Workspaces
    • List Workspaces
    • Get Workspace
  • Projects
    • List Projects
    • Get Project
    • Create Project
    • Update Project
    • Delete Project
  • Tasks
    • List Tasks
    • List Tasks (Paged)
    • Get Task
    • Create Task
    • Update Task
    • Delete Task
    • My Assigned Tasks
  • Documents
    • List Documents
    • List Documents (Paged)
    • Get Document
    • Create Document
    • Update Document
    • Delete Document
  • Integrations
    • n8n Setup
    • Workflow Examples
  • Error Handling

API Documentation

Use the PJT AI API to manage projects and tasks from external systems, agents, and internal systems.

Base URLhttps://api.pjt.ai

Authentication

PJT AI API supports two authentication methods: API Key and JWT Token.

API Key

API Key is the recommended authentication method for external system integrations. Generate an API Key from your account settings.

1

Go to the API Key section in your account settings.

2

Click the 'Create New API Key' button and enter a name.

3

Store the generated key securely. The full key is only shown at creation time.

Header Format

http
X-API-Key: pk_live_xxxxxxxxxxxx

cURL Example

bash
curl -X GET "https://api.pjt.ai/api/external/v1/workspaces" \
  -H "X-API-Key: pk_live_xxxxxxxxxxxx"

JavaScript Example

typescript
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();

JWT Token

JWT Token is used for user session-based authentication. Include the token issued after login in the Authorization header.

http
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Rate Limiting

API calls are subject to rate limiting. If you exceed the limit, a 429 error will be returned.

Limit TypeLimit Value
Requests per minute60

Rate Limit Exceeded Response

json
{
  "error": "RATE_LIMIT_EXCEEDED",
  "message": "Too many requests. Please try again later."
}

API Usage

Monitor and query API usage per API Key.

Get API Key usage statistics. Returns today's, monthly, and total usage.

Parameters

NameTypeRequiredDescription
idpathYesAPI Key ID

Response

json
{
  "apiKeyId": 1,
  "todayUsage": 150,
  "monthlyUsage": 3420,
  "totalUsage": 12500,
  "today": "2026-01-20",
  "month": "2026-01"
}

Get daily usage history.

Parameters

NameTypeRequiredDescription
idpathYesAPI Key ID
daysqueryNoNumber of days to query (default: 30)

Response

json
{
  "apiKeyId": 1,
  "history": [
    { "date": "2026-01-20", "count": 150 },
    { "date": "2026-01-19", "count": 230 },
    { "date": "2026-01-18", "count": 180 }
  ]
}

Get monthly API usage for the entire account.

Response

json
{
  "accountId": 1,
  "monthlyUsage": [
    { "month": "2026-01", "count": 3420 },
    { "month": "2025-12", "count": 4500 },
    { "month": "2025-11", "count": 3200 }
  ]
}

Workspaces

Get workspace information.

Get a list of workspaces accessible by the current user.

Response

json
{
  "content": [
    {
      "id": 1,
      "name": "My Workspace",
      "description": "Main workspace",
      "createdAt": "2024-01-10T09:00:00Z"
    }
  ],
  "totalElements": 1,
  "totalPages": 1,
  "page": 0,
  "size": 20
}

Get workspace details.

Parameters

NameTypeRequiredDescription
idpathYesdocs.workspaces.params.id

Response

json
{
  "id": 1,
  "name": "My Workspace",
  "description": "Main workspace",
  "members": [...],
  "createdAt": "2024-01-10T09:00:00Z"
}

Projects

Create, read, update, and delete projects.

Get a list of projects in the workspace.

Parameters

NameTypeRequiredDescription
workspaceIdpathYesWorkspace ID
pagequeryNoPage number (starts from 0)
sizequeryNoPage size (default: 20)

Response

json
{
  "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
}

Get project details.

Parameters

NameTypeRequiredDescription
idpathYesProject ID

Response

json
{
  "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"
}

Create a new project.

Request Body

json
{
  "workspaceId": 1,
  "name": "New Project",
  "description": "Project description",
  "startDate": "2024-01-15",
  "endDate": "2024-03-30"
}

Response

json
{
  "id": 1,
  "name": "New Project",
  "description": "Project description",
  "status": "PLANNING",
  "startDate": "2024-01-15",
  "endDate": "2024-03-30",
  "createdAt": "2024-01-10T09:00:00Z"
}

Update project information.

Parameters

NameTypeRequiredDescription
idpathYesProject ID

Request Body

json
{
  "name": "Updated Project Name",
  "status": "IN_PROGRESS"
}

Response

json
{
  "id": 1,
  "name": "Updated Project Name",
  "status": "IN_PROGRESS",
  ...
}

Delete a project.

Parameters

NameTypeRequiredDescription
idpathYesProject ID

Response

json
204 No Content

Tasks

Manage tasks within a project.

Get all tasks in the project (no pagination).

Parameters

NameTypeRequiredDescription
projectIdpathYesProject ID

Response

json
[
  {
    "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" }
  }
]

Get tasks in the project (with pagination).

Parameters

NameTypeRequiredDescription
projectIdpathYesProject ID
pagequeryNoPage number (starts from 0)
sizequeryNoPage size (default: 20)

Response

json
{
  "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
}

Get task details.

Parameters

NameTypeRequiredDescription
idpathYesTask ID

Response

json
{
  "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" }
}

Create a new task.

Request Body

json
{
  "projectId": 1,
  "title": "New Task",
  "description": "Task description",
  "priority": "MEDIUM",
  "dueDate": "2024-01-25",
  "assigneeId": 1
}

Response

json
{
  "id": 2,
  "title": "New Task",
  "description": "Task description",
  "status": "TODO",
  "priority": "MEDIUM",
  "dueDate": "2024-01-25"
}

Update task information.

Parameters

NameTypeRequiredDescription
idpathYesTask ID

Request Body

json
{
  "title": "Updated Task",
  "status": "IN_PROGRESS",
  "priority": "HIGH"
}

Response

json
{
  "id": 1,
  "title": "Updated Task",
  "status": "IN_PROGRESS",
  "priority": "HIGH",
  ...
}

Delete a task.

Parameters

NameTypeRequiredDescription
idpathYesTask ID

Response

json
204 No Content

Get tasks assigned to the current user.

Response

json
[
  {
    "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" }
  }
]

Documents

Manage project documents.

Get all documents in the project (no pagination).

Parameters

NameTypeRequiredDescription
projectIdpathYesProject ID

Response

json
[
  {
    "id": 1,
    "title": "Project Requirements",
    "type": "SPECIFICATION",
    "createdAt": "2024-01-10T09:00:00Z",
    "updatedAt": "2024-01-15T14:30:00Z"
  }
]

Get documents in the project (with pagination).

Parameters

NameTypeRequiredDescription
projectIdpathYesProject ID
pagequeryNoPage number (starts from 0)
sizequeryNoPage size (default: 20)

Response

json
{
  "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
}

Get document details.

Parameters

NameTypeRequiredDescription
idpathYesDocument ID

Response

json
{
  "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"
}

Create a new document.

Request Body

json
{
  "projectId": 1,
  "title": "API Specification",
  "type": "SPECIFICATION",
  "content": "Document content here..."
}

Response

json
{
  "id": 2,
  "title": "API Specification",
  "type": "SPECIFICATION",
  "createdAt": "2024-01-20T10:00:00Z"
}

Update document information.

Parameters

NameTypeRequiredDescription
idpathYesDocument ID

Request Body

json
{
  "title": "Updated Title",
  "content": "Updated content..."
}

Response

json
{
  "id": 1,
  "title": "Updated Title",
  "content": "Updated content...",
  "updatedAt": "2024-01-20T10:00:00Z"
}

Delete a document.

Parameters

NameTypeRequiredDescription
idpathYesDocument ID

Response

json
204 No Content

Integrations

Integrate PJT AI API with external automation tools to automate your workflows.

n8nn8n

n8n Setup

To use PJT AI API in n8n, configure authentication in the HTTP Request node.

1

Add an HTTP Request node to your n8n workflow.

2

Set Authentication to 'Generic Credential Type'.

3

Create a 'Header Auth' credential and enter X-API-Key with your API key.

4

Set the Base URL and call API endpoints.

Credential Configuration

n8n Credential
{
  "name": "PJT AI API",
  "type": "httpHeaderAuth",
  "data": {
    "name": "X-API-Key",
    "value": "pk_live_xxxxxxxxxxxx"
  }
}

Workflow Examples

Workflow automation examples using n8n.

Create Project from Slack Message

Automatically create a new project when a specific keyword is detected in a Slack message.

n8n Workflow
{
  "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" }
          ]
        }
      }
    }
  ]
}

Overdue Task Notifications

Daily check for overdue tasks and send Slack notifications to assignees.

n8n Workflow
{
  "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 }}"
      }
    }
  ]
}

Create Task from GitHub Issue

Automatically create a PJT AI task when a new issue is created in GitHub.

n8n Workflow
{
  "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" }
          ]
        }
      }
    }
  ]
}

Error Handling

The API uses standard HTTP status codes to indicate request success or failure.

Status CodeMeaningThe API uses standard HTTP status codes to indicate request success or failure.
200OKRequest was successful.
201CreatedResource was successfully created.
204No ContentRequest succeeded with no content to return.
400Bad RequestBad request. Check the request format.
401UnauthorizedAuthentication required or credentials are invalid.
403ForbiddenNo permission to access the resource.
404Not FoundRequested resource not found.
429Too Many RequestsRate limit exceeded. Please try again later.
500Internal Server ErrorInternal server error.

Error Response Format

json
{
  "error": {
    "code": "VALIDATION_ERROR",
    "message": "The request body contains invalid data",
    "details": [
      {
        "field": "name",
        "message": "Name is required"
      }
    ]
  }
}
PJT AI

Intelligence that scales with your ambition.

Myelinsoft Inc.

31, Gangnam-daero 92-gil, Gangnam-gu, Seoul, Republic of Korea

6447, 6F

Product

  • Features
  • Use Cases
  • Integrations
  • API

Company

  • About
  • Blog
  • Contact

Legal

  • Privacy Policy
  • Terms of Service
  • Security
  • Compliance

© 2026 PJT AI. All rights reserved.

hello@pjt.ai