Endpoint Reference
Complete API endpoint list and usage
Table of Contents
- Projects
- GET /api/v1/projects
- Issues
- GET /api/v1/projects/:projectId/issues
- GET /api/v1/projects/:projectId/issues/:issueNumber
- PATCH /api/v1/projects/:projectId/issues/:issueNumber
- Comments
- GET /api/v1/projects/:projectId/issues/:issueNumber/comments
- POST /api/v1/projects/:projectId/issues/:issueNumber/comments
- Issue Metadata
- 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
Endpoint Reference
The Base URL for all endpoints is https://qanote.app.
Projects
GET /api/v1/projects
Retrieve the list of accessible projects.
- OAuth token: returns projects from every active organization the user belongs to.
- API Key token: returns projects from the single organization the key was issued for.
Required Scope: projects:read
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| organizationSlug | string | No | Filter by a specific organization slug — matches the slug in /dashboard/<slug>/... URLs |
| organizationId | string (uuid) | No | Filter by a specific organization ID (mutually exclusive with organizationSlug) |
Response
{
"data": [
{
"id": "project_abc123",
"name": "Web Service",
"slug": "web-service",
"description": "Main web service project",
"organizationId": "2a3f7b04-6e91-4c2d-9f77-3d6c9a1e4b58",
"organizationSlug": "acme",
"organizationName": "Acme Inc.",
"createdAt": "2025-01-15T09:00:00.000Z"
}
],
"total": 1
}
Each project now includes three organization identifiers:
| Field | Type | Description |
|---|---|---|
organizationId | string (uuid) | ID of the organization the project belongs to |
organizationSlug | string | Organization slug — matches the URL path (/dashboard/<slug>/...) |
organizationName | string | Organization display name |
curl Example
# List projects across every accessible organization
curl https://qanote.app/api/v1/projects \
-H "Authorization: Bearer qn_YOUR_API_KEY"
# Only projects from a specific organization (by slug)
curl "https://qanote.app/api/v1/projects?organizationSlug=acme" \
-H "Authorization: Bearer qn_YOUR_API_KEY"
Issues
GET /api/v1/projects/:projectId/issues
Search issues in a project. Supports pagination and filtering.
Required Scope: issues:read
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| projectId | string | Yes | Project ID |
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | No | Status filter (open, in_progress, resolved, closed) |
| priority | string | No | Priority filter (low, medium, high, critical) |
| q | string | No | Title/description search query |
| label | string | No | Label filter |
| page | number | No | Page number (default: 1) |
| limit | number | No | Items per page (default: 20, max: 100) |
Response
{
"data": [
{
"issueNumber": 42,
"title": "Error occurs when entering password on login page",
"status": "open",
"priority": "high",
"reporterName": "John Dev",
"createdAt": "2025-03-15T14:30:00.000Z",
"updatedAt": "2025-03-15T14:30:00.000Z"
}
],
"total": 42,
"page": 1,
"totalPages": 3
}
curl Example
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
Retrieve detailed information for an issue. Includes metadata summary (console error count, network error count, etc.).
Required Scope: issues:read
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| projectId | string | Yes | Project ID |
| issueNumber | number | Yes | Issue number |
Response
{
"data": {
"issueNumber": 42,
"title": "Error occurs when entering password on login page",
"description": "TypeError appears in console after entering password and pressing Enter",
"status": "open",
"priority": "high",
"labels": ["bug", "auth"],
"reporterName": "John Dev",
"assigneeName": "Jane QA",
"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 Example
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
Update the status or priority of an issue.
Required Scope: issues:write
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| projectId | string | Yes | Project ID |
| issueNumber | number | Yes | Issue number |
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| status | string | No | Status to change to (open, in_progress, resolved, closed) |
| priority | string | No | Priority to change to (low, medium, high, critical) |
Response
{
"data": {
"issueNumber": 42,
"status": "in_progress",
"priority": "high",
"updatedAt": "2025-03-15T15:30:00.000Z"
}
}
curl Example
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"}'
Comments
GET /api/v1/projects/:projectId/issues/:issueNumber/comments
Retrieve the comment list for an issue.
Required Scope: issues:read
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| projectId | string | Yes | Project ID |
| issueNumber | number | Yes | Issue number |
Response
{
"data": [
{
"id": "comment_abc123",
"content": "Confirmed reproduction. Only occurs in Chrome.",
"authorName": "Jane QA",
"createdAt": "2025-03-15T15:00:00.000Z"
}
],
"total": 1
}
curl Example
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
Add a new comment to an issue.
Required Scope: issues:write
Path Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| projectId | string | Yes | Project ID |
| issueNumber | number | Yes | Issue number |
Request Body
| Name | Type | Required | Description |
|---|---|---|---|
| content | string | Yes | Comment content |
Response
{
"data": {
"id": "comment_def456",
"content": "Fix completed. Please review.",
"authorName": "John Dev",
"createdAt": "2025-03-15T16:00:00.000Z"
}
}
curl Example
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": "Fix completed. Please review."}'
Issue Metadata
Retrieve technical context attached to issues through individual endpoints. All metadata endpoints require the issues:read scope.
GET /api/v1/projects/:projectId/issues/:issueNumber/console-logs
Retrieve browser console logs captured at the time of issue reporting.
Query Parameters
| Name | Type | Required | Description |
|---|---|---|---|
| level | string | No | Log level filter (error, warn, info, log) |
Response
{
"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 Example
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
Retrieve network request logs captured at the time of issue reporting.
Response
{
"data": [
{
"method": "POST",
"url": "https://api.example.com/auth/login",
"status": 500,
"duration": 1250,
"timestamp": "2025-03-15T14:29:58.000Z"
}
],
"total": 1
}
curl Example
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
Retrieve the list of screenshots attached to an issue.
Response
{
"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 Example
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
Retrieve technical context captured at the time of issue reporting (browser info, CSS selectors, React component tree, etc.).
Response
{
"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 Example
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
Retrieve user actions (clicks, inputs, navigation, etc.) recorded before the issue was reported.
Response
{
"data": [
{
"type": "click",
"target": "button.submit-btn",
"text": "Login",
"timestamp": "2025-03-15T14:29:50.000Z"
},
{
"type": "input",
"target": "input[type='password']",
"timestamp": "2025-03-15T14:29:48.000Z"
}
],
"total": 5
}
curl Example
curl https://qanote.app/api/v1/projects/PROJECT_ID/issues/ISSUE_NUMBER/user-actions \
-H "Authorization: Bearer qn_YOUR_API_KEY"