Skip to content
freshdesk-api logo

Freshdesk API

freshdesk-api

Expert in Freshdesk helpdesk API for building integrations, extracting support data, managing tickets/contacts/companies, and automating support workflows. Use when working with Freshdesk, building helpdesk integrations, analyzing support ticket data, or creating customer support applications.

SKILL.md

Full skill instructions

Freshdesk API

Overview

Build integrations with Freshdesk's helpdesk platform using their REST API v2. Manage support tickets, contacts, companies, agents, and automate workflows. The API supports full CRUD operations on all major resources with filtering, pagination, and embedded data.

When to Use

  • Building helpdesk integrations or support dashboards
  • Extracting and analyzing support ticket data
  • Automating ticket routing, assignment, or updates
  • Syncing contacts/​companies with CRM systems
  • Creating custom reporting on support metrics
  • Implementing chatbots or AI-powered support tools
  • Migrating data to/​from Freshdesk

Prerequisites

API Key Setup

  1. Log into Freshdesk as an Admin
  2. Click your profile picture → Profile Settings
  3. Find your API Key on the right sidebar
  4. Store securely (never commit to version control)
# Set environment variable
export FRESHDESK_API_KEY="your-api-key-here"
export FRESHDESK_DOMAIN="yourcompany"  # From yourcompany.freshdesk.com

Required Tools

  • curl for HTTP requests
  • jq for JSON parsing (brew install jq on macOS)
  • For SDKs: Python 3.6+, Node.js 14+, or Ruby 2.7+

API Base URL

https://{domain}.freshdesk.com/​api/​v2/

Replace {domain} with your Freshdesk subdomain (e.g., acme for acme.freshdesk.com).

Authentication

Freshdesk uses HTTP Basic Authentication with your API key as the username and X as the password.

curl Example

# Using -u flag (username:password)
curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets"

# Using Authorization header
curl -H "Authorization: Basic $(echo -n "$FRESHDESK_API_KEY:X" | base64)" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets"

Headers

Always include:

Content-Type: application/​json

Quick Start

Get All Tickets

curl -u "$FRESHDESK_API_KEY:X" \
  -H "Content-Type: application/​json" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets"

Create a Ticket

curl -u "$FRESHDESK_API_KEY:X" \
  -H "Content-Type: application/​json" \
  -X POST \
  -d '{
    "subject": "Support needed",
    "description": "Details of the issue...",
    "email": "[email protected]",
    "priority": 2,
    "status": 2
  }' \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets"

Get a Contact

curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​contacts/​12345"

Search Tickets

# Search by status and priority
curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​search/​tickets?query=\"status:2 AND priority:3\""

Core Endpoints

EndpointDescription
/​ticketsCreate, list, update, delete tickets
/​contactsManage customer contacts
/​companiesManage company/​organization records
/​agentsView and manage support agents
/​groupsManage agent groups
/​conversationsTicket replies, notes, forwards
/​time_entriesTime tracking on tickets
/​surveys/​satisfaction_ratingsCustomer satisfaction data
/​productsProduct catalog management
/​business_hoursBusiness hours configuration
/​email_configsEmail settings
/​sla_policiesSLA policy management
/​canned_responsesPre-defined response templates
/​ticket_fieldsCustom ticket fields

See references/​tickets-api.md for detailed ticket operations. See references/​contacts-companies.md for contact/​company management.

Rate Limits

Limits by API Version

VersionLimit
API v11000 calls/​hour
API v2Per-minute, plan-based
Trial Plans50 calls/​minute

Rate Limit Headers

Every response includes:

HeaderDescription
X-Ratelimit-TotalTotal calls allowed per minute
X-Ratelimit-RemainingCalls remaining this minute
X-Ratelimit-Used-CurrentRequestCredits used by this request

Handling Rate Limits

#!/​usr/​bin/​env bash
# Retry with exponential backoff for 429 errors

max_retries=3
retry_count=0

while [ "$retry_count" -lt "$max_retries" ]; do
  response=$(curl -s -w "\n%{http_code}" -u "$FRESHDESK_API_KEY:X" \
    "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets")

  http_code=$(echo "$response" | tail -1)
  body=$(echo "$response" | sed '$d')

  if [ "$http_code" = "200" ]; then
    echo "$body"
    exit 0
  elif [ "$http_code" = "429" ]; then
    delay=$((2 ** retry_count))
    echo "Rate limited. Retrying in ${delay}s..." >&2
    sleep "$delay"
    retry_count=$((retry_count + 1))
  else
    echo "Error: HTTP $http_code" >&2
    echo "$body" >&2
    exit 1
  fi
done

echo "Max retries exceeded" >&2
exit 1

Credit System

Some operations consume multiple API credits:

  • Basic request: 1 credit
  • Including embedded data (include= parameter): +1 credit per include
  • Example: ?include=requester,company costs 3 credits total

Pagination

Query Parameters

ParameterDefaultMaxDescription
page1-Page number (1-indexed)
per_page30100Results per page

Example: Paginate Through All Tickets

page=1
while true; do
  response=$(curl -s -u "$FRESHDESK_API_KEY:X" \
    "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets?page=$page&per_page=100")

  count=$(echo "$response" | jq length)

  if [ "$count" -eq 0 ]; then
    break
  fi

  echo "$response" | jq '.[] | {id, subject, status}'
  page=$((page + 1))
done

Link Header

Responses include a Link header for navigation:

Link: <https://domain.freshdesk.com/​api/​v2/​tickets?page=2>; rel="next"

Filtering and Embedding

Filter Parameters

Common filters available on list endpoints:

ParameterExampleDescription
filternew_and_my_openPre-defined filter
requester_id12345Filter by requester
company_id67890Filter by company
updated_since2024-01-01T00:00:00ZModified after date

Pre-defined Ticket Filters

# New and open tickets assigned to me
curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets?filter=new_and_my_open"

# All unresolved tickets
curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets?filter=all_unresolved"

# Tickets updated in last 30 days
curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets?updated_since=2024-11-01T00:00:00Z"

Include (Embedding Related Data)

Embed related objects to reduce API calls:

# Include requester and company with ticket
curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets/​123?include=requester,company"

# Include stats with ticket list
curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets?include=stats"

Available includes for tickets: requester, company, stats, conversations, description

Search API

The Search API enables complex queries across tickets, contacts, and companies.

Syntax

curl -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​search/​tickets?query=\"<query>\""

Query Examples

# Tickets with specific status and priority
"status:2 AND priority:3"

# Tickets from a specific requester
"requester_email:'[email protected]'"

# Tickets created in date range
"created_at:>'2024-01-01' AND created_at:<'2024-02-01'"

# Tickets with specific tag
"tag:'urgent'"

# Tickets assigned to specific agent
"agent_id:12345"

# Full-text search in subject and description
"~'password reset'"

Search Operators

OperatorDescription
ANDBoth conditions must match
OREither condition matches
:Equals
:>Greater than
:<Less than
~Full-text search

Ticket Status and Priority Values

Status

ValueStatus
2Open
3Pending
4Resolved
5Closed

Priority

ValuePriority
1Low
2Medium
3High
4Urgent

Source

ValueSource
1Email
2Portal
3Phone
7Chat
8Mobihelp
9Feedback Widget
10Outbound Email

Error Handling

HTTP Status Codes

CodeMeaningAction
200SuccessProcess response
201CreatedResource created successfully
204No ContentDelete successful
400Bad RequestCheck request body/​params
401UnauthorizedVerify API key
403ForbiddenCheck permissions
404Not FoundVerify resource ID
409ConflictResource already exists
429Rate LimitedWait and retry
500Server ErrorRetry with backoff

Error Response Format

{
  "description": "Validation failed",
  "errors": [
    {
      "field": "email",
      "message": "It should be a valid email address.",
      "code": "invalid_value"
    }
  ]
}

Webhooks

Freshdesk can send webhook notifications on ticket events. Configure webhooks in Admin → Automations → Webhooks.

Event Types

  • Ticket created
  • Ticket updated
  • Agent reply
  • Customer reply
  • Note added
  • Ticket resolved/​closed

Webhook Payload Example

{
  "freshdesk_webhook": {
    "ticket_id": 12345,
    "ticket_subject": "Support needed",
    "ticket_status": "Open",
    "ticket_priority": "Medium",
    "ticket_requester_email": "[email protected]",
    "triggered_event": "ticket_created"
  }
}

See references/​webhooks-automation.md for detailed webhook setup.

Best Practices

Performance

  1. Use webhooks instead of polling - React to events in real-time
  2. Batch operations - Use bulk endpoints when available
  3. Cache static data - Agent lists, ticket fields rarely change
  4. Use include parameter - Reduce API calls by embedding data
  5. Paginate efficiently - Use max per_page=100 for bulk operations

Security

  1. Store API keys in environment variables - Never hardcode
  2. Use HTTPS only - All API calls must use HTTPS
  3. Rotate keys periodically - Regenerate API keys every 90 days
  4. Limit API key scope - Use agent accounts with minimal permissions

Reliability

  1. Implement retry with backoff - Handle 429 and 5xx errors
  2. Check rate limit headers - Pause before hitting limits
  3. Validate responses - Check for error objects
  4. Log API calls - Track usage and debug issues

Data Handling

  1. Handle null fields - API returns nulls, not omitted fields
  2. Parse timestamps as UTC - Format: YYYY-MM-DDTHH:MM:SSZ
  3. Validate custom fields - Check field types before submission
  4. Sanitize user input - Prevent injection in descriptions

SDKs and Libraries

Official/​Community SDKs

LanguagePackageInstall
Pythonpython-freshdeskpip install python-freshdesk
Node.jsnode-freshdesk-apinpm install node-freshdesk-api
Rubyfreshdesk-rubygem install freshdesk
PHPOfficial samplesSee Freshdesk docs
JavaOfficial samplesSee Freshdesk docs

See references/​sdk-examples.md for detailed code examples.

Common Workflows

Export All Tickets to JSON

#!/​usr/​bin/​env bash
# Export all tickets to tickets.json

page=1
echo "[" > tickets.json
first=true

while true; do
  response=$(curl -s -u "$FRESHDESK_API_KEY:X" \
    "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​tickets?page=$page&per_page=100&include=description")

  count=$(echo "$response" | jq length)
  [ "$count" -eq 0 ] && break

  if [ "$first" = true ]; then
    first=false
  else
    echo "," >> tickets.json
  fi

  echo "$response" | jq '.[]' | paste -sd ',' - >> tickets.json
  page=$((page + 1))
  sleep 0.5  # Respect rate limits
done

echo "]" >> tickets.json
echo "Exported $((page - 1)) pages of tickets"

Sync Contacts from CSV

#!/​usr/​bin/​env bash
# Import contacts from contacts.csv (name,email,company_id)

while IFS=, read -r name email company_id; do
  curl -s -u "$FRESHDESK_API_KEY:X" \
    -H "Content-Type: application/​json" \
    -X POST \
    -d "{\"name\":\"$name\",\"email\":\"$email\",\"company_id\":$company_id}" \
    "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​contacts"
  sleep 0.5
done < contacts.csv

Get Ticket Metrics

# Get resolution time stats for closed tickets this month
curl -s -u "$FRESHDESK_API_KEY:X" \
  "https://$FRESHDESK_DOMAIN.freshdesk.com/​api/​v2/​search/​tickets?query=\"status:5 AND created_at:>'2024-12-01'\"" \
  | jq '[.results[] | .stats.resolved_at as $r | .created_at as $c |
    (($r | fromdateiso8601) - ($c | fromdateiso8601)) / 3600] |
    {count: length, avg_hours: (add / length)}'

Resources

Reference Files

For detailed endpoint documentation:

More skills from majiayu000

xiaohongshu logo
majiayu000/claude-arsenal

xiaohongshu

xiaohongshu

286 148
View
agent-task-conductor logo
majiayu000/claude-skill-registry

agent-task-conductor

Conduct multi-agent task orchestration and workflow coordination.

663 1
View
conductor-setup logo
majiayu000/claude-skill-registry

conductor-setup

Initialize project with Conductor artifacts (product definition,

663 1
View
animation-designer logo
majiayu000/claude-skill-registry

animation-designer

Expert in web animations, transitions, and motion design using Framer Motion and CSS

663 1
View
diagramming logo
majiayu000/claude-skill-registry

diagramming

Creates Mermaid and ASCII diagrams for flowcharts, architecture, ERDs, state machines, mindmaps, and more. Use when user mentions diagram, flowchart, mermaid, ASCII diagram, text diagram, terminal diagram, visualize, C4, mindmap, architecture diagram, sequence diagram, ERD, or needs visual docume...

663 1
View
h3-pg logo
majiayu000/claude-skill-registry-data

h3-pg

PostgreSQL bindings for H3 hexagonal grid system. Use when working with H3 cells in Postgres, including spatial indexing, geometry/geography integration, and raster analysis.

23 1
View
conductor-development logo
majiayu000/claude-skill-registry

conductor-development

Context-Driven Development skill for projects using Conductor. Use this skill when you detect a `conductor/` directory in the project, when working on tasks defined in a `plan.md` file, or when the user asks about tracks, specs, or plans. Automatically applies TDD workflow, tracks task completion...

663 1
View
conductor-status logo
majiayu000/claude-skill-registry

conductor-status

Display project status, active tracks, and next actions

663 1
View
dockerization logo
majiayu000/claude-skill-registry

dockerization

Official Stakpak application containerization standard operating procedure, a step-by-step guidline to properly dockerize applications. This is a rule book curated by the Stakpak Team.

663 1
View

Popular AI tools

Kaiber logo
Video

Kaiber

Generate, edit, and beat-sync AI video with leading models in one workspace.

Paid
View
Vimcal logo
Productivity

Vimcal

The world's fastest calendar for remote work

Free
View

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View
Akool AI logo
Content & writing

Akool AI

Revolutionizing Video Production with AI-Powered Creativity

Paid
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
StarByFace logo
Security

StarByFace

Discover your celebrity doppelgänger with StarByFace!

Free
View
C

ChainClarity explains 700+ crypto whitepapers in plain English, with layered summaries, comparisons, research tools, alerts, and a $4.99 Pro plan.

Freemium
View
Opus Clip logo
Coding & apps

Opus Clip

Opus.ai: Revolutionize Your Web Experience

Free
View