Look up open Freshdesk tickets from a WhatsApp chatbot, create new tickets from customer messages, and reply with real-time status updates. No Freshdesk login needed for the customer. They get answers directly in WhatsApp.
Before following this guide, read the External API Request step foundation guide. It covers every field in the step interface so this guide can focus on Freshdesk-specific values.
Freshdesk Basic Auth uses your API key as the username and any non-empty string as the password. The convention is the single letter X. Freshdesk ignores the password entirely; only the API key is validated. So the format is: Authorization: Basic BASE64(api_key:X). This trips up almost everyone the first time.
Freshdesk API keys are per-agent. Use an admin-level account key for full ticket access.
acme.freshdesk.com, your domain is acme.YOUR_API_KEY:X. Then prepend "Basic ". You can use any online Base64 encoder.The free Freshdesk Sprout plan does not include API access. You need a Growth, Pro, or Enterprise plan. If you cannot find an API Key on your Profile Settings page, check your plan.
Freshdesk REST API v2: developers.freshdesk.com/api
Freshdesk uses HTTP Basic Auth, which requires a Base64-encoded credential string. Here is the exact format:
Your API key: sfg999666t673t7t82t3
String to encode: sfg999666t673t7t82t3:X
(api_key + colon + letter X)
Base64 result: c2ZnOTk5NjY2dDY3M3Q3dDgydDM6WA==
Authorization header value: Basic c2ZnOTk5NjY2dDY3M3Q3dDgydDM6WA==
In WA.Expert External API Request step:
Header name: Authorization
Header value: Basic c2ZnOTk5NjY2dDY3M3Q3dDgydDM6WA==
Tools to get the Base64 string:
- Any online encoder: search "base64 encode"
- Input: YOUR_API_KEY:X (your actual key, colon, capital X)
- Copy the output and prepend "Basic "In your WA.Expert chatbot flow, collect the customer's email first (ask them to type it, or retrieve from Mini-CRM). Store it as {{customer_email}}. Then add an External API Request step:
| Field | Value | Notes |
|---|---|---|
| Select Method | GET | Fetching tickets for this requester. |
| Request URL | https://YOUR_DOMAIN.freshdesk.com/api/v2/tickets?email={{{customer_email}}}&order_type=desc&per_page=5 | Replace YOUR_DOMAIN with your Freshdesk subdomain (e.g. acme). email= filters to tickets raised by this address. order_type=desc gives newest first. per_page=5 limits results. |
| Authorization | Basic BASE64_OF_APIKEY_COLON_X | Compute once: Base64(your_api_key:X). Paste the full 'Basic ...' string as the header value. |
| Content-Type | application/json | Standard header for Freshdesk API requests. |
| Select Body Type | None | GET requests carry no body. |
| Choose Response Type | JSON | Freshdesk returns an array of ticket objects. |
To get only open tickets, add &status=2 to the URL. Status codes: 2=Open, 3=Pending, 4=Resolved, 5=Closed. Example: ?email={{customer_email}}&status=2&order_type=desc
A successful Freshdesk ticket response looks like this:
[
{
"id": 1001,
"subject": "Order #5521 not delivered",
"description_text": "My order was placed on June 18 but has not arrived.",
"status": 2,
"priority": 2,
"requester_id": 447,
"responder_id": 12,
"created_at": "2026-06-20T10:30:00Z",
"updated_at": "2026-06-22T14:00:00Z",
"due_by": "2026-06-24T10:30:00Z",
"tags": ["whatsapp", "order-issue"],
"type": "Question"
}
]
Map: [0].id, [0].subject, [0].status, [0].priority, [0].due_byFreshdesk returns tickets as a plain array (not wrapped in a key). Map as [0].id, [0].subject, [0].status. If the array is empty, the customer has no tickets matching that email. Add a conditions branch for that case.
| Field | Value | Meaning |
|---|---|---|
| status | 2 | Open |
| status | 3 | Pending |
| status | 4 | Resolved |
| status | 5 | Closed |
| priority | 1 | Low |
| priority | 2 | Medium |
| priority | 3 | High |
| priority | 4 | Urgent |
Convert numeric status to a readable label in your WhatsApp message. 'Your ticket status: Open' reads better than 'Your ticket status: 2'.
Map these response paths to variables in the External API Request step:
| Variable name | Response path | Example value |
|---|---|---|
| ticket_id | [0].id | 1001 |
| ticket_subject | [0].subject | Order #5521 not delivered |
| ticket_status | [0].status | 2 (Open) |
| ticket_priority | [0].priority | 2 (Medium) |
| ticket_due | [0].due_by | 2026-06-24T10:30:00Z |
| ticket_updated | [0].updated_at | 2026-06-22T14:00:00Z |
If the customer messaged you first within the last 24 hours, your reply is a free service conversation. For proactive outbound ticket updates, use an approved Utility template.
When a customer describes an issue in WhatsApp, your bot can open a Freshdesk ticket automatically. Use a POST External API Request step with the same API key auth:
POST https://YOUR_DOMAIN.freshdesk.com/api/v2/tickets
Authorization: Basic BASE64_OF_APIKEY_COLON_X
Content-Type: application/json
Body:
{
"email": "{{customer_email}}",
"subject": "WhatsApp: {{customer_issue_summary}}",
"description": "Customer WhatsApp message: {{customer_message}}",
"priority": 2,
"status": 2,
"tags": ["whatsapp", "bot-created"],
"source": 7
}
Response:
{ "id": 1002, "status": 2, "subject": "WhatsApp: ...", ... }
Map: id -> new_ticket_id
Bot replies: "Ticket #{{new_ticket_id}} created.
Our team will respond within 24 hours."
source: 7 = created via API (shows in Freshdesk ticket source field)Customer messages: "What is the status of my support ticket?"
Bot asks: "Please share the email address used when you raised the ticket."
Customer replies: priya@example.com
Stored as {{customer_email}}.
External API Request step:
GET https://acme.freshdesk.com/api/v2/tickets
?email=priya@example.com&status=2&order_type=desc&per_page=1
Authorization: Basic c2ZnOTk5NjY2dDY3...
Response (array):
[{
"id": 1001,
"subject": "Order #5521 not delivered",
"status": 2,
"updated_at": "2026-06-22T14:00:00Z"
}]
Mapped:
ticket_id = "1001"
ticket_subject = "Order #5521 not delivered"
ticket_status = "2"
Conditions: if array is empty → "No open tickets found for this email."
Bot replies (if found):
"Hi Priya, here is your ticket update:
Ticket #1001: Order #5521 not delivered
Status: Open
Last updated: 22 June 2026
Reply AGENT to request a callback, or UPDATE for latest notes."| Symptom | Likely cause | Fix |
|---|---|---|
| 401 Unauthorized | Wrong API key or wrong Base64 format | Recompute: Base64(YOUR_API_KEY:X). Ensure colon and capital X are included. Check the Authorization header reads exactly 'Basic ENCODED_STRING'. |
| 403 Forbidden | Insufficient agent permissions | The API key's agent role must have read access to tickets. Use an admin-level API key. |
| Empty array [] | No tickets found for that email, or wrong email | Try without &status=2 to check all tickets. Confirm the email matches exactly what is in Freshdesk (case-sensitive). |
| API not available | Free Sprout plan | API access requires Growth, Pro, or Enterprise plan. Upgrade or confirm your plan in Freshdesk Admin Settings. |
| 429 Too Many Requests | Rate limit exceeded | Check X-RateLimit-Remaining header. Limits: 100 req/min (Growth), 400 (Pro), 700 (Enterprise). For a WhatsApp bot doing single lookups, this limit is very generous. |
| ticket.status returns 2 not 'Open' | Status is a numeric code | Map 2='Open', 3='Pending', 4='Resolved', 5='Closed' in your bot message template using a conditions step. |
Zendesk Support API: OAuth 2.0, search endpoint, ticket creation.
Read guide →Freshsales CRM API: Token token= auth, contact lookup by phone.
Read guide →Free trial, no credit card required. And if you ever get stuck, we are the only platform in India that answers you live on WhatsApp.