{ "opencollection": "1.0.0", "info": { "name": "PlanRadar's API Documentation Approval Requests V2 Tickets V2 API", "version": "2.0" }, "items": [ { "info": { "name": "Tickets V2", "type": "folder" }, "items": [ { "info": { "name": "Retrieve journals for all accessible tickets in a project", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/journals", "params": [ { "name": "customer_id", "value": "ymjxnx", "type": "path", "description": "Encoded customer ID" }, { "name": "project_id", "value": "xqwprl", "type": "path", "description": "Encoded project ID" }, { "name": "last_sync_date", "value": "2026-03-20T10:15:00Z", "type": "query", "description": "ISO 8601 datetime. Only return journal entries created on or after this datetime. Use for incremental sync — pass the timestamp from your last successful sync." }, { "name": "prop_keys", "value": "", "type": "query", "description": "Comma-separated list of journal_details.prop_key values to filter by (e.g. status_id, assigned_to_id). When provided, only journals with a matching detail row are returned." }, { "name": "page", "value": "1", "type": "query", "description": "Page number (1-based). Defaults to 1." }, { "name": "pagesize", "value": "50", "type": "query", "description": "Number of journal entries per page. Default: 50. Maximum: 100 (server-enforced, values above 100 are clamped)." } ] }, "docs": "Retrieve journal entries for every ticket the caller can access within the given project,\nin a single API call. Intended to replace individual `GET /tickets/{uuid}/journals` calls\nduring ERP sync integrations.\n\nCounts as **1 API call**. Only returns journals from tickets the user has access to within\nthe specified project. Field-level and document permissions are respected. Each journal\nentry includes `ticket-uuid` for mapping back to its ticket.\n\n**Pagination:** default 50, max 100 (server-enfo" }, { "info": { "name": "Returns all tickets", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path", "description": "Set project_id to `0` if you want to load the tickets of all projects" }, { "name": "page", "value": "", "type": "query", "description": "sets the number of pages for the returned tickets" }, { "name": "pagesize", "value": "", "type": "query", "description": "sets the number of tickets that should be returned per page
Maximum is 500, default is 100" }, { "name": "last_sync_date", "value": "", "type": "query", "description": "is a Unix Timestamp. If it is set, only tickets that were created after that timestamp will be returned" }, { "name": "sort", "value": "", "type": "query" }, { "name": "filter[status_id]", "value": "", "type": "query", "description": "Simple status ID filter. Use status codes: 1=Open, 2=In-Progress, 3=Resolved, 4=Feedback, 5=Closed, 6=Rejected. Example: filter[status_id]=1 - Structured filter parameter supporting multiple conditions and predicates. You can use either simple or advanced format.
\n Status ID Mapping: 1 (lm)=Open, 2 (ol)=In-Progress, 3 (ma)=Resolved, 4 (ex)=Feedback, 5 (gk)=Closed, 6 (ky)=Rejected
\n Simple Format: filter[{field}]={value} - Example: filter[status_id]=1
\n Advanced Format: filter[{field}][][predicate]={predicate}&filter[{field}][][value][]={value}
\n Supported Fields: status_id, priority-id, assigned-to-id, author-id, subject, created-at, due-date, etc.
\n Predicates: eq (equals), neq (not equals), in (in list), not_in (not in list), like (contains), not_like (not contains), between (range), has (has value), has_not (no value), le (less/equal), ge (greater/equal)
\n Examples:
\n • Simple: filter[status_id]=1 for filtering tickets with status 1
\n • Advanced: filter[status_id][][predicate]=in&filter[status_id][][value][]=1&filter[status_id][][value][]=2 for filtering tickets with status 1 or 2" }, { "name": "apply_filter", "value": "", "type": "query" }, { "name": "load_images", "value": "", "type": "query", "description": "sets whether or not the images of a ticket should be returned" }, { "name": "can_have_parent", "value": "", "type": "query", "description": "load only ticket that could have parent" }, { "name": "search", "value": "", "type": "query", "description": "keyword, based on which the tickets will be filtered" } ] }, "docs": "This API returns all tickets of a specific project.
\n Without any extra parameters it will return the first 100 tickets ordered by ascending ID. Extra parameters can be added to filter and sort the results.
\n Ticket Sorting:\n Tickets can be sorted by their attributes like component_id, priority_id etc. .\n The sort is always ascending unless the field name is prefixed with a minus (U+002D HYPHEN-MINUS, “-“) i.e. `-id` or `id`.\n
Example: `/t" }, { "info": { "name": "Creates ticket", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" } ] }, "docs": "This API is used for creating a ticket.
\n customer-id: Can be set to null in the request body to create a ticket without a customer association (used for form field attachment pre-upload tickets).
\n The response includes typed_values_metadata which contains metadata about form field attachments (e.g. has_attachments per field_id).

\n Note: Do not modify the meta-options attribute - it is reserved for internal use.\n

\n The response includes a typed_values_metadata attribute, which is a JSON object containing metadata about typed field values.\n For form field attachment fields, it includes has_attachments per field_id.
\n Example: { \"ft123456789\": { \"has_attachments\": true } }

\n Note: Do not modify the meta-options attribute - it is reserved for internal use." }, { "info": { "name": "Updates specific ticket", "type": "http" }, "http": { "method": "PUT", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/:uuid", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" }, { "name": "uuid", "value": "", "type": "path", "description": "unique identifier of the ticket" }, { "name": "clean_up_assets", "value": "", "type": "query", "description": "If set to true, triggers a background job to remove any orphaned assets (images, documents, audios, videos) that no longer belong to the ticket" } ] }, "docs": "This API is used for updating the details of a specific ticket based on its uuid.
\n The response includes typed_values_metadata which contains metadata about form field attachments (e.g. has_attachments per field_id).

\n Note: Do not modify the meta-options attribute - it is reserved for internal use." }, { "info": { "name": "Deletes specific ticket", "type": "http" }, "http": { "method": "DELETE", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/:uuid", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" }, { "name": "uuid", "value": "", "type": "path", "description": "unique identifier of the ticket" } ] }, "docs": "This API is used for deleting a specific ticket based on its uuid." }, { "info": { "name": "Marks specific ticket as seen", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/:uuid/mark_as_seen", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" }, { "name": "uuid", "value": "", "type": "path", "description": "unique identifier of the ticket" } ] }, "docs": "This API is used for marking a specific ticket as seen if the request is done by the ticket asignee, else it returns whether or not the ticket was marked as seen. " }, { "info": { "name": "Exports filtered tickets as PDF", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/export/pdf", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" }, { "name": "pagesize", "value": "", "type": "query", "description": "Maximum is 500, default is 100" }, { "name": "last_sync_date", "value": "", "type": "query" }, { "name": "sort", "value": "", "type": "query" }, { "name": "filter[status_id]", "value": "", "type": "query", "description": "Simple status ID filter. Use status codes: 1=Open, 2=In-Progress, 3=Resolved, 4=Feedback, 5=Closed, 6=Rejected. Example: filter[status_id]=1 - Structured filter parameter supporting multiple conditions and predicates. You can use either simple or advanced format.
\n Status ID Mapping: 1 (lm)=Open, 2 (ol)=In-Progress, 3 (ma)=Resolved, 4 (ex)=Feedback, 5 (gk)=Closed, 6 (ky)=Rejected
\n Simple Format: `filter[{field}]={value}` - Direct field-value filtering
\n Advanced Format: `filter[{field}][][predicate]={predicate}&filter[{field}][][value][]={value}` - Complex filtering with predicates
\n Supported Fields: status_id, priority-id, assigned-to-id, author-id, subject, created-at, due-date, etc.
\n Predicates: eq (equals), neq (not equals), in (in list), not_in (not in list), like (contains), not_like (not contains), between (range), has (has value), has_not (no value), le (less/equal), ge (greater/equal)
\n Simple Format Examples:
\n • Filter by status: `filter[status_id]=1` (Open tickets)
\n • Filter by priority: `filter[priority-id]=3` (High priority)
\n • Multiple simple filters: `filter[status_id]=1&filter[priority-id]=3`
\n Advanced Format Examples:
\n • Status filtering with 'in': `filter[status_id][][predicate]=in&filter[status_id][][value][]=1&filter[status_id][][value][]=2`
\n • Text search with 'like': `filter[subject][][predicate]=like&filter[subject][][value][]=urgent`
\n • Date range filtering: `filter[created-at][][predicate]=between&filter[created-at][][value][]=2024-01-01&filter[created-at][][value][]=2024-12-31`
\n • Complex multiple conditions: `filter[status_id][][predicate]=eq&filter[status_id][][value][]=1&filter[priority-id][][predicate]=eq&filter[priority-id][][value][]=3`" }, { "name": "apply_filter", "value": "", "type": "query", "description": "filterid, based on which the tickets should be filtered" }, { "name": "search", "value": "", "type": "query", "description": "keyword, based on which the tickets should be filtered" }, { "name": "async", "value": "", "type": "query", "description": "Set to true to force asynchronous (background) processing. When enabled, the response returns a job ID instead of the file directly." } ] }, "docs": " This API is used for exporting tickets to pdf files based on their filter. " }, { "info": { "name": "Returns all recurring reminders", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/load_recurring_reminders", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" }, { "name": "page", "value": "", "type": "query", "description": "sets the number of pages for the returned reminders" }, { "name": "pagesize", "value": "", "type": "query", "description": "sets the number of reminders that should be returned per page
Maximum is 500, default is 100" }, { "name": "last_sync_date", "value": "", "type": "query", "description": "is a Unix Timestamp. If it is set, only reminders that were created after that timestamp will be returned" } ] }, "docs": "This API returns all recurring reminders of the tickets of the logged in customer." }, { "info": { "name": "Returns the count of tickets per ticket type", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/ticket_types_stats", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" }, { "name": "filter", "value": "", "type": "query" }, { "name": "apply_filter", "value": "", "type": "query" } ] }, "docs": "This API returns the count of tickets per ticket types. Extra parameters can be added to filter the results.\n
Ticket Filtering \n You can filter the results by one of your created filters by providing its id to the apply_filter parameter.\n
Example: ticket_types_stats?apply_filter=jpg\n
Moreover, the results can be filtered based on any condition of the related model.\n filter[author_id]=1 will list all tickets related to this author id.\n fil" }, { "info": { "name": "Updates multiple tickets at once", "type": "http" }, "http": { "method": "PUT", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/batch_update", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" } ] }, "docs": "This API is used for updating multiple tickets at once based on the provided filteration. However, no filter will update all the data of the project.\n
\n Filtering \n You can filter the tickets by one of your created filters by providing its id to the apply_filter attribute.\n Moreover, the tickets can be filtered based on any condition of the related model. These have to be set in the filter object of the body.\n Multiple filters can be used at the same time.\n " }, { "info": { "name": "Updates multiple tickets with array", "type": "http" }, "http": { "method": "PUT", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/multi_update", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" } ] }, "docs": "This API is used for updating multiple tickets at once based on the uuid." }, { "info": { "name": "Deletes multiple tickets at once", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/batch_delete", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" } ] }, "docs": "This API is used for deleting multiple tickets at once based on the provided filteration. However, no filter will delete all the data of the project.\n
\n Filtering \n You can filter the tickets by one of your created filters by providing its id to the apply_filter attribute.\n Moreover, the tickets can be filtered based on any condition of the related model. These have to be set in the filter object of the body.\n Multiple filters can be used at the same time.\n " }, { "info": { "name": "Duplicates multiple tickets at once", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/batch_duplicate", "params": [ { "name": "customer_id", "value": "", "type": "path" }, { "name": "project_id", "value": "", "type": "path" } ] }, "docs": "This API is used for duplicating multiple tickets at once based on the provided filteration.\n
\n Filtering \n You can filter the tickets by one of your created filters by providing its id to the apply_filter attribute.\n Moreover, the tickets can be filtered based on any condition of the related model. These have to be set in the filter object of the body.\n Multiple filters can be used at the same time.\n
\n Example:\n\n {\n \"filter\":{\n " }, { "info": { "name": "Creates multiple tickets at once", "type": "http" }, "http": { "method": "POST", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/bulk_create", "params": [ { "name": "customer_id", "value": "", "type": "path", "description": "Encoded customer ID" }, { "name": "project_id", "value": "", "type": "path", "description": "Encoded project ID — all tickets in the request are created in this project" } ] }, "docs": "This API is used for creating multiple tickets in a single request.\n All tickets in one request are created in the project from the URL path; cross-project bulk creation is not supported.\n

\n Required Fields
\n Each ticket object requires at minimum ticket-type-id and component-id. All other fields are optional.\n All IDs in the request body must be encoded (same encoding used across all PlanRadar APIs).\n Field names us" }, { "info": { "name": "Returns the status of a bulk create job", "type": "http" }, "http": { "method": "GET", "url": "{{baseUrl}}/api/v2/:customer_id/projects/:project_id/tickets/bulk_create_status", "params": [ { "name": "customer_id", "value": "", "type": "path", "description": "Encoded customer ID" }, { "name": "project_id", "value": "", "type": "path", "description": "Encoded project ID" }, { "name": "job_id", "value": "", "type": "query", "description": "Job identifier returned by the bulk_create endpoint (<uuid>-<timestamp> format)" } ] }, "docs": "Returns the current status of a bulk create job previously enqueued via the\n bulk_create endpoint. Poll this endpoint with the job_id returned by\n bulk_create to track progress and completion.\n

\n Status values\n