Work with this as data
Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/planradar-tickets-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
OpenAPI Specification
openapi: 3.2.0
info:
title: PlanRadar's API Documentation Approval Requests V2 Tickets API
version: '2.0'
description: "Welcome to PlanRadar's API documentation, here you can find all the details about our APIs as well as test them online.<br />\n <h5>Rate Limits</h5>30 requests per minute per account, aggregated across all tokens.<br />\n If the threshold is exceeded, a 5-minute cooldown is applied to the account, aggregated across all tokens.<br />\n During the cooldown period, further requests may be rejected until the cooldown ends.<br />\n In rare cases, an endpoint may have a different rate limit than the default. When that happens, the differing limit will be explicitly stated in the API documentation for that endpoint.<br />\n <h5>Access Key</h5>In order to be able to access any API you have to create an access token.Therefore you have to follow these steps:-\n <ul>\n <li>Go to your profile page and click on Personal Access Tokens on the left side bar</li><li>Click on the 'Create Access Token' top right button in order to create a new access token.</li><li>Copy the created token and paste it into the field that pops up when you click on the 'Authorize' button </li><li>Note: you can copy the token only once.</li><li>Now you can easily access any API</li>\n </ul>\n <h5>V2 APIs</h5>We are currently working on upgrading all our APIs to v2, and we recommend that you use v2 APIs if it is available.\n <p>V2 APIs are faster, robust and more flexible than v1 APIs</p>"
servers:
- url: /
tags:
- name: Tickets
description: All operations on PlanRadar tickets
paths:
/api/v1/{customer_id}/projects/{project_id}/tickets/load:
get:
summary: Retrieves All tickets
tags:
- Tickets
description: "Load all tickets from a specific project <br />\n Without any extra parameters it will return the first 100 tickets ordered by ID ascending. Extra parameters can be added to filter and sort the results.<br />\n <b>Ticket Sorting:</b>\n Field name to sort the results based on it, sort is always ascending unless the field name is prefixed with a minus (U+002D HYPHEN-MINUS, “-“) i.e. `-id` or `id`\n <br /><b>Example: </b> `tickets/load?sort=-component_id`<br />\n <b>Ticket Filtring:</b>\n You can use a saved filter by providing its id to the `apply_filter` parameter. Also, you can use the on-fly filters.<br />\n <b>On-Fly Filters</b>\n You can filter tickets based on the value of any of its attributes<br />\n <b>Example #1:</b> All tickets where status is open\n `tickets/load?filter[status_id]=1`<br/>\n <b>Example #2:</b> All tickets where status is open, and priority is high\n `tickets/load?filter[status_id]=1&filter[prority_id]=3`\n <br />\n <b>Status Dictionary:</b> [1 (lm)= Open, 2 (ol) = In-Progress, 3 (ma) = Resolved, 4 (ex) = Feedback, 5 (gk) = Closed, 6 (ky) = Rejected]\n <b>Priority Dictionary:</b> [1 = Low, 2 = Normal, 3 = High]\n "
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
description: Set project_id to `0` if you want to load tickets from all projects
schema:
type: string
- name: page
in: query
schema:
type: integer
- name: pagesize
in: query
description: Maximum is 500, default is 100
schema:
type: integer
- name: last_sync_date
in: query
schema:
type: string
- name: sort
in: query
schema:
type: string
- name: filter
in: query
schema:
type: string
- name: apply_filter
in: query
schema:
type: string
- name: search
in: query
description: Search keyword to filter tickets based on it
schema:
type: string
responses:
'406':
description: unsupported accept header
/api/v1/{customer_id}/projects/{project_id}/tickets/multi_update:
put:
summary: Multi Update Tickets based on the provided filteration, no filter will update all data for the project id
tags:
- Tickets
description: Multi update tickets, for typed values it has to be grouped by the ticket type, all any other fields should be added in the attributes, the key is the field name, the value is the new value, filter data is OPTIONAL and can be used in either the query string or in the body of the request or both
x-websocket-response:
channel: user_{customerId}_{userId}
message_type: cable-events
payload:
type: object
properties:
multiupdate-progress:
type: integer
description: Always 1, signals completion
failed-count:
type: integer
description: Number of tickets that failed to update
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
- name: filter
in: query
description: 'Used to filter tickets based on any conditions of the related model, filter[author_id]=1 will list all tickets related to this author id, similar to filter[author.id]=1, the second one will use the condition based on the user table such a filter is available filter[author.email]=test@email.com, for multiple values for the same filter use filter[id][]=PN&filter[id][]=nE,,,, available models are: customer, ticket_type, project, component, status, ticket, author, assigned_to, updated_by, due_by, overdue_by, creation_period'
schema:
type: string
- name: apply_filter
in: query
description: ID of the custom filter to be applied before returning the data
schema:
type: string
responses:
'406':
description: unsupported accept header
requestBody:
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
attributes:
type: object
properties:
field-name:
type: string
ticket_type_id:
type: object
properties:
typed-field-id:
type: string
filter:
type: object
properties:
uuid:
type: array
items:
type: string
component_id:
type: string
required:
- title
- content
/api/v1/{customer_id}/projects/{project_id}/tickets/{uuid}:
get:
summary: Show one ticket based on its UUID
tags:
- Tickets
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
- name: uuid
in: path
required: true
schema:
type: string
responses:
'404':
description: Ticket Not found
put:
summary: Update one ticket
tags:
- Tickets
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
- name: uuid
in: path
description: UUID of the ticket to load
required: true
schema:
type: string
- name: clean_up_assets
in: query
description: If set to true, it will remove any assets that dont belong to the ticket
required: false
schema:
type: boolean
responses:
'404':
description: Ticket Not found
requestBody:
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
attributes:
$ref: '#/components/schemas/Ticket'
required:
- title
- content
delete:
summary: Delete one ticket
tags:
- Tickets
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
- name: uuid
in: path
description: UUID of the ticket to delete
required: true
schema:
type: string
responses:
'404':
description: Ticket Not found
/api/v1/{customer_id}/projects/{project_id}/tickets/:
get:
summary: Retrieves All tickets
tags:
- Tickets
description: "This API is similar to `tickets/load` API the only difference that it retrieves all children ticket in the same page.\n Requesting this API with pagesize = 10 will return the first matched 10 tickets plus all their children tickets.<br />\n Without any extra parameters it will return the first 100 tickets ordered by ID ascending. Extra parameters can be added to filter and sort the results.<br />\n <b>Ticket Sorting:</b>\n Field name to sort the results based on it, sort is always ascending unless the field name is prefixed with a minus (U+002D HYPHEN-MINUS, “-“) i.e. `-id` or `id`\n <br /><b>Example: </b> `tickets/load?sort=-component_id`<br />\n <b>Ticket Filtring:</b>\n You can use a saved filter by providing its id to the `apply_filter` parameter. Also, you can use the on-fly filters.<br />\n <b>On-Fly Filters</b>\n You can filter tickets based on the value of any of its attributes<br />\n <b>Example #1:</b> All tickets where status is open\n `tickets/load?filter[status_id]=1`<br/>\n <b>Example #2:</b> All tickets where status is open, and priority is high\n `tickets/load?filter[status_id]=1&filter[prority_id]=3`\n <br />\n <b>Status Dictionary:</b> [1 (lm)= Open, 2 (ol) = In-Progress, 3 (ma) = Resolved, 4 (ex) = Feedback, 5 (gk) = Closed, 6 (ky) = Rejected]\n <b>Priority Dictionary:</b> [1 = Low, 2 = Normal, 3 = High]\n "
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
description: Set project_id to `0` if you want to load tickets from all projects
required: true
schema:
type: string
- name: page
in: query
schema:
type: integer
- name: pagesize
in: query
description: Maximum is 500, default is 100
schema:
type: integer
- name: last_sync_date
in: query
schema:
type: string
- name: sort
in: query
schema:
type: string
- name: filter
in: query
schema:
type: string
- name: apply_filter
in: query
schema:
type: string
- name: search
in: query
description: Search keyword to filter tickets based on it
schema:
type: string
responses:
'404':
description: Not Found
post:
summary: Create one ticket
tags:
- Tickets
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
responses:
'404':
description: Ticket Not found
requestBody:
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
attributes:
$ref: '#/components/schemas/Ticket'
/api/v1/{customer_id}/projects/{project_id}/tickets/{uuid}/comment:
post:
summary: Add a comment to a Ticket
tags:
- Tickets
description: Add a comment to a specific ticket.
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
- name: uuid
in: path
description: UUID of the ticket to add a comment to it
required: true
schema:
type: string
responses:
'404':
description: Ticket Not found
requestBody:
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
attributes:
type: object
properties:
comment:
type: string
example: Hello World!
created_on:
type: string
description: 'Optional: leave blank and the current time will be used'
required:
- title
- content
/api/v1/{customer_id}/projects/{project_id}/tickets/{uuid}/export:
post:
summary: Export single ticket as PDF
tags:
- Tickets
description: "Export single ticket as a PDF documnet\n If images included in the ticket more than 10, the ticket will be exported in a job.\n <br />\n <b>timezone_offset</b><br />\n Is used to convert all dates included in the PDF document to the correct timezone. the value should be the difference in minutes between UTC and your location."
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
- name: uuid
in: path
description: UUID of the ticket to export
required: true
schema:
type: string
- name: template_id
in: query
description: ID of the template to be used for the export OPTIONAL, leave blank and the default template will be used
schema:
type: string
- name: timezone_offset
in: query
schema:
type: string
responses:
'404':
description: Ticket Not found
/api/v1/{customer_id}/projects/{project_id}/tickets/{uuid}/clone:
post:
summary: Clone a ticket
tags:
- Tickets
description: Copy all the content of a ticket in a new one.
security:
- apiKey: []
parameters:
- name: customer_id
in: path
required: true
schema:
type: string
- name: project_id
in: path
required: true
schema:
type: string
- name: uuid
in: path
description: UUID of the ticket to be cloned
required: true
schema:
type: string
responses:
'404':
description: Ticket Not found
requestBody:
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
attributes:
type: object
properties:
uuid:
type: string
description: New ticket UUID, leave blank, a new UUID will be generated
plan-x:
type: number
description: The new plan-x position of the new ticket
plan-y:
type: number
description: The new plan-y position of the new ticket
required:
- uuid
components:
schemas:
Ticket:
type: object
properties:
ticket-type-id:
type: string
description: ID of the form used in this ticket
component-id:
type: string
description: ID of the layer to add this ticket to
subject:
type: string
example: Ticket title
description: Ticket title, leave empty the default title will be used instead
parent-id:
type: string
description: If you are creating a child ticket, set it to the UUID of the parent ticket
status-id:
type: string
minimum: 1
maximum: 6
example: 1
description: The status of the ticket, the default is Open
priority-id:
type: string
minimum: 1
maximum: 3
example: 1
description: The priority of the ticket, the default is normal
assigned-to-id:
type: string
description: The id or the object of the assignee
example:
legacy: 1
object:
id: 1
type: User | DefectradarGroup
assignee-type:
type: string
description: User OR DefectradarGroup (redundant if assigned-to-id is set to an object)
due-date:
type: date
description: Ticket due date
closed-at:
type: date
description: Ticket closed at date
extension-date:
type: string
description: Extenstion date, should always be bigger that the due date
typed-values:
type: object
example:
tf37e04757dabbca63: 33.5
tfd4367f50e84a9408: some text
tf00a1b2c3d4e5f601: 1
description: The custom defined field values, based on the selected form. Value types depend on the field type (e.g. string for text fields, number for numeric fields, integer 1-3 for CheckListType fields)
subscribers:
type: array
items:
type: integer
description: array of user IDs that are subscribed to this ticket
progress:
type: integer
minimum: 0
maximum: 100
plan-x:
type: number
description: is used to position the ticket on the plan
plan-y:
type: number
description: is used to position the ticket on the plan
uuid:
type: string
description: The unique identifier of the ticket, leave blank and a UUID will be generated
required:
- ticket-type-id
- component-id
securitySchemes:
apiKey:
type: apiKey
name: X-PlanRadar-API-Key
in: header
externalDocs:
description: Find out more about our development portal
url: https://www.planradar.com/knowledge-base-overview/