freshdesk Tickets API
Manage support tickets including creation, updates, bulk operations, merging, and lifecycle management.
Manage support tickets including creation, updates, bulk operations, merging, and lifecycle management.
openapi: 3.1.0
info:
title: Freshdesk REST Agents Tickets API
description: The Freshdesk REST API (v2) provides programmatic access to helpdesk data and operations within Freshdesk, a customer support platform by Freshworks. It exposes endpoints for managing tickets, contacts, companies, agents, groups, conversations, products, email configurations, SLA policies, business hours, time entries, satisfaction ratings, solution categories, solution folders, solution articles, and more. The API uses JSON for request and response payloads, supports API key-based authentication, and follows RESTful conventions for CRUD operations.
version: '2.0'
contact:
name: Freshdesk Support
url: https://support.freshdesk.com/
termsOfService: https://www.freshworks.com/terms/
servers:
- url: https://{domain}.freshdesk.com/api/v2
description: Freshdesk Production Server
variables:
domain:
default: yourdomain
description: Your Freshdesk subdomain, e.g. if your helpdesk URL is acme.freshdesk.com, use acme.
security:
- basicAuth: []
tags:
- name: Tickets
description: Manage support tickets including creation, updates, bulk operations, merging, and lifecycle management.
paths:
/tickets:
get:
operationId: listTickets
summary: List all tickets
description: Retrieves a paginated list of tickets from the helpdesk. By default, only tickets that have not been deleted or marked as spam are returned. Use filter query parameters to narrow results by status, requester, agent, group, or updated date.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/perPage'
- name: filter
in: query
description: Pre-defined filter to apply. Options include new_and_my_open, watching, spam, deleted.
schema:
type: string
enum:
- new_and_my_open
- watching
- spam
- deleted
- name: requester_id
in: query
description: Filter tickets by requester ID.
schema:
type: integer
format: int64
- name: email
in: query
description: Filter tickets by requester email address.
schema:
type: string
format: email
- name: updated_since
in: query
description: Return tickets updated since the given date-time in UTC format.
schema:
type: string
format: date-time
- name: order_by
in: query
description: Field to order results by.
schema:
type: string
enum:
- created_at
- due_by
- updated_at
- status
default: created_at
- name: order_type
in: query
description: Sort direction for results.
schema:
type: string
enum:
- asc
- desc
default: desc
- name: include
in: query
description: Include additional information such as requester, stats, or description.
schema:
type: string
enum:
- requester
- stats
- description
responses:
'200':
description: Successfully retrieved list of tickets.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Ticket'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createTicket
summary: Create a ticket
description: Creates a new support ticket. At minimum, a requester identifier (email, phone, requester_id, or twitter_id) and a subject or description must be provided.
tags:
- Tickets
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TicketCreate'
responses:
'201':
description: Ticket created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/tickets/{ticket_id}:
get:
operationId: getTicket
summary: View a ticket
description: Retrieves the details of a specific ticket by its ID, including all standard and custom fields.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/ticketId'
- name: include
in: query
description: Include additional information in the response.
schema:
type: string
enum:
- conversations
- requester
- company
- stats
responses:
'200':
description: Successfully retrieved ticket details.
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateTicket
summary: Update a ticket
description: Updates the properties of an existing ticket. Only the fields provided in the request body will be updated.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/ticketId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TicketUpdate'
responses:
'200':
description: Ticket updated successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteTicket
summary: Delete a ticket
description: Soft-deletes a ticket, moving it to the trash. The ticket can be restored later using the restore endpoint.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/ticketId'
responses:
'204':
description: Ticket deleted successfully.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/restore:
put:
operationId: restoreTicket
summary: Restore a deleted ticket
description: Restores a previously soft-deleted ticket from the trash.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/ticketId'
responses:
'204':
description: Ticket restored successfully.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/outbound_email:
post:
operationId: createOutboundEmail
summary: Create an outbound email ticket
description: Creates a new outbound email ticket, allowing agents to initiate email conversations with customers.
tags:
- Tickets
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TicketCreate'
responses:
'201':
description: Outbound email ticket created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Ticket'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/tickets/{ticket_id}/watchers:
get:
operationId: listTicketWatchers
summary: List watchers on a ticket
description: Retrieves the list of agents watching the specified ticket.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/ticketId'
responses:
'200':
description: Successfully retrieved watchers.
content:
application/json:
schema:
type: object
properties:
watcher_ids:
type: array
items:
type: integer
format: int64
description: List of agent IDs watching the ticket.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/watch:
post:
operationId: watchTicket
summary: Watch a ticket
description: Adds the authenticated agent as a watcher on the specified ticket.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/ticketId'
responses:
'204':
description: Successfully added as a watcher.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/associated_tickets:
get:
operationId: listAssociatedTickets
summary: List associated tickets
description: Retrieves tickets associated with the specified tracker ticket.
tags:
- Tickets
parameters:
- $ref: '#/components/parameters/ticketId'
responses:
'200':
description: Successfully retrieved associated tickets.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Ticket'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/merge:
put:
operationId: mergeTickets
summary: Merge tickets
description: Merges one or more secondary tickets into a primary ticket. The secondary tickets are closed and their conversations are added to the primary ticket.
tags:
- Tickets
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- primary_id
- ticket_ids
properties:
primary_id:
type: integer
format: int64
description: ID of the primary ticket to merge into.
ticket_ids:
type: array
items:
type: integer
format: int64
description: IDs of secondary tickets to merge.
responses:
'200':
description: Tickets merged successfully.
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/tickets/bulk_update:
post:
operationId: bulkUpdateTickets
summary: Bulk update tickets
description: Updates properties on multiple tickets at once.
tags:
- Tickets
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- ids
- properties
properties:
ids:
type: array
items:
type: integer
format: int64
description: IDs of tickets to update.
properties:
type: object
description: Key-value pairs of ticket properties to update.
responses:
'202':
description: Bulk update accepted for processing.
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/tickets/bulk_delete:
post:
operationId: bulkDeleteTickets
summary: Bulk delete tickets
description: Soft-deletes multiple tickets at once, moving them to the trash.
tags:
- Tickets
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- ids
properties:
ids:
type: array
items:
type: integer
format: int64
description: IDs of tickets to delete.
responses:
'202':
description: Bulk delete accepted for processing.
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/ticket_fields:
get:
operationId: listTicketFields
summary: List all ticket fields
description: Retrieves all default and custom ticket fields.
tags:
- Tickets
responses:
'200':
description: Successfully retrieved ticket fields.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Field'
'401':
$ref: '#/components/responses/Unauthorized'
components:
responses:
Unauthorized:
description: Authentication failed or credentials were not provided.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: The request is invalid or malformed.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: The requested resource was not found.
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
schemas:
TicketCreate:
type: object
properties:
subject:
type: string
description: Subject of the ticket.
description:
type: string
description: HTML content of the ticket description.
email:
type: string
format: email
description: Email address of the requester. Required if requester_id, phone, or twitter_id is not provided.
phone:
type: string
description: Phone number of the requester.
requester_id:
type: integer
format: int64
description: ID of the requester contact.
status:
type: integer
description: Status of the ticket. 2=Open, 3=Pending, 4=Resolved, 5=Closed.
enum:
- 2
- 3
- 4
- 5
priority:
type: integer
description: Priority of the ticket. 1=Low, 2=Medium, 3=High, 4=Urgent.
enum:
- 1
- 2
- 3
- 4
source:
type: integer
description: Channel source of the ticket.
type:
type: string
description: Type of the ticket.
responder_id:
type: integer
format: int64
description: ID of the agent to assign.
group_id:
type: integer
format: int64
description: ID of the group to assign.
product_id:
type: integer
format: int64
description: ID of the associated product.
cc_emails:
type: array
items:
type: string
format: email
description: Email addresses to CC.
tags:
type: array
items:
type: string
description: Tags to add to the ticket.
custom_fields:
type: object
additionalProperties: true
description: Custom field values keyed by field name with cf_ prefix.
Field:
type: object
properties:
id:
type: integer
format: int64
description: Unique identifier of the field.
name:
type: string
description: Internal name of the field.
label:
type: string
description: Display label of the field.
description:
type: string
nullable: true
description: Description of the field.
type:
type: string
description: Data type of the field.
default:
type: boolean
description: Whether this is a default system field.
required_for_closure:
type: boolean
description: Whether this field must be filled before closing a ticket.
required_for_agents:
type: boolean
description: Whether this field is required when agents create tickets.
required_for_customers:
type: boolean
description: Whether this field is required when customers create tickets.
choices:
type: array
items:
type: string
nullable: true
description: Available choices for dropdown fields.
created_at:
type: string
format: date-time
description: Timestamp when the field was created.
updated_at:
type: string
format: date-time
description: Timestamp when the field was last updated.
Ticket:
type: object
properties:
id:
type: integer
format: int64
description: Unique identifier of the ticket.
subject:
type: string
description: Subject of the ticket.
description:
type: string
description: HTML content of the ticket description.
description_text:
type: string
description: Plain-text content of the ticket description.
status:
type: integer
description: Status of the ticket. 2=Open, 3=Pending, 4=Resolved, 5=Closed.
enum:
- 2
- 3
- 4
- 5
priority:
type: integer
description: Priority of the ticket. 1=Low, 2=Medium, 3=High, 4=Urgent.
enum:
- 1
- 2
- 3
- 4
source:
type: integer
description: Channel through which the ticket was created. 1=Email, 2=Portal, 3=Phone, 7=Chat, 9=Feedback Widget, 10=Outbound Email.
enum:
- 1
- 2
- 3
- 7
- 9
- 10
type:
type: string
nullable: true
description: Type of the ticket, e.g. Question, Incident, Problem, Feature Request.
requester_id:
type: integer
format: int64
description: ID of the contact who raised the ticket.
responder_id:
type: integer
format: int64
nullable: true
description: ID of the agent assigned to the ticket.
group_id:
type: integer
format: int64
nullable: true
description: ID of the group the ticket is assigned to.
product_id:
type: integer
format: int64
nullable: true
description: ID of the product associated with the ticket.
company_id:
type: integer
format: int64
nullable: true
description: ID of the company associated with the ticket.
email_config_id:
type: integer
format: int64
nullable: true
description: ID of the email configuration used for the ticket.
cc_emails:
type: array
items:
type: string
format: email
description: Email addresses CC'd on the ticket.
fwd_emails:
type: array
items:
type: string
format: email
description: Email addresses the ticket was forwarded to.
reply_cc_emails:
type: array
items:
type: string
format: email
description: Email addresses CC'd on replies.
to_emails:
type: array
items:
type: string
format: email
nullable: true
description: Email addresses in the To field.
tags:
type: array
items:
type: string
description: Tags associated with the ticket.
custom_fields:
type: object
additionalProperties: true
description: Custom fields set on the ticket, keyed by field name with cf_ prefix.
fr_escalated:
type: boolean
description: Whether the ticket has been escalated for first response SLA breach.
spam:
type: boolean
description: Whether the ticket has been marked as spam.
is_escalated:
type: boolean
description: Whether the ticket has been escalated.
due_by:
type: string
format: date-time
description: Timestamp when the ticket resolution is due.
fr_due_by:
type: string
format: date-time
description: Timestamp when the first response is due.
created_at:
type: string
format: date-time
description: Timestamp when the ticket was created.
updated_at:
type: string
format: date-time
description: Timestamp when the ticket was last updated.
TicketUpdate:
type: object
properties:
subject:
type: string
description: Subject of the ticket.
description:
type: string
description: HTML content of the ticket description.
status:
type: integer
description: Status of the ticket.
enum:
- 2
- 3
- 4
- 5
priority:
type: integer
description: Priority of the ticket.
enum:
- 1
- 2
- 3
- 4
source:
type: integer
description: Channel source of the ticket.
type:
type: string
description: Type of the ticket.
responder_id:
type: integer
format: int64
description: ID of the agent to assign.
group_id:
type: integer
format: int64
description: ID of the group to assign.
product_id:
type: integer
format: int64
description: ID of the associated product.
tags:
type: array
items:
type: string
description: Tags to set on the ticket.
custom_fields:
type: object
additionalProperties: true
description: Custom field values to update.
Error:
type: object
properties:
description:
type: string
description: Human-readable error description.
errors:
type: array
items:
type: object
properties:
field:
type: string
description: Field that caused the error.
message:
type: string
description: Error message for the field.
code:
type: string
description: Error code.
parameters:
perPage:
name: per_page
in: query
description: Number of results per page (max 100).
schema:
type: integer
minimum: 1
maximum: 100
default: 30
ticketId:
name: ticket_id
in: path
required: true
description: Unique identifier of the ticket.
schema:
type: integer
format: int64
page:
name: page
in: query
description: Page number for paginated results.
schema:
type: integer
minimum: 1
default: 1
securitySchemes:
basicAuth:
type: http
scheme: basic
description: Freshdesk uses API key-based authentication. Pass your API key as the username with any string (e.g. X) as the password using HTTP Basic Authentication.
externalDocs:
description: Freshdesk API Documentation
url: https://developers.freshdesk.com/api/