openapi: 3.1.0
info:
title: Freshdesk REST 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/
externalDocs:
description: Freshdesk API Documentation
url: https://developers.freshdesk.com/api/
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.
tags:
- name: Agents
description: >-
Manage support agents and their properties.
- name: Business Hours
description: >-
Manage business hour schedules used in SLA calculations.
- name: Companies
description: >-
Manage companies (organizations) associated with contacts.
- name: Contacts
description: >-
Manage contacts (end users) who submit support tickets.
- name: Conversations
description: >-
Manage replies, notes, and conversation threads on tickets.
- name: Email Configs
description: >-
Manage email mailbox configurations for the helpdesk.
- name: Groups
description: >-
Manage agent groups for ticket assignment and routing.
- name: Products
description: >-
Manage products to categorize tickets by product line.
- name: Roles
description: >-
Manage roles that define agent permissions.
- name: Satisfaction Ratings
description: >-
View customer satisfaction survey ratings on tickets.
- name: Search
description: >-
Search across tickets, contacts, and companies using query syntax.
- name: SLA Policies
description: >-
Manage service level agreement policies for ticket response and
resolution times.
- name: Solutions
description: >-
Manage knowledge base solution categories, folders, and articles.
- name: Tickets
description: >-
Manage support tickets including creation, updates, bulk operations,
merging, and lifecycle management.
- name: Time Entries
description: >-
Track time spent on tickets by agents.
security:
- basicAuth: []
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}/conversations:
get:
operationId: listTicketConversations
summary: List conversations on a ticket
description: >-
Retrieves all conversations (replies and notes) associated with
the specified ticket.
tags:
- Conversations
parameters:
- $ref: '#/components/parameters/ticketId'
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/perPage'
responses:
'200':
description: Successfully retrieved conversations.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Conversation'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/reply:
post:
operationId: replyToTicket
summary: Reply to a ticket
description: >-
Adds a reply to the specified ticket. The reply is sent as an email
to the requester and any CC'd addresses.
tags:
- Conversations
parameters:
- $ref: '#/components/parameters/ticketId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ReplyCreate'
responses:
'201':
description: Reply created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Conversation'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/notes:
post:
operationId: createNote
summary: Create a note on a ticket
description: >-
Adds an internal or public note to the specified ticket. Private
notes are visible only to agents.
tags:
- Conversations
parameters:
- $ref: '#/components/parameters/ticketId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/NoteCreate'
responses:
'201':
description: Note created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Conversation'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/forward:
post:
operationId: forwardTicket
summary: Forward a ticket
description: >-
Forwards the specified ticket to one or more email addresses.
tags:
- Conversations
parameters:
- $ref: '#/components/parameters/ticketId'
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- body
- to_emails
properties:
body:
type: string
description: >-
Content of the forward message in HTML format.
to_emails:
type: array
items:
type: string
format: email
description: >-
Email addresses to forward the ticket to.
responses:
'201':
description: Ticket forwarded successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Conversation'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/conversations/{conversation_id}:
put:
operationId: updateConversation
summary: Update a conversation
description: >-
Updates the body of an existing conversation (reply or note).
tags:
- Conversations
parameters:
- $ref: '#/components/parameters/conversationId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
body:
type: string
description: >-
Updated content of the conversation in HTML format.
responses:
'200':
description: Conversation updated successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Conversation'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteConversation
summary: Delete a conversation
description: >-
Deletes a conversation (note) from a ticket. Only notes can be
deleted; replies cannot be removed.
tags:
- Conversations
parameters:
- $ref: '#/components/parameters/conversationId'
responses:
'204':
description: Conversation deleted successfully.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/time_entries:
get:
operationId: listTicketTimeEntries
summary: List time entries for a ticket
description: >-
Retrieves all time entries associated with the specified ticket.
tags:
- Time Entries
parameters:
- $ref: '#/components/parameters/ticketId'
responses:
'200':
description: Successfully retrieved time entries.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
post:
operationId: createTimeEntry
summary: Create a time entry
description: >-
Adds a new time entry to the specified ticket to track agent effort.
tags:
- Time Entries
parameters:
- $ref: '#/components/parameters/ticketId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntryCreate'
responses:
'201':
description: Time entry created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntry'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/time_entries:
get:
operationId: listAllTimeEntries
summary: List all time entries
description: >-
Retrieves all time entries across all tickets, with optional filters.
tags:
- Time Entries
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/perPage'
responses:
'200':
description: Successfully retrieved time entries.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
/time_entries/{time_entry_id}:
put:
operationId: updateTimeEntry
summary: Update a time entry
description: >-
Updates the properties of an existing time entry.
tags:
- Time Entries
parameters:
- $ref: '#/components/parameters/timeEntryId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntryCreate'
responses:
'200':
description: Time entry updated successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteTimeEntry
summary: Delete a time entry
description: >-
Deletes a time entry from a ticket.
tags:
- Time Entries
parameters:
- $ref: '#/components/parameters/timeEntryId'
responses:
'204':
description: Time entry deleted successfully.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/time_entries/{time_entry_id}/toggle_timer:
put:
operationId: toggleTimer
summary: Toggle a timer
description: >-
Starts or stops the timer on a time entry.
tags:
- Time Entries
parameters:
- $ref: '#/components/parameters/timeEntryId'
responses:
'200':
description: Timer toggled successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/TimeEntry'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/tickets/{ticket_id}/satisfaction_ratings:
post:
operationId: createSatisfactionRating
summary: Create a satisfaction rating
description: >-
Creates a satisfaction rating for the specified ticket.
tags:
- Satisfaction Ratings
parameters:
- $ref: '#/components/parameters/ticketId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SatisfactionRatingCreate'
responses:
'201':
description: Satisfaction rating created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/SatisfactionRating'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/surveys/satisfaction_ratings:
get:
operationId: listSatisfactionRatings
summary: List all satisfaction ratings
description: >-
Retrieves all satisfaction ratings across tickets, with optional
filters for date range and satisfaction score.
tags:
- Satisfaction Ratings
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/perPage'
- name: created_since
in: query
description: >-
Return ratings created since the given date-time.
schema:
type: string
format: date-time
responses:
'200':
description: Successfully retrieved satisfaction ratings.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/SatisfactionRating'
'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'
/contacts:
get:
operationId: listContacts
summary: List all contacts
description: >-
Retrieves a paginated list of contacts. Contacts can be filtered
by email, phone, mobile, company, or state.
tags:
- Contacts
parameters:
- $ref: '#/components/parameters/page'
- $ref: '#/components/parameters/perPage'
- name: email
in: query
description: >-
Filter contacts by email address.
schema:
type: string
format: email
- name: phone
in: query
description: >-
Filter contacts by phone number.
schema:
type: string
- name: mobile
in: query
description: >-
Filter contacts by mobile number.
schema:
type: string
- name: company_id
in: query
description: >-
Filter contacts by company ID.
schema:
type: integer
format: int64
- name: state
in: query
description: >-
Filter contacts by state.
schema:
type: string
enum:
- blocked
- deleted
- unverified
- verified
responses:
'200':
description: Successfully retrieved list of contacts.
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Contact'
'401':
$ref: '#/components/responses/Unauthorized'
post:
operationId: createContact
summary: Create a contact
description: >-
Creates a new contact in the helpdesk. At minimum, an email, phone,
mobile, or twitter_id must be provided.
tags:
- Contacts
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactCreate'
responses:
'201':
description: Contact created successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
/contacts/{contact_id}:
get:
operationId: getContact
summary: View a contact
description: >-
Retrieves the details of a specific contact by ID.
tags:
- Contacts
parameters:
- $ref: '#/components/parameters/contactId'
responses:
'200':
description: Successfully retrieved contact details.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
put:
operationId: updateContact
summary: Update a contact
description: >-
Updates the properties of an existing contact.
tags:
- Contacts
parameters:
- $ref: '#/components/parameters/contactId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ContactCreate'
responses:
'200':
description: Contact updated successfully.
content:
application/json:
schema:
$ref: '#/components/schemas/Contact'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
delete:
operationId: deleteContact
summary: Delete a contact
description: >-
Soft-deletes a contact. The contact can be restored later.
tags:
- Contacts
parameters:
- $ref: '#/components/parameters/contactId'
responses:
'204':
description: Contact deleted successfully.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/contacts/{contact_id}/restore:
put:
operationId: restoreContact
summary: Restore a deleted contact
description: >-
Restores a previously soft-deleted contact.
tags:
- Contacts
parameters:
- $ref: '#/components/parameters/contactId'
responses:
'204':
description: Contact restored successfully.
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
/contacts/merge:
post:
operationId: mergeContacts
summary: Merge contacts
description: >-
Merges secondary contacts into a primary contact. The secondary
contacts are deleted and their tickets are reassigned to the primary.
tags:
- Contacts
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- primary_contact_id
- secondary_contact_ids
properties:
primary_contact_id:
type: integer
format: int64
description: >-
# --- truncated at 32 KB (112 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/freshdesk/refs/heads/main/openapi/freshdesk-rest-api-openapi.yml