엔드포인트 레퍼런스
전체 API 엔드포인트 목록 및 사용법
목차
- 프로젝트
- GET /api/v1/projects
- 이슈
- GET /api/v1/projects/:projectId/issues
- GET /api/v1/projects/:projectId/issues/:issueNumber
- PATCH /api/v1/projects/:projectId/issues/:issueNumber
- 코멘트
- GET /api/v1/projects/:projectId/issues/:issueNumber/comments
- POST /api/v1/projects/:projectId/issues/:issueNumber/comments
- 이슈 메타데이터
- GET /api/v1/projects/:projectId/issues/:issueNumber/console-logs
- GET /api/v1/projects/:projectId/issues/:issueNumber/network-logs
- GET /api/v1/projects/:projectId/issues/:issueNumber/screenshots
- GET /api/v1/projects/:projectId/issues/:issueNumber/tech-context
- GET /api/v1/projects/:projectId/issues/:issueNumber/user-actions
엔드포인트 레퍼런스
모든 엔드포인트의 Base URL은 https://qanote.app 입니다.
프로젝트
GET /api/v1/projects
접근 가능한 프로젝트 목록을 조회합니다.
- OAuth 토큰: 사용자가 속한 모든 active 조직의 프로젝트를 반환합니다.
- API Key 토큰: 키가 발급된 단일 조직의 프로젝트만 반환합니다.
필요 Scope: projects:read
Query 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| organizationSlug | string | No | 특정 조직 slug 로 필터 — /dashboard/<slug>/... 경로의 slug 와 동일 |
| organizationId | string (uuid) | No | 특정 조직 ID 로 필터 (organizationSlug 와 택일) |
응답
{
"data": [
{
"id": "project_abc123",
"name": "웹 서비스",
"slug": "web-service",
"description": "메인 웹 서비스 프로젝트",
"organizationId": "2a3f7b04-6e91-4c2d-9f77-3d6c9a1e4b58",
"organizationSlug": "acme",
"organizationName": "Acme Inc.",
"createdAt": "2025-01-15T09:00:00.000Z"
}
],
"total": 1
}
각 프로젝트에는 소속 조직 식별자 3종이 포함됩니다.
| 필드 | 타입 | 설명 |
|---|---|---|
organizationId | string (uuid) | 프로젝트가 속한 조직 ID |
organizationSlug | string | 조직 slug — URL 경로(/dashboard/<slug>/...)와 일치 |
organizationName | string | 조직 표시명 |
curl 예제
# 전체 조직의 프로젝트 조회
curl https://qanote.app/api/v1/projects \
-H "Authorization: Bearer qn_YOUR_API_KEY"
# 특정 조직(slug) 의 프로젝트만
curl "https://qanote.app/api/v1/projects?organizationSlug=acme" \
-H "Authorization: Bearer qn_YOUR_API_KEY"
이슈
GET /api/v1/projects/:projectId/issues
프로젝트의 이슈 목록을 검색합니다. 페이지네이션과 필터링을 지원합니다.
필요 Scope: issues:read
Path 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| projectId | string | Yes | 프로젝트 ID |
Query 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| status | string | No | 상태 필터 (open, in_progress, resolved, closed) |
| priority | string | No | 우선순위 필터 (low, medium, high, critical) |
| q | string | No | 제목/설명 검색어 |
| label | string | No | 라벨 필터 |
| page | number | No | 페이지 번호 (기본: 1) |
| limit | number | No | 페이지당 항목 수 (기본: 20, 최대: 100) |
응답
{
"data": [
{
"issueNumber": 42,
"title": "로그인 페이지에서 비밀번호 입력 시 오류 발생",
"status": "open",
"priority": "high",
"reporterName": "김개발",
"createdAt": "2025-03-15T14:30:00.000Z",
"updatedAt": "2025-03-15T14:30:00.000Z"
}
],
"total": 42,
"page": 1,
"totalPages": 3
}
curl 예제
curl "https://qanote.app/api/v1/projects/PROJECT_ID/issues?status=open&limit=10" \
-H "Authorization: Bearer qn_YOUR_API_KEY"
GET /api/v1/projects/:projectId/issues/:issueNumber
이슈의 상세 정보를 조회합니다. 메타데이터 요약(콘솔 오류 수, 네트워크 오류 수 등)이 포함됩니다.
필요 Scope: issues:read
Path 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| projectId | string | Yes | 프로젝트 ID |
| issueNumber | number | Yes | 이슈 번호 |
응답
{
"data": {
"issueNumber": 42,
"title": "로그인 페이지에서 비밀번호 입력 시 오류 발생",
"description": "비밀번호 입력 후 엔터 키를 누르면 콘솔에 TypeError 발생",
"status": "open",
"priority": "high",
"labels": ["bug", "auth"],
"reporterName": "김개발",
"assigneeName": "이검수",
"pageUrl": "https://example.com/login",
"browserInfo": "Chrome 120.0",
"osInfo": "macOS 14.2",
"viewportSize": "1920x1080",
"metadataSummary": {
"consoleErrorCount": 3,
"networkErrorCount": 1,
"jsErrorCount": 2,
"userActionCount": 5,
"screenshotCount": 1
},
"createdAt": "2025-03-15T14:30:00.000Z",
"updatedAt": "2025-03-15T15:00:00.000Z"
}
}
curl 예제
curl https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER \
-H "Authorization: Bearer qn_YOUR_API_KEY"
PATCH /api/v1/projects/:projectId/issues/:issueNumber
이슈의 상태 또는 우선순위를 업데이트합니다.
필요 Scope: issues:write
Path 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| projectId | string | Yes | 프로젝트 ID |
| issueNumber | number | Yes | 이슈 번호 |
Request Body
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| status | string | No | 변경할 상태 (open, in_progress, resolved, closed) |
| priority | string | No | 변경할 우선순위 (low, medium, high, critical) |
응답
{
"data": {
"issueNumber": 42,
"status": "in_progress",
"priority": "high",
"updatedAt": "2025-03-15T15:30:00.000Z"
}
}
curl 예제
curl -X PATCH https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER \
-H "Authorization: Bearer qn_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "in_progress"}'
코멘트
GET /api/v1/projects/:projectId/issues/:issueNumber/comments
이슈의 코멘트 목록을 조회합니다.
필요 Scope: issues:read
Path 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| projectId | string | Yes | 프로젝트 ID |
| issueNumber | number | Yes | 이슈 번호 |
응답
{
"data": [
{
"id": "comment_abc123",
"content": "재현 확인했습니다. Chrome에서만 발생합니다.",
"authorName": "이검수",
"createdAt": "2025-03-15T15:00:00.000Z"
}
],
"total": 1
}
curl 예제
curl https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/comments \
-H "Authorization: Bearer qn_YOUR_API_KEY"
POST /api/v1/projects/:projectId/issues/:issueNumber/comments
이슈에 새 코멘트를 추가합니다.
필요 Scope: issues:write
Path 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| projectId | string | Yes | 프로젝트 ID |
| issueNumber | number | Yes | 이슈 번호 |
Request Body
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| content | string | Yes | 코멘트 내용 |
응답
{
"data": {
"id": "comment_def456",
"content": "수정 완료했습니다. 확인 부탁드립니다.",
"authorName": "김개발",
"createdAt": "2025-03-15T16:00:00.000Z"
}
}
curl 예제
curl -X POST https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/comments \
-H "Authorization: Bearer qn_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"content": "수정 완료했습니다. 확인 부탁드립니다."}'
이슈 메타데이터
이슈에 첨부된 기술적 컨텍스트를 개별 엔드포인트로 조회합니다. 모든 메타데이터 엔드포인트는 issues:read 스코프가 필요합니다.
GET /api/v1/projects/:projectId/issues/:issueNumber/console-logs
이슈 보고 시 캡처된 브라우저 콘솔 로그를 조회합니다.
Query 파라미터
| 이름 | 타입 | 필수 | 설명 |
|---|---|---|---|
| level | string | No | 로그 레벨 필터 (error, warn, info, log) |
응답
{
"data": [
{
"level": "error",
"message": "TypeError: Cannot read properties of undefined (reading 'value')",
"source": "https://example.com/assets/app.js:142:15",
"timestamp": "2025-03-15T14:29:55.000Z"
}
],
"total": 3
}
curl 예제
curl "https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/console-logs?level=error" \
-H "Authorization: Bearer qn_YOUR_API_KEY"
GET /api/v1/projects/:projectId/issues/:issueNumber/network-logs
이슈 보고 시 캡처된 네트워크 요청 로그를 조회합니다.
응답
{
"data": [
{
"method": "POST",
"url": "https://api.example.com/auth/login",
"status": 500,
"duration": 1250,
"timestamp": "2025-03-15T14:29:58.000Z"
}
],
"total": 1
}
curl 예제
curl https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/network-logs \
-H "Authorization: Bearer qn_YOUR_API_KEY"
GET /api/v1/projects/:projectId/issues/:issueNumber/screenshots
이슈에 첨부된 스크린샷 목록을 조회합니다.
응답
{
"data": [
{
"id": "screenshot_abc123",
"url": "https://cdn.qanote.app/screenshots/abc123.png",
"width": 1920,
"height": 1080,
"createdAt": "2025-03-15T14:30:00.000Z"
}
],
"total": 1
}
curl 예제
curl https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/screenshots \
-H "Authorization: Bearer qn_YOUR_API_KEY"
GET /api/v1/projects/:projectId/issues/:issueNumber/tech-context
이슈 보고 시 캡처된 기술 컨텍스트(브라우저 정보, CSS 선택자, React 컴포넌트 트리 등)를 조회합니다.
응답
{
"data": {
"browserInfo": {
"name": "Chrome",
"version": "120.0.6099.109"
},
"osInfo": {
"name": "macOS",
"version": "14.2"
},
"viewportSize": {
"width": 1920,
"height": 1080
},
"cssSelector": "div.login-form > input[type='password']",
"elementStyles": {
"display": "block",
"visibility": "visible"
},
"reactComponentTree": [
"App > AuthLayout > LoginForm > PasswordInput"
]
}
}
curl 예제
curl https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/tech-context \
-H "Authorization: Bearer qn_YOUR_API_KEY"
GET /api/v1/projects/:projectId/issues/:issueNumber/user-actions
이슈 보고 전 사용자의 행동(클릭, 입력, 네비게이션 등) 기록을 조회합니다.
응답
{
"data": [
{
"type": "click",
"target": "button.submit-btn",
"text": "로그인",
"timestamp": "2025-03-15T14:29:50.000Z"
},
{
"type": "input",
"target": "input[type='password']",
"timestamp": "2025-03-15T14:29:48.000Z"
}
],
"total": 5
}
curl 예제
curl https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/user-actions \
-H "Authorization: Bearer qn_YOUR_API_KEY"