API 문서
PJT AI API를 사용하여 외부 시스템, 에이전트, 사내 시스템에서 프로젝트와 태스크를 관리하세요.
https://api.pjt.ai인증
PJT AI API는 두 가지 인증 방식을 지원합니다: API Key와 JWT Token.
API Key
API Key는 외부 시스템 연동에 적합한 인증 방식입니다. 계정 설정에서 API Key를 발급받아 사용하세요.
계정 설정 페이지에서 API Key 섹션으로 이동합니다.
새 API Key 생성 버튼을 클릭하고 이름을 입력합니다.
생성된 키를 안전하게 보관합니다. 키는 생성 시에만 전체가 표시됩니다.
헤더 형식
X-API-Key: pk_live_xxxxxxxxxxxxcURL 예제
curl -X GET "https://api.pjt.ai/api/external/v1/workspaces" \
-H "X-API-Key: pk_live_xxxxxxxxxxxx"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();JWT Token
JWT Token은 사용자 세션 기반 인증에 사용됩니다. 로그인 후 발급된 토큰을 Authorization 헤더에 포함하세요.
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...Rate Limiting
API 호출은 Rate Limiting이 적용됩니다. 제한을 초과하면 429 에러가 반환됩니다.
| 제한 유형 | 제한 값 |
|---|---|
| 분당 요청 수 | 60 |
Rate Limit 초과 시 응답
{
"error": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please try again later."
}API 사용량
API Key별 사용량을 조회하고 모니터링할 수 있습니다.
API Key의 사용량 통계를 조회합니다. 오늘, 이번 달, 전체 사용량을 반환합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | API Key ID |
응답
{
"apiKeyId": 1,
"todayUsage": 150,
"monthlyUsage": 3420,
"totalUsage": 12500,
"today": "2026-01-20",
"month": "2026-01"
}일별 사용량 히스토리를 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | API Key ID |
days | query | 아니오 | 조회 일수 (기본값: 30) |
응답
{
"apiKeyId": 1,
"history": [
{ "date": "2026-01-20", "count": 150 },
{ "date": "2026-01-19", "count": 230 },
{ "date": "2026-01-18", "count": 180 }
]
}계정의 월별 전체 API 사용량을 조회합니다.
응답
{
"accountId": 1,
"monthlyUsage": [
{ "month": "2026-01", "count": 3420 },
{ "month": "2025-12", "count": 4500 },
{ "month": "2025-11", "count": 3200 }
]
}워크스페이스
내 워크스페이스 목록을 조회하고 상세 정보를 확인할 수 있습니다.
내 워크스페이스 목록을 조회합니다.
응답
{
"content": [
{
"id": 1,
"name": "My Workspace",
"description": "Main workspace",
"createdAt": "2024-01-10T09:00:00Z"
}
],
"totalElements": 1,
"totalPages": 1,
"page": 0,
"size": 20
}워크스페이스 상세 정보를 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 워크스페이스 ID |
응답
{
"id": 1,
"name": "My Workspace",
"description": "Main workspace",
"members": [...],
"createdAt": "2024-01-10T09:00:00Z"
}프로젝트
프로젝트를 생성, 조회, 수정, 삭제할 수 있습니다.
워크스페이스의 프로젝트 목록을 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
workspaceId | path | 예 | 워크스페이스 ID |
page | query | 아니오 | 페이지 번호 (0부터 시작) |
size | query | 아니오 | 페이지 크기 (기본값: 20) |
응답
{
"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
}프로젝트 상세 정보를 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 프로젝트 ID |
응답
{
"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"
}새 프로젝트를 생성합니다.
요청 본문
{
"workspaceId": 1,
"name": "New Project",
"description": "Project description",
"startDate": "2024-01-15",
"endDate": "2024-03-30"
}응답
{
"id": 1,
"name": "New Project",
"description": "Project description",
"status": "PLANNING",
"startDate": "2024-01-15",
"endDate": "2024-03-30",
"createdAt": "2024-01-10T09:00:00Z"
}프로젝트 정보를 수정합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 프로젝트 ID |
요청 본문
{
"name": "Updated Project Name",
"status": "IN_PROGRESS"
}응답
{
"id": 1,
"name": "Updated Project Name",
"status": "IN_PROGRESS",
...
}프로젝트를 삭제합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 프로젝트 ID |
응답
204 No Content태스크
프로젝트 내 태스크를 관리합니다.
프로젝트의 태스크 목록을 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
projectId | path | 예 | 프로젝트 ID |
응답
[
{
"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" }
}
]프로젝트의 태스크 목록을 페이징하여 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
projectId | path | 예 | 프로젝트 ID |
page | query | 아니오 | 페이지 번호 (0부터 시작) |
size | query | 아니오 | 페이지 크기 (기본값: 20) |
응답
{
"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
}태스크 상세 정보를 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 태스크 ID |
응답
{
"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" }
}새 태스크를 생성합니다.
요청 본문
{
"projectId": 1,
"title": "New Task",
"description": "Task description",
"priority": "MEDIUM",
"dueDate": "2024-01-25",
"assigneeId": 1
}응답
{
"id": 2,
"title": "New Task",
"description": "Task description",
"status": "TODO",
"priority": "MEDIUM",
"dueDate": "2024-01-25"
}태스크 정보를 수정합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 태스크 ID |
요청 본문
{
"title": "Updated Task",
"status": "IN_PROGRESS",
"priority": "HIGH"
}응답
{
"id": 1,
"title": "Updated Task",
"status": "IN_PROGRESS",
"priority": "HIGH",
...
}태스크를 삭제합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 태스크 ID |
응답
204 No Content내게 할당된 태스크 목록을 조회합니다.
응답
[
{
"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" }
}
]문서
프로젝트 문서를 관리합니다.
프로젝트의 문서 목록을 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
projectId | path | 예 | 프로젝트 ID |
응답
[
{
"id": 1,
"title": "Project Requirements",
"type": "SPECIFICATION",
"createdAt": "2024-01-10T09:00:00Z",
"updatedAt": "2024-01-15T14:30:00Z"
}
]프로젝트의 문서 목록을 페이징하여 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
projectId | path | 예 | 프로젝트 ID |
page | query | 아니오 | 페이지 번호 (0부터 시작) |
size | query | 아니오 | 페이지 크기 (기본값: 20) |
응답
{
"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
}문서 상세 정보를 조회합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 문서 ID |
응답
{
"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"
}새 문서를 생성합니다.
요청 본문
{
"projectId": 1,
"title": "API Specification",
"type": "SPECIFICATION",
"content": "Document content here..."
}응답
{
"id": 2,
"title": "API Specification",
"type": "SPECIFICATION",
"createdAt": "2024-01-20T10:00:00Z"
}문서 정보를 수정합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 문서 ID |
요청 본문
{
"title": "Updated Title",
"content": "Updated content..."
}응답
{
"id": 1,
"title": "Updated Title",
"content": "Updated content...",
"updatedAt": "2024-01-20T10:00:00Z"
}문서를 삭제합니다.
파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | path | 예 | 문서 ID |
응답
204 No Content외부 연동
PJT AI API를 외부 자동화 도구와 연동하여 워크플로우를 자동화할 수 있습니다.
n8n 설정
n8n에서 PJT AI API를 사용하려면 HTTP Request 노드에 인증 정보를 설정하세요.
n8n 워크플로우에 HTTP Request 노드를 추가합니다.
Authentication을 'Generic Credential Type'으로 설정합니다.
'Header Auth' credential을 생성하고 X-API-Key와 API 키를 입력합니다.
Base URL을 설정하고 API 엔드포인트를 호출합니다.
Credential 설정
{
"name": "PJT AI API",
"type": "httpHeaderAuth",
"data": {
"name": "X-API-Key",
"value": "pk_live_xxxxxxxxxxxx"
}
}워크플로우 예제
n8n을 활용한 워크플로우 자동화 예제입니다.
Slack 메시지로 프로젝트 생성
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" }
]
}
}
}
]
}기한 초과 태스크 알림
매일 기한이 지난 태스크를 조회하여 담당자에게 Slack 알림을 보냅니다.
{
"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 }}"
}
}
]
}GitHub 이슈로 태스크 생성
GitHub에 새 이슈가 등록되면 자동으로 PJT AI 태스크를 생성합니다.
{
"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" }
]
}
}
}
]
}에러 처리
API는 표준 HTTP 상태 코드를 사용하여 요청 성공 또는 실패를 나타냅니다.
| 상태 코드 | 의미 | API는 표준 HTTP 상태 코드를 사용하여 요청 성공 또는 실패를 나타냅니다. |
|---|---|---|
200 | OK | 요청이 성공적으로 처리되었습니다. |
201 | Created | 리소스가 성공적으로 생성되었습니다. |
204 | No Content | 요청이 성공했으며 반환할 콘텐츠가 없습니다. |
400 | Bad Request | 잘못된 요청입니다. 요청 형식을 확인하세요. |
401 | Unauthorized | 인증이 필요하거나 인증 정보가 올바르지 않습니다. |
403 | Forbidden | 해당 리소스에 대한 접근 권한이 없습니다. |
404 | Not Found | 요청한 리소스를 찾을 수 없습니다. |
429 | Too Many Requests | 요청 한도를 초과했습니다. 잠시 후 다시 시도하세요. |
500 | Internal Server Error | 서버 내부 오류가 발생했습니다. |
에러 응답 형식
{
"error": {
"code": "VALIDATION_ERROR",
"message": "The request body contains invalid data",
"details": [
{
"field": "name",
"message": "Name is required"
}
]
}
}