home
/
u941026986
/
domains
/
irole.co
/
public_html
➕ New
📤 Upload
✎ Editing:
Paratune_Issue_API.postman_collection.json
← Back
{ "info": { "_postman_id": "paratune-issue-submission-api", "name": "Paratune Issue Submission API", "description": "API collection for submitting and tracking issues in Paratune project management system.\n\n**HOW TO GET YOUR API KEY:**\n\nContact your Paratune account administrator to get your API key. They will generate it from the admin panel and provide it to you securely.\n\n**IMPORTANT:**\n- Set your API key in the 'api_key' collection variable\n- All endpoints require the API key for authentication (use X-API-Key header)\n- The API key automatically identifies your project, so no project_id is needed\n- Store your API key securely\n\n**NEW FEATURES:**\n- Issues now include `qa_status`, `effective_status`, and `client_can_comment` fields\n- `client_can_comment` is true only when status='done' AND qa_status='qa_passed'\n- New endpoint: Mark as Done (POST /api/issues/{issue_id}/mark-done) - allows clients to mark issues as done (sets status='done' and qa_status='qa_passed')\n- New endpoint: Reject Issue (POST /api/issues/{issue_id}/reject) - allows clients to reject completed work\n- New endpoint: Add Comment (POST /api/issues/{issue_id}/comments) - allows clients to comment on issues regardless of status\n- New endpoint: Add Attachment (POST /api/issues/{issue_id}/attachments) - allows clients to upload files to issues regardless of status", "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" }, "item": [ { "name": "Submit Issue", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 201\", function () {", " pm.response.to.have.status(201);", "});", "", "pm.test(\"Response has success field\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('success');", " pm.expect(jsonData.success).to.be.true;", "});", "", "pm.test(\"Response contains issue data\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('data');", " pm.expect(jsonData.data).to.have.property('issue_id');", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Accept", "value": "application/json", "type": "text" }, { "key": "Content-Type", "value": "multipart/form-data", "type": "text" }, { "key": "X-API-Key", "value": "{{api_key}}", "type": "text", "description": "Your API key for authentication" } ], "body": { "mode": "formdata", "formdata": [ { "key": "title", "value": "API Test Issue", "type": "text", "description": "Issue title (required)" }, { "key": "description", "value": "This is a test issue submitted via API. It includes a description of the problem or feature request.", "type": "text", "description": "Issue description (optional)" }, { "key": "issue_type", "value": "bug", "type": "text", "description": "Issue type: bug, feature, task, epic, story, sub-task, cr (required)" }, { "key": "priority", "value": "high", "type": "text", "description": "Priority: lowest, low, medium, high, highest (optional)" }, { "key": "attachments", "type": "file", "description": "File attachments (optional, max 50MB per file)" } ] }, "url": { "raw": "{{base_url}}/api/issues/submit", "host": [ "{{base_url}}" ], "path": [ "api", "issues", "submit" ] }, "description": "Submit a single issue to your project. Supports file attachments. The project is automatically identified from your API key." }, "response": [] }, { "name": "Get All Issues", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "", "pm.test(\"Response has success field\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('success');", " pm.expect(jsonData.success).to.be.true;", "});", "", "pm.test(\"Response contains issues array\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('data');", " pm.expect(jsonData.data).to.have.property('issues');", " pm.expect(jsonData.data.issues).to.be.an('array');", "});" ], "type": "text/javascript" } } ], "request": { "method": "GET", "header": [ { "key": "Accept", "value": "application/json", "type": "text" }, { "key": "X-API-Key", "value": "{{api_key}}", "type": "text", "description": "Your API key for authentication" } ], "url": { "raw": "{{base_url}}/api/issues/list?per_page=20&page=1", "host": [ "{{base_url}}" ], "path": [ "api", "issues", "list" ], "query": [ { "key": "status", "value": "", "description": "Filter by status: todo, in_progress, in_review, done, pending_review, rejected, blocked, cancelled (optional)", "disabled": true }, { "key": "issue_type", "value": "", "description": "Filter by issue type: bug, feature, task, epic, story, sub-task, cr (optional)", "disabled": true }, { "key": "priority", "value": "", "description": "Filter by priority: lowest, low, medium, high, highest (optional)", "disabled": true }, { "key": "per_page", "value": "20", "description": "Number of items per page (1-100, default: 20)" }, { "key": "page", "value": "1", "description": "Page number (default: 1)" } ] }, "description": "Get a list of all issues for your project. Supports filtering by status, issue type, and priority. Returns paginated results. The project is automatically identified from your API key.\n\n**Available Status Filters:**\n- `todo`: Issue is in the to-do list\n- `in_progress`: Issue is currently being worked on\n- `in_review`: Issue is under review\n- `done`: Issue is completed\n- `pending_review`: Issue is pending review\n- `rejected`: Issue has been rejected\n- `blocked`: Issue is blocked\n- `cancelled`: Issue has been cancelled\n\n**Response includes for each issue:**\n- `qa_status`: Current QA status (qa_pending, qa_in_progress, qa_passed, qa_failed)\n- `effective_status`: Computed status considering both status and qa_status\n- `client_can_comment`: Boolean indicating if client can comment (true only when status='done' AND qa_status='qa_passed')" }, "response": [] }, { "name": "Get Issue by ID", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "", "pm.test(\"Response contains issue data\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('success');", " pm.expect(jsonData.success).to.be.true;", " pm.expect(jsonData).to.have.property('data');", " pm.expect(jsonData.data).to.have.property('id');", " pm.expect(jsonData.data).to.have.property('title');", " pm.expect(jsonData.data).to.have.property('status');", "});", "", "pm.test(\"Response contains attachments with download URLs\", function () {", " var jsonData = pm.response.json();", " if (jsonData.data && jsonData.data.attachments) {", " pm.expect(jsonData.data.attachments).to.be.an('array');", " if (jsonData.data.attachments.length > 0) {", " pm.expect(jsonData.data.attachments[0]).to.have.property('download_url');", " }", " }", "});" ], "type": "text/javascript" } } ], "request": { "method": "GET", "header": [ { "key": "Accept", "value": "application/json", "type": "text" }, { "key": "X-API-Key", "value": "{{api_key}}", "type": "text", "description": "Your API key for authentication" } ], "url": { "raw": "{{base_url}}/api/issues/{{issue_id}}", "host": [ "{{base_url}}" ], "path": [ "api", "issues", "{{issue_id}}" ] }, "description": "Get detailed information about a specific issue by its ID. Includes attachments with download URLs, assignee, status, and other details. To download an attachment, use the download_url provided in the attachments array.\n\n**Response includes:**\n- `qa_status`: Current QA status (qa_pending, qa_in_progress, qa_passed, qa_failed)\n- `effective_status`: Computed status considering both status and qa_status\n- `client_can_comment`: Boolean indicating if client can comment (true only when status='done' AND qa_status='qa_passed')" }, "response": [] }, { "name": "Reject Issue", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "", "pm.test(\"Response has success field\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('success');", " pm.expect(jsonData.success).to.be.true;", "});", "", "pm.test(\"Response contains issue data\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('data');", " pm.expect(jsonData.data).to.have.property('issue');", " pm.expect(jsonData.data.issue).to.have.property('status');", " pm.expect(jsonData.data.issue.status).to.eql('rejected');", "});", "", "pm.test(\"Response contains rejection details\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData.data).to.have.property('rejection_details');", " pm.expect(jsonData.data.rejection_details).to.have.property('new_status');", " pm.expect(jsonData.data.rejection_details.new_status).to.eql('rejected');", " pm.expect(jsonData.data.rejection_details).to.have.property('new_qa_status');", " pm.expect(jsonData.data.rejection_details.new_qa_status).to.eql('qa_failed');", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Accept", "value": "application/json", "type": "text" }, { "key": "X-API-Key", "value": "{{api_key}}", "type": "text", "description": "Your API key for authentication" } ], "url": { "raw": "{{base_url}}/api/issues/{{issue_id}}/reject", "host": [ "{{base_url}}" ], "path": [ "api", "issues", "{{issue_id}}", "reject" ] }, "description": "Reject an issue when it is Done and QA Passed. This endpoint allows clients to reject completed work that has passed QA. The issue must have status='done' and qa_status='qa_passed' to be rejected. Upon rejection, the issue status will be set to 'rejected' and qa_status will be set to 'qa_failed'. The issue_id is automatically taken from collection variables." }, "response": [] }, { "name": "Mark Issue as Done", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 200\", function () {", " pm.response.to.have.status(200);", "});", "", "pm.test(\"Response has success field\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('success');", " pm.expect(jsonData.success).to.be.true;", "});", "", "pm.test(\"Response contains issue data\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('data');", " pm.expect(jsonData.data).to.have.property('issue');", " pm.expect(jsonData.data.issue).to.have.property('status');", " pm.expect(jsonData.data.issue.status).to.eql('done');", "});", "", "pm.test(\"Response contains mark done details\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData.data).to.have.property('mark_done_details');", " pm.expect(jsonData.data.mark_done_details).to.have.property('new_status');", " pm.expect(jsonData.data.mark_done_details.new_status).to.eql('done');", " pm.expect(jsonData.data.mark_done_details).to.have.property('new_qa_status');", " pm.expect(jsonData.data.mark_done_details.new_qa_status).to.eql('qa_passed');", " pm.expect(jsonData.data.mark_done_details).to.have.property('marked_by_type');", " pm.expect(jsonData.data.mark_done_details.marked_by_type).to.eql('project_owner');", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Accept", "value": "application/json", "type": "text" }, { "key": "X-API-Key", "value": "{{api_key}}", "type": "text", "description": "Your API key for authentication" } ], "url": { "raw": "{{base_url}}/api/issues/{{issue_id}}/mark-done", "host": [ "{{base_url}}" ], "path": [ "api", "issues", "{{issue_id}}", "mark-done" ] }, "description": "Mark an issue as done. This endpoint allows project owners (clients) to mark issues as completed. When marked as done, the issue status will be set to 'done' and qa_status will be set to 'qa_passed'. The action will be logged in the project activity log and attributed to the project owner. The issue_id is automatically taken from collection variables." }, "response": [] }, { "name": "Add Comment to Issue", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 201\", function () {", " pm.response.to.have.status(201);", "});", "", "pm.test(\"Response has success field\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('success');", " pm.expect(jsonData.success).to.be.true;", "});", "", "pm.test(\"Response contains comment data\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('data');", " pm.expect(jsonData.data).to.have.property('comment');", " pm.expect(jsonData.data.comment).to.have.property('id');", " pm.expect(jsonData.data.comment).to.have.property('issue_id');", " pm.expect(jsonData.data.comment).to.have.property('comment');", "});", "", "pm.test(\"Comment is attributed to project owner\", function () {", " var jsonData = pm.response.json();", " if (jsonData.data && jsonData.data.comment) {", " pm.expect(jsonData.data.comment).to.have.property('created_by_type');", " pm.expect(jsonData.data.comment.created_by_type).to.eql('project_owner');", " }", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Accept", "value": "application/json", "type": "text" }, { "key": "Content-Type", "value": "application/json", "type": "text" }, { "key": "X-API-Key", "value": "{{api_key}}", "type": "text", "description": "Your API key for authentication" } ], "body": { "mode": "raw", "raw": "{\n \"comment\": \"This looks great! However, can we adjust the button color to match the brand guidelines?\",\n \"comment_rich\": \"<p>This looks great! However, can we adjust the <strong>button color</strong> to match the brand guidelines?</p>\"\n}", "options": { "raw": { "language": "json" } } }, "url": { "raw": "{{base_url}}/api/issues/{{issue_id}}/comments", "host": [ "{{base_url}}" ], "path": [ "api", "issues", "{{issue_id}}", "comments" ] }, "description": "Add a comment to an issue. This endpoint allows project owners to provide feedback on issues regardless of status or QA status. Comments are attributed to the project owner (project name), not the individual API user.\n\n**Requirements:**\n- Issue must exist and not be deleted\n- Authenticated user must own the project (customer_id match)\n\n**Request Body:**\n- `comment` (required): Plain text comment (max 5000 characters)\n- `comment_rich` (optional): Rich text/HTML formatted comment\n\nThe issue_id is automatically taken from collection variables." }, "response": [] }, { "name": "Add Attachment to Issue", "event": [ { "listen": "test", "script": { "exec": [ "pm.test(\"Status code is 201\", function () {", " pm.response.to.have.status(201);", "});", "", "pm.test(\"Response has success field\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('success');", " pm.expect(jsonData.success).to.be.true;", "});", "", "pm.test(\"Response contains attachment data\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData).to.have.property('data');", " pm.expect(jsonData.data).to.have.property('attachment');", " pm.expect(jsonData.data.attachment).to.have.property('id');", " pm.expect(jsonData.data.attachment).to.have.property('issue_id');", " pm.expect(jsonData.data.attachment).to.have.property('download_url');", "});", "", "pm.test(\"Attachment is attributed to project owner\", function () {", " var jsonData = pm.response.json();", " if (jsonData.data && jsonData.data.attachment) {", " pm.expect(jsonData.data.attachment).to.have.property('created_by_type');", " pm.expect(jsonData.data.attachment.created_by_type).to.eql('project_owner');", " }", "});" ], "type": "text/javascript" } } ], "request": { "method": "POST", "header": [ { "key": "Accept", "value": "application/json", "type": "text" }, { "key": "X-API-Key", "value": "{{api_key}}", "type": "text", "description": "Your API key for authentication" } ], "body": { "mode": "formdata", "formdata": [ { "key": "attachment", "type": "file", "description": "File to attach (required, max 50MB)" }, { "key": "description", "value": "Screenshot showing the button color issue", "type": "text", "description": "Description/caption for the attachment (optional)" } ] }, "url": { "raw": "{{base_url}}/api/issues/{{issue_id}}/attachments", "host": [ "{{base_url}}" ], "path": [ "api", "issues", "{{issue_id}}", "attachments" ] }, "description": "Add an attachment to an issue. This endpoint allows project owners to upload files (screenshots, documents, etc.) to issues regardless of status or QA status. Attachments are attributed to the project owner (project name), not the individual API user.\n\n**Requirements:**\n- Issue must exist and not be deleted\n- Authenticated user must own the project (customer_id match)\n\n**Request Body (multipart/form-data):**\n- `attachment` (required): File upload (max 50MB per file)\n- `description` (optional): Description/caption for the attachment\n\n**Supported File Types:**\n- Images: jpg, jpeg, png, gif, webp, svg\n- Documents: pdf, doc, docx, xls, xlsx, txt\n- Archives: zip, rar, 7z\n\nThe issue_id is automatically taken from collection variables." }, "response": [] } ], "event": [ { "listen": "prerequest", "script": { "type": "text/javascript", "exec": [ "" ] } }, { "listen": "test", "script": { "type": "text/javascript", "exec": [ "" ] } } ], "variable": [ { "key": "base_url", "value": "https://paratune.com", "type": "string", "description": "Base URL for the API" }, { "key": "api_key", "value": "pk_your_api_key_here", "type": "string", "description": "Your API key. Get it from your Paratune account administrator." }, { "key": "issue_id", "value": "1", "type": "string", "description": "Issue ID (used for Get Issue by ID request)" } ] }
💾 Save Changes
Cancel
📤 Upload File
×
Select File
Upload
Cancel
➕ Create New
×
Type
📄 File
📁 Folder
Name
Create
Cancel
✎ Rename Item
×
Current Name
New Name
Rename
Cancel
🔐 Change Permissions
×
Target File
Permission (e.g., 0755, 0644)
0755
0644
0777
Apply
Cancel