Partner API reference
59 endpoints across 13 resource groups. Every call is a POST, authenticated with an API key, carrying an encrypted JSON payload. If you have not made a call yet, start with the quick start.
Conventions
All endpoints live under a single base path:
https://<your-orangescrum-host>/api/v1/partner- Everything is POST. Reads use POST too, because the request body is encrypted and a query string cannot carry that.
- One body field. The JSON body is always
{ "encrypted_data": "..." }. Your real parameters live inside the encrypted blob. - Scope comes from the key. You never pass a company or user ID. The API key is bound to a company and a user, and that is what the call can see.
- Dates are
YYYY-MM-DDunless a field says otherwise.
Authentication
Send your API key in the X-API-KEY header on every request. It is the only header we require beyond Content-Type.
X-API-KEY: your_api_key
Content-Type: application/jsonThe key is checked against active, unexpired credentials. A missing, unknown, deactivated, or expired key returns 401. Your API secret is never sent: it is only used to encrypt and decrypt the payload, which is what proves the request really came from you.
Encrypting requests
Payloads are encrypted with AES-256-CBC. The exact recipe is:
- Serialise your parameters as JSON. An endpoint with no parameters takes
{}. - Derive the key:
sha256(secret)as raw bytes, giving 32 bytes. Do not hex encode it first. - Generate a fresh random 16 byte IV for every request. Never reuse one.
- Encrypt the JSON with that key and IV.
- Prepend the IV to the ciphertext, then base64 encode the whole thing.
- Send the result as
encrypted_data.
import crypto from "node:crypto";
/**
* Build the "encrypted_data" value.
* key = raw sha256(secret) -> 32 bytes for AES-256
* iv = 16 random bytes
* ciphertext = AES-256-CBC(JSON payload)
* result = base64(iv + ciphertext)
*/
export function encryptPayload(payload, secret) {
const key = crypto.createHash("sha256").update(secret).digest();
const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
const enc = Buffer.concat([
cipher.update(JSON.stringify(payload), "utf8"),
cipher.final(),
]);
return Buffer.concat([iv, enc]).toString("base64");
}
export async function call(endpoint, payload) {
const res = await fetch("https://<your-orangescrum-host>/api/v1/partner" + endpoint, {
method: "POST",
headers: {
"X-API-KEY": process.env.OS_API_KEY,
"Content-Type": "application/json",
},
body: JSON.stringify({
encrypted_data: encryptPayload(payload, process.env.OS_API_SECRET),
}),
});
return res.json();
}
// Example
const projects = await call("/projects/list", {});Responses and errors
Responses are JSON with a consistent envelope. success tells you what happened, message is human readable, and data carries the result when there is one.
{
"success": true,
"message": "Projects retrieved successfully",
"data": [
{
"id": 1042,
"name": "Website Redesign",
"short_name": "WEB",
"status": "Started",
"priority": "High",
"start_date": "2026-07-01",
"end_date": "2026-09-30"
}
]
}Status codes follow normal HTTP meanings:
| Code | What it means |
|---|---|
200 | The request worked. Read data from the response body. |
201 | Something was created. The new record is in the response body. |
400 | The payload was rejected. Check errors for the field that failed. |
401 | The API key is missing, wrong, inactive, expired, or the payload could not be decrypted. |
404 | The record you asked for does not exist, or your key cannot see it. |
422 | Validation failed on one or more fields. |
429 | You went over a rate limit. Back off and retry. |
500 | Something broke on our side. Retry, and tell us if it persists. |
Rate limits
120 requests per minute and 5000 per day, counted per API key and IP. Going over returns 429.
Back off and retry rather than hammering. If you are backfilling a warehouse or syncing a large account and these limits are the wrong shape for that, tell us what you are doing and we will look at raising them.
Endpoint reference
Every endpoint below is a POST to the base path plus the path shown. Parameters go inside the encrypted payload.
Validate1#
A single endpoint to check that your API key and your encryption setup are correct.
Projects5#
Read, create, update, and search projects in the connected Orangescrum account.
POST/projects/listList projects
POST/projects/createCreate a project
Creates a new project and returns it.
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Project name. Max 255 characters. |
short_name | string | No | Short code for the project. Max 50 characters. |
description | string | No | Project description. |
project_type | integer or string | No | Project type. Pass the numeric type ID, or a type name to match or create. |
status | string | No | One of: Started, Hold, Stack, Completed. |
priority | string | No | One of: High, Medium, Low. |
start_date | string (date) | No | Project start date. |
end_date | string (date) | No | Project end date. Must be on or after start_date. |
estimated_hours | number | No | Estimated hours. Cannot be negative. |
status_group_id | integer | No | ID of the status group to use. |
POST/projects/detailGet a project
POST/projects/updateUpdate a project
Updates the fields you send on an existing project. Fields you leave out are not changed.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique ID of the project. |
name | string | No | Project name. Max 255 characters. |
short_name | string | No | Short code for the project. Max 50 characters. |
description | string | No | Project description. |
project_type | integer | No | Numeric project type ID. |
status | string | No | One of: Started, Hold, Stack, Completed. |
priority | string | No | One of: High, Medium, Low. |
isactive | boolean | No | Whether the project is active. |
start_date | string (date) | No | Project start date. |
end_date | string (date) | No | Project end date. Must be on or after start_date. |
estimated_hours | number | No | Estimated hours. Cannot be negative. |
Tasks5#
Read, create, update, and search tasks inside a project.
POST/tasks/listList tasks
Returns a paginated list of tasks, with optional filters.
| Name | Type | Required | Description |
|---|---|---|---|
filters | array | No | Object holding the filter fields below. |
filters.project_id | string or integer | No | Unique ID of the project, or its numeric ID. |
filters.status | string | No | One of: Open, Closed. |
filters.priority | string | No | One of: high, medium, low. |
filters.assign_to | integer | No | User ID the task is assigned to. |
filters.type_id | integer | No | Task type ID. |
filters.case_no | integer | No | Task number within the project. |
filters.q | string | No | Search text. |
per_page | integer | No | Results per page. Between 1 and 100. |
page | integer | No | Page number. Starts at 1. |
POST/tasks/createCreate a task
Creates a task in a project and returns it.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique ID of the project. |
title | string | Yes | Task title. Max 255 characters. |
message | string | No | Task description. |
type_id | integer | Yes | Task type ID. |
priority | string | Yes | One of: high, medium, low. |
assign_to | integer | No | User ID to assign the task to. |
estimated_hours | number | No | Estimated hours. Cannot be negative. |
gantt_start_date | string (date) | No | Task start date. |
due_date | string (date) | No | Task due date. |
completed | integer | No | Progress state. One of: 0, 1, 2, 3, 4, 5, 6. |
legend | integer | No | Legend or label ID. |
custom_status | string | No | One of: New, In Progress, Resolved, Closed. |
parent_task_id | integer | No | ID of the parent task, for a subtask. |
story_point | number | No | Story points. Cannot be negative. |
epic_id | integer | No | ID of the epic to link the task to. |
milestone_id | integer | No | ID of the milestone to link the task to. |
is_recurring | boolean | No | Whether the task repeats. |
POST/tasks/detailGet a task
POST/tasks/updateUpdate a task
Updates the fields you send on an existing task. Fields you leave out are not changed.
| Name | Type | Required | Description |
|---|---|---|---|
task_id | string | Yes | Unique ID of the task. |
title | string | No | Task title. Max 255 characters. |
message | string | No | Task description. |
type_id | integer | No | Task type ID. |
priority | string | No | One of: high, medium, low. |
assign_to | integer | No | User ID to assign the task to. |
estimated_hours | number | No | Estimated hours. Cannot be negative. |
gantt_start_date | string (date) | No | Task start date. |
due_date | string (date) | No | Task due date. |
completed | integer | No | Progress state. One of: 0, 1, 2, 3, 4, 5, 6. |
legend | integer | No | Legend or label ID. |
custom_status | string | No | One of: New, In Progress, Resolved, Closed. |
status | string | No | One of: Open, Closed. |
POST/tasks/searchSearch tasks
Searches tasks by text and returns a paginated list.
| Name | Type | Required | Description |
|---|---|---|---|
q | string | No | Search text. Max 255 characters. |
page | integer | No | Page number. Starts at 1. |
per_page | integer | No | Results per page. Between 1 and 100. |
project_id | string | No | Unique ID of a project, to limit the search to that project. |
Timelogs5#
Read and record time entries against projects and tasks.
POST/timelogs/listList timelogs
Returns a paginated list of time entries, with optional filters.
| Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Results per page. Between 1 and 100. |
page | integer | No | Page number. Starts at 1. |
filters | array | No | Object holding the filter fields below. |
filters.project_id | string | No | Unique ID of the project. |
filters.task_id | string | No | Unique ID of the task. |
filters.from | string (date) | No | Start of the date range. |
filters.to | string (date) | No | End of the date range. Must be on or after filters.from. |
filters.is_billable | boolean | No | Only billable or non billable entries. |
filters.timesheet_flag | boolean | No | Only entries on a timesheet. |
filters.q | string | No | Search text. Max 255 characters. |
POST/timelogs/searchSearch timelogs
Searches time entries and returns a paginated list. Takes the same filters as the list endpoint.
| Name | Type | Required | Description |
|---|---|---|---|
per_page | integer | No | Results per page. Between 1 and 100. |
page | integer | No | Page number. Starts at 1. |
filters | array | No | Object holding the filter fields below. |
filters.project_id | string | No | Unique ID of the project. |
filters.task_id | string | No | Unique ID of the task. |
filters.from | string (date) | No | Start of the date range. |
filters.to | string (date) | No | End of the date range. Must be on or after filters.from. |
filters.is_billable | boolean | No | Only billable or non billable entries. |
filters.timesheet_flag | boolean | No | Only entries on a timesheet. |
filters.q | string | No | Search text. Max 255 characters. |
POST/timelogs/detailGet a timelog
POST/timelogs/createCreate a timelog
Records a new time entry against a project, and optionally against a task.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique ID of the project. |
task_id | string | No | Unique ID of the task. |
task_date | string (date) | Yes | Date the work was done. |
start_datetime | string (date) | No | Full start date and time. |
end_datetime | string (date) | No | Full end date and time. Must be after start_datetime. |
start_time | string (date) | No | Start time in HH:MM:SS format. Required when start_datetime is not sent. |
end_time | string (date) | No | End time in HH:MM:SS format. Required when end_datetime is not sent. |
total_hours | number | No | Total hours logged. Cannot be negative. |
break_time | number | No | Break time in hours. Cannot be negative. |
description | string | Yes | What the time was spent on. Max 1000 characters. |
is_from_timer | boolean | No | Whether the entry came from a running timer. |
is_billable | boolean | No | Whether the time is billable. |
timesheet_flag | boolean | No | Whether the entry belongs to a timesheet. |
task_status | integer | No | Status of the task at the time of logging. |
pending_status | integer | No | Approval status of the entry. |
approver_id | integer | No | User ID of the approver. |
ip | string | No | IP address the entry was logged from. Must be a valid IP. |
POST/timelogs/updateUpdate a timelog
Updates the fields you send on an existing time entry. Fields you leave out are not changed.
| Name | Type | Required | Description |
|---|---|---|---|
timelog_id | string | Yes | Unique ID of the time entry. |
project_id | string | No | Unique ID of the project. |
task_id | string | No | Unique ID of the task. |
task_date | string (date) | No | Date the work was done. |
start_datetime | string (date) | No | Full start date and time. |
end_datetime | string (date) | No | Full end date and time. Must be after start_datetime. |
start_time | string (date) | No | Start time in HH:MM:SS format. |
end_time | string (date) | No | End time in HH:MM:SS format. |
total_hours | number | No | Total hours logged. Cannot be negative. |
break_time | number | No | Break time in hours. Cannot be negative. |
description | string | No | What the time was spent on. Max 1000 characters. |
is_from_timer | boolean | No | Whether the entry came from a running timer. |
is_billable | boolean | No | Whether the time is billable. |
timesheet_flag | boolean | No | Whether the entry belongs to a timesheet. |
task_status | integer | No | Status of the task at the time of logging. |
pending_status | integer | No | Approval status of the entry. |
approver_id | integer | No | User ID of the approver. |
ip | string | No | IP address the entry was logged from. Must be a valid IP. |
Users2#
Read the people in the connected Orangescrum account. These endpoints are read only.
POST/users/listList users
Returns a paginated list of users, with optional filters.
| Name | Type | Required | Description |
|---|---|---|---|
filters | array | No | Object holding the filter fields below. |
filters.search | string | No | Search by name or email. |
filters.project_id | string | No | Unique ID of a project, to return only its members. |
page | integer | No | Page number. Starts at 1. |
per_page | integer | No | Results per page. Between 1 and 100. |
Test cases5#
Manage test cases, the individual checks that belong to a project and optionally to a test scenario.
POST/test-cases/listList test cases
Returns a paginated list of test cases, with optional filters.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | No | Unique ID of the project. |
scenario_id | string | No | Unique ID of the test scenario. |
status | string | No | Test case status. Max 50 characters. |
priority | string | No | Test case priority. Max 100 characters. |
q | string | No | Search text. Max 255 characters. |
include_archived | boolean | No | Include archived test cases. |
page | integer | No | Page number. Starts at 1. |
per_page | integer | No | Results per page. Between 1 and 100. |
POST/test-cases/createCreate a test case
Creates a test case in a project and returns it.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique ID of the project. |
name | string | Yes | Test case name. Max 255 characters. |
description | string | No | Test case description. Max 255 characters. |
type | string | No | Test case type. Max 50 characters. |
priority | string | No | Test case priority. Max 100 characters. |
severity | string | No | Test case severity. Max 100 characters. |
behaviour | string | No | Expected behaviour. Max 100 characters. |
automation_status | string | No | Automation status. Max 100 characters. |
pre_condition | string | No | What must be true before the test runs. |
post_condition | string | No | What should be true after the test runs. |
expected_result | string | No | Expected result. Max 255 characters. |
status | string | No | Test case status. Max 50 characters. |
version | string | No | Version label. Max 50 characters. |
scenario_id | string | No | Unique ID of the test scenario to link to. |
epic_id | integer | No | ID of the epic to link to. |
feature_id | integer | No | ID of the feature to link to. |
story_id | integer | No | ID of the story to link to. |
POST/test-cases/detailGet a test case
POST/test-cases/updateUpdate a test case
Updates the fields you send on an existing test case. Fields you leave out are not changed.
| Name | Type | Required | Description |
|---|---|---|---|
test_case_id | string | Yes | Unique ID of the test case. |
name | string | No | Test case name. Max 255 characters. |
description | string | No | Test case description. Max 255 characters. |
type | string | No | Test case type. Max 50 characters. |
priority | string | No | Test case priority. Max 100 characters. |
severity | string | No | Test case severity. Max 100 characters. |
behaviour | string | No | Expected behaviour. Max 100 characters. |
automation_status | string | No | Automation status. Max 100 characters. |
pre_condition | string | No | What must be true before the test runs. |
post_condition | string | No | What should be true after the test runs. |
expected_result | string | No | Expected result. Max 255 characters. |
status | string | No | Test case status. Max 50 characters. |
version | string | No | Version label. Max 50 characters. |
scenario_id | string | No | Unique ID of the test scenario to link to. |
epic_id | integer | No | ID of the epic to link to. |
feature_id | integer | No | ID of the feature to link to. |
story_id | integer | No | ID of the story to link to. |
POST/test-cases/deleteDelete a test case
Test scenarios5#
Manage test scenarios, the groupings that test cases belong to.
POST/test-scenarios/listList test scenarios
Returns a paginated list of test scenarios, with optional filters.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | No | Unique ID of the project. |
status | string | No | Scenario status. Max 50 characters. |
type | string | No | Scenario type. Max 100 characters. |
q | string | No | Search text. Max 255 characters. |
include_archived | boolean | No | Include archived scenarios. |
page | integer | No | Page number. Starts at 1. |
per_page | integer | No | Results per page. Between 1 and 100. |
POST/test-scenarios/createCreate a test scenario
Creates a test scenario in a project and returns it.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique ID of the project. |
name | string | Yes | Scenario name. Max 255 characters. |
description | string | No | Scenario description. Max 255 characters. |
type | string | No | Scenario type. Max 100 characters. |
coverage_percentage | number | No | Coverage percentage. Between 0 and 100. |
test_strategy_id | integer | No | ID of the test strategy. |
status | string | No | Scenario status. Max 50 characters. |
version | string | No | Version label. Max 50 characters. |
POST/test-scenarios/detailGet a test scenario
POST/test-scenarios/updateUpdate a test scenario
Updates the fields you send on an existing test scenario. Fields you leave out are not changed.
| Name | Type | Required | Description |
|---|---|---|---|
scenario_id | string | Yes | Unique ID of the test scenario. |
name | string | No | Scenario name. Max 255 characters. |
description | string | No | Scenario description. Max 255 characters. |
type | string | No | Scenario type. Max 100 characters. |
coverage_percentage | number | No | Coverage percentage. Between 0 and 100. |
test_strategy_id | integer | No | ID of the test strategy. |
status | string | No | Scenario status. Max 50 characters. |
version | string | No | Version label. Max 50 characters. |
POST/test-scenarios/deleteDelete a test scenario
Test steps5#
Manage the ordered steps inside a test case.
POST/test-steps/listList test steps
Returns the steps of one test case, in order and paginated.
| Name | Type | Required | Description |
|---|---|---|---|
test_case_id | string | Yes | Unique ID of the test case. |
include_archived | boolean | No | Include archived steps. |
page | integer | No | Page number. Starts at 1. |
per_page | integer | No | Results per page. Between 1 and 100. |
POST/test-steps/createCreate a test step
Adds a step to a test case. Send a name, a description, or both.
| Name | Type | Required | Description |
|---|---|---|---|
test_case_id | string | Yes | Unique ID of the test case. |
name | string | No | Step name. Max 255 characters. |
description | string | No | Step description. Max 255 characters. Required when name is not sent. |
expected_result | string | No | Expected result. Max 255 characters. |
outcome | string | No | Actual outcome. Max 255 characters. |
status | string | No | Step status. Max 50 characters. |
version | string | No | Version label. Max 50 characters. |
POST/test-steps/updateUpdate a test step
Updates the fields you send on an existing step. Fields you leave out are not changed.
| Name | Type | Required | Description |
|---|---|---|---|
test_case_id | string | Yes | Unique ID of the test case. |
step_id | string | Yes | Unique ID of the step. |
name | string | No | Step name. Max 255 characters. |
description | string | No | Step description. Max 255 characters. |
expected_result | string | No | Expected result. Max 255 characters. |
outcome | string | No | Actual outcome. Max 255 characters. |
status | string | No | Step status. Max 50 characters. |
version | string | No | Version label. Max 50 characters. |
POST/test-steps/reorderReorder test steps
Sets the order of the steps in a test case. Send the step IDs in the order you want.
| Name | Type | Required | Description |
|---|---|---|---|
test_case_id | string | Yes | Unique ID of the test case. |
step_ids | array | Yes | Step IDs in the new order. At least one is required. |
step_ids.* | string | Yes | Each entry is the unique ID of a step. |
POST/test-steps/deleteDelete a test step
Checklist configuration1#
Read how the checklist framework is set up for the account.
POST/checklists/configGet checklist configuration
Checklist groups4#
Manage the account level catalogue of checklist groups.
POST/checklists/groups/listList checklist groups
POST/checklists/groups/createCreate a checklist group
POST/checklists/groups/updateUpdate a checklist group
Updates the fields you send on an existing checklist group.
| Name | Type | Required | Description |
|---|---|---|---|
group_id | integer | Yes | ID of the checklist group. |
name | string | No | Group name. Max 255 characters. |
color | string | No | Colour code for the group. Max 16 characters. |
is_active | boolean | No | Whether the group is active. |
Checklist templates4#
Manage reusable checklist templates. A template belongs to a checklist group and holds a list of items.
POST/checklists/templates/listList checklist templates
POST/checklists/templates/createCreate a checklist template
Adds a new checklist template, with its items, to a checklist group.
| Name | Type | Required | Description |
|---|---|---|---|
checklist_group_id | integer | Yes | ID of the checklist group. |
name | string | Yes | Template name. Max 255 characters. |
auto_attach | boolean | No | Attach this template automatically when a matching work item is created. |
is_active | boolean | No | Whether the template is active. |
items | array | No | The checklist items in the template. |
items.*.label | string | No | Text of each item. Max 2000 characters. Required when items is sent. |
POST/checklists/templates/updateUpdate a checklist template
Updates the fields you send on an existing checklist template.
| Name | Type | Required | Description |
|---|---|---|---|
template_id | integer | Yes | ID of the checklist template. |
checklist_group_id | integer | No | ID of the checklist group. |
name | string | No | Template name. Max 255 characters. |
auto_attach | boolean | No | Attach this template automatically when a matching work item is created. |
is_active | boolean | No | Whether the template is active. |
items | array | No | The checklist items in the template. |
items.*.label | string | No | Text of each item. Max 2000 characters. Required when items is sent. |
Work item checklists11#
Read and edit the checklist attached to a single work item, such as a task, story, or defect. Groups and items here live on the work item itself, not in the account catalogue.
POST/work-items/checklist/detailGet a work item checklist
Returns the checklist groups, items, and completion counts for one work item.
| Name | Type | Required | Description |
|---|---|---|---|
work_item_type | string | Yes | One of: epic, feature, story, task, defect, test_scenario, test_case, test_defect, project, program. |
work_item_id | integer | Yes | Numeric ID of the work item. |
POST/work-items/checklist/items/addAdd a checklist item
Adds one item to a checklist group on a work item.
| Name | Type | Required | Description |
|---|---|---|---|
work_item_type | string | Yes | One of: epic, feature, story, task, defect, test_scenario, test_case, test_defect, project, program. |
work_item_id | integer | Yes | Numeric ID of the work item. |
work_item_group_id | integer | Yes | ID of the checklist group on the work item. |
label | string | Yes | Text of the item. Max 2000 characters. |
POST/work-items/checklist/items/updateUpdate a checklist item
POST/work-items/checklist/items/deleteDelete a checklist item
POST/work-items/checklist/items/completeComplete a checklist item
POST/work-items/checklist/groups/addAdd a checklist group
Copies a group from the account catalogue onto a work item.
| Name | Type | Required | Description |
|---|---|---|---|
work_item_type | string | Yes | One of: epic, feature, story, task, defect, test_scenario, test_case, test_defect, project, program. |
work_item_id | integer | Yes | Numeric ID of the work item. |
source_group_id | integer | Yes | ID of the catalogue checklist group to copy. |
POST/work-items/checklist/groups/create-customCreate a custom checklist group
Creates a group that exists only on this work item, not in the account catalogue.
| Name | Type | Required | Description |
|---|---|---|---|
work_item_type | string | Yes | One of: epic, feature, story, task, defect, test_scenario, test_case, test_defect, project, program. |
work_item_id | integer | Yes | Numeric ID of the work item. |
name | string | Yes | Group name. Max 255 characters. |
POST/work-items/checklist/groups/renameRename a checklist group
POST/work-items/checklist/groups/deleteDelete a checklist group
POST/work-items/checklist/groups/reorderReorder checklist groups
Sets the order of the checklist groups on a work item.
| Name | Type | Required | Description |
|---|---|---|---|
work_item_type | string | Yes | One of: epic, feature, story, task, defect, test_scenario, test_case, test_defect, project, program. |
work_item_id | integer | Yes | Numeric ID of the work item. |
group_ids | array | Yes | Group IDs in the new order. At least one is required. |
group_ids.* | integer | Yes | Each entry is the ID of a checklist group. |
POST/work-items/checklist/groups/add-from-templateAdd a checklist group from a template
Adds a group to a work item using a checklist template, including all of its items.
| Name | Type | Required | Description |
|---|---|---|---|
work_item_type | string | Yes | One of: epic, feature, story, task, defect, test_scenario, test_case, test_defect, project, program. |
work_item_id | integer | Yes | Numeric ID of the work item. |
template_id | integer | Yes | ID of the checklist template to apply. |
Defects6#
Track defects raised against a project, and link them to test cases, test steps, or tasks.
POST/defects/listList defects
Returns a paginated list of defects, with optional filters.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | No | Unique ID of the project. |
status | string | No | Defect status. Max 50 characters. |
priority | string | No | Defect priority. Max 50 characters. |
severity | string | No | Defect severity. Max 50 characters. |
test_case_id | string | No | Unique ID of a linked test case. |
q | string | No | Search text. Max 255 characters. |
page | integer | No | Page number. Starts at 1. |
per_page | integer | No | Results per page. Between 1 and 100. |
POST/defects/createCreate a defect
Raises a new defect in a project and returns it.
| Name | Type | Required | Description |
|---|---|---|---|
project_id | string | Yes | Unique ID of the project. |
title | string | Yes | Defect title. Max 255 characters. |
description | string | No | Defect description. Max 255 characters. |
type | string | No | Defect type. Max 50 characters. |
priority | string | No | Defect priority. Max 50 characters. |
severity | string | No | Defect severity. Max 50 characters. |
status | string | No | Defect status. Max 50 characters. |
test_case_id | string | No | Unique ID of the test case to link to. |
test_step_id | string | No | Unique ID of the test step to link to. |
task_id | string | No | Unique ID of the task to link to. |
epic_id | integer | No | ID of the epic to link to. |
feature_id | integer | No | ID of the feature to link to. |
POST/defects/detailGet a defect
POST/defects/updateUpdate a defect
Updates the fields you send on an existing defect. Fields you leave out are not changed.
| Name | Type | Required | Description |
|---|---|---|---|
defect_id | string | Yes | Unique ID of the defect. |
title | string | No | Defect title. Max 255 characters. |
description | string | No | Defect description. Max 255 characters. |
type | string | No | Defect type. Max 50 characters. |
priority | string | No | Defect priority. Max 50 characters. |
severity | string | No | Defect severity. Max 50 characters. |
status | string | No | Defect status. Max 50 characters. |
epic_id | integer | No | ID of the epic to link to. |
feature_id | integer | No | ID of the feature to link to. |
POST/defects/linkLink a defect
Links a defect to a test case, a test step, or a task. Send at least one of the three.
| Name | Type | Required | Description |
|---|---|---|---|
defect_id | string | Yes | Unique ID of the defect. |
test_case_id | string | No | Unique ID of the test case. Required when test_step_id and task_id are both missing. |
test_step_id | string | No | Unique ID of the test step. |
task_id | string | No | Unique ID of the task. |
Something wrong here?
If an endpoint behaves differently from what this page says, the page is probably out of date and we want to know. Email support@orangescrum.com with the endpoint and what you saw.
Looking to let an AI assistant work in Orangescrum instead of writing an integration? See the MCP server.