Freshservice Ticketing System Integration Setup (Beta)
Discover how to set up the Freshservice ticketing integration with AutoElevate using a least-privilege API key.
Table of Contents
Beta Feature
The Freshservice ticketing integration is currently in Beta. We are actively looking for feedback — please send any issues or suggestions to support@autoelevate.com.
Overview
AutoElevate's native Freshservice integration connects to your Freshservice account with an API key. In Freshservice, an API key always acts as the agent it belongs to — the key can do exactly what that agent can do, and nothing more. The way to keep this integration least-privilege is to create a dedicated integration agent with a custom role scoped to only what the integration actually needs.
This article lists every Freshservice API call the integration makes, the permission each one needs, and why. In short: the integration only needs to read a little configuration when you set it up, and create and update tickets while it runs. It does not need Administrator or Account Admin rights.
Prerequisites
- Administrator access to Freshservice — but only once, to create the dedicated agent, its role, and its API key. The integration itself never uses your admin login.
- Administrative access to the AutoElevate Admin Portal to enter the Freshservice subdomain and API key.
- A full-time agent seat for the integration agent (requester / contact accounts cannot use the ticket APIs).
Required permissions
Every operation below, in the order the integration performs it. Phase tells you whether the permission is needed only while you configure the integration (Setup) or every time it runs (Runtime).
| # | Operation | Freshservice endpoint | Object | R/W | Required capability | Phase |
|---|---|---|---|---|---|---|
| 1 | Verify the API key | GET /api/v2/agents/me |
Agents (self) | Read | Any valid agent API key | Setup |
| 2 | Load selectable statuses and ticket types | GET /api/v2/ticket_form_fields |
Ticket form fields | Read | Read ticket form fields (see note) | Setup |
| 3 | Load selectable groups | GET /api/v2/groups?per_page=100 |
Agent groups | Read | Read groups (see note) | Setup |
| 4 | Offer priorities | none — built-in list | — | — | None (no API call) | Setup |
| 5 | Offer sources | none — built-in list | — | — | None (no API call) | Setup |
| 6 | Create an elevation / elevated-session ticket | POST /api/v2/tickets |
Tickets | Write | Create ticket | Runtime |
| 7 | Update ticket status on approve / deny / complete | PUT /api/v2/tickets/{id} |
Tickets | Write | Edit ticket | Runtime |
| 8 | Add a private note to a ticket | POST /api/v2/tickets/{id}/notes |
Ticket conversations | Write | Edit ticket / add note | Runtime |
Note on the setup reads (#2 and #3)
These are only used while an admin is configuring the integration in the AutoElevate portal — they populate the Status, Ticket Type, and Group dropdowns. Depending on your Freshservice plan and role configuration, reading groups (and, on some accounts, ticket form fields) can require an agent with administrative / config-read access. Because these calls happen only at setup, you have a clean least-privilege option: grant the config-read capability, complete setup, then remove it — the running integration never calls them again. Confirm this against your own account (see Verification); it is the one place the required privilege can vary between accounts.
Permission details
-
Verify the API key (
GET /agents/me): right after you paste the subdomain and API key, AutoElevate calls this to confirm the key is valid and belongs to a real agent. It reads nothing but the agent's own identity. -
Load statuses and ticket types (
GET /ticket_form_fields): so you can map AutoElevate outcomes (new, approved, denied, completed) to your Freshservice statuses and pick which ticket type new tickets use, the portal reads your ticket form field definitions. AutoElevate only offers the three ticket types Freshservice accepts on creation — Incident, Service Request, Major Incident — and hides the system "Assigned to AI Agent" status, which Freshservice refuses on update. -
Load groups (
GET /groups): lets you choose a default assignment group for created tickets. Optional — if you do not assign a default group, the integration simply omits it. - Priorities and sources: no permission needed — AutoElevate ships the standard Freshservice priority list (Low / Medium / High / Urgent) and source list, so no API call is made.
-
Create tickets (
POST /tickets): the core runtime action — every elevation request or elevated session becomes a ticket. This is the one write capability the integration cannot work without. -
Update tickets (
PUT /tickets/{id}): when a technician approves, denies, or completes a request in AutoElevate, the matching Freshservice ticket's status is updated. On outcomes that resolve or close the ticket, AutoElevate also writes a resolution note (Freshservice requires one to close). -
Add a private note (
POST /tickets/{id}/notes): progress and outcome detail is added as a private note (internal-only), so it never emails the requester.
Requester behavior
Freshservice requires a requester on every ticket (an email or requester_id). AutoElevate elevation events have no real requester mailbox, so the integration synthesizes a stable, non-routable address of the form user@no-reply.company.local. The .local TLD is reserved and never resolves, so these addresses can never receive mail.
Expected side effect
Freshservice auto-creates a requester / contact for any email it has not seen, so expect synthetic requester records to appear in your directory over time. This is expected, not a misconfiguration — entity linking (matching to real users / assets) is intentionally out of scope for this first release.
Company, location, computer, and user linking
No linking is required for Freshservice. Once the integration is configured (credentials saved and statuses mapped), tickets are generated automatically for elevation requests and elevated sessions. Unlike some of our other ticketing integrations (such as ServiceNow), AutoElevate companies, locations, computers, and users do not need to be linked to Freshservice records.
For context: this integration uses auto-created synthetic requesters (user@no-reply.company.local), so tickets are not attributed to a Freshservice company or requester group in this release. Company, computer, and user details are included as text in the ticket subject, description, and private notes.
Step-by-step: create the least-privilege agent
- In Freshservice, go to Admin → User Management → Agents and create a new full-time agent (e.g. "AutoElevate Integration").
- Under Admin → Roles, create a custom role — for example "AutoElevate — Tickets". Grant it:
- Tickets: Create, and Edit / Reply / Add note.
- The minimum Groups / ticket-fields read needed for the setup dropdowns (see the note above; you may remove this after setup).
- Nothing else — no admin, no account settings, no automations.
- Set the role's scope so the agent can act on the tickets it creates. If created tickets should be visible / editable regardless of group, use a Global scope; otherwise a Group scope that includes your chosen default group is enough.
- Assign that custom role (and only that role) to the integration agent.
- In the agent\u2019s settings, make sure API Key access is enabled — on Freshworks agent profiles this toggle can be off by default, and without it the agent has no API key at all.
- Log in as (or impersonate) that agent, open Profile settings, and copy its API key.
- In the AutoElevate Admin Portal, open the Freshservice ticketing setup, enter your
*.freshservice.comsubdomain and paste the API key, then save. The portal verifies the key and loads your statuses, ticket types, and groups.
What you do NOT need to grant
- Not Account Admin or Administrator. The integration never touches account settings, billing, automations, or admin configuration at runtime.
- Not delete permissions on tickets — the integration never deletes.
- Not asset / CMDB, department, or requester-management permissions — no entity linking in this release.
- Not write access to ticket fields, workflows, or automators — it only reads field options at setup.
AutoElevate Admin Portal setup
With the Freshservice agent and API key ready, configure the integration in the AutoElevate Admin Portal:
- Log in to the AutoElevate Admin Portal and go to Settings.
- On the Ticketing System item, click START SETUP (or open your existing ticketing configuration to edit it).
- Under Type, select FreshService.
-
Step 1 — Host & API Credentials: enter your Freshservice subdomain (e.g.
acmecorp.freshservice.com) and the integration agent\u2019s API key, then click SAVE CREDENTIALS. A successful save verifies the key and loads your statuses, ticket types, and groups. - Step 2 — Default Group, Type & Priority (optional): choose a default assignment group, the ticket type new tickets should use (Incident, Service Request, or Major Incident), and a default priority.
- Step 3 — Status Mapping: map each AutoElevate outcome (new, approved, denied, completed) to the Freshservice status it should set.
- Click SAVE. From this point, elevation requests and elevated sessions generate Freshservice tickets automatically — no additional linking is required.
Verification
- Save credentials in the portal — a verified result means
GET /agents/mesucceeded (permission #1). - The Status, Ticket Type, and Group dropdowns populate — this confirms the setup reads (#2 and #3) work under the role you built. If they are empty or error, the role needs the config-read capability described above.
- Trigger a test elevation and confirm a ticket is created in Freshservice (#6), then approve / deny it in AutoElevate and confirm the ticket's status updates and a private note appears (#7 and #8).
Troubleshooting
| Symptom | Most likely cause | Fix |
|---|---|---|
| "Invalid API key" on save | Key wrong, or belongs to a deactivated / requester account | Re-copy the key from the integration agent's profile; ensure it is a full-time agent. |
| Save verifies, but Status / Ticket Type / Group dropdowns are empty | Role lacks the setup config-read capability | Temporarily grant groups / ticket-fields read, reload, then optionally remove. |
| Tickets are not created at runtime | Role missing Create ticket, or scope excludes the target group | Add Create-ticket; widen scope to cover the default group. |
| Status will not update / cannot close ticket | Role missing Edit ticket, or a required close field / workflow is blocking | Add Edit-ticket; ensure the mapped closed / resolved status matches a real Freshservice status. |
| Unexpected new contacts in the directory | Expected — synthetic requesters from @no-reply.*.local
|
No action; see Requester behavior. |