Freshdesk REST API

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, and business hours. The API uses JSON for request and response payloads, supports API key-based authentication, and follows RESTful conventions for CRUD operations.

OpenAPI Specification

freshdesk-rest-api-openapi.yml Raw ↑
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