Freshdesk Contacts & Companies — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Freshdesk Contacts & Companies (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
In Freshdesk, contacts are the people who raise tickets (requesters) and companies group those contacts into the organizations an MSP serves. Resolving a ticket's requester to a contact, and that contact to its company, is the foundation for account-level context, SLA association, and reporting. This skill covers contact and company operations through tools named freshdesk_contacts_<action> and freshdesk_companies_<action>.
| Field | Type | Required | Description |
|---|---|---|---|
id | Integer | System | Auto-generated unique identifier |
name | String | Yes | Full name |
email | String | One of email/phone/mobile | Primary email |
phone | String | One of email/phone/mobile | Landline |
mobile | String | One of email/phone/mobile | Mobile number |
company_id | Integer | No | Associated company |
job_title | String | No | Role at the company |
tags | Array | No | Free-form labels |
A contact must have at least one of email, phone, mobile, twitter_id, or unique_external_id.
| Action | Endpoint | Notes |
|---|---|---|
| List | GET /api/v2/contacts | Filter with email, mobile, phone, company_id, updated_since |
| Get | GET /api/v2/contacts/{id} | Single contact |
| Search | GET /api/v2/search/contacts?query="..." | Query language; 300-result cap |
| Create | POST /api/v2/contacts | name + one contact channel required |
| Update | PUT /api/v2/contacts/{id} | Partial update |
| Merge | POST /api/v2/contacts/merge | Combine duplicates into a primary |
| Make agent | PUT /api/v2/contacts/{id}/make_agent | Convert a contact into an agent |
{
"name": "John Smith",
"email": "[email protected]",
"company_id": 5001,
"job_title": "Office Manager"
}GET /api/v2/search/contacts?query="email:'[email protected]'"The query language wraps the expression in double quotes and quotes string values. Search returns up to 30 results per page and a maximum of 10 pages (300 records).
POST /api/v2/contacts/merge{
"primary_contact_id": 1001,
"secondary_contact_ids": [1002, 1003]
}Tickets and history from the secondary contacts are re-pointed at the primary. Confirm which record should be primary before merging — merges are not easily reversible.
PUT /api/v2/contacts/{id}/make_agentConverts a customer contact into a Freshdesk agent. This is a privileged, billing-affecting change — flag it explicitly before invoking.
| Field | Type | Required | Description |
|---|---|---|---|
id | Integer | System | Auto-generated unique identifier |
name | String | Yes | Company name (unique) |
domains | Array | No | Email domains used to auto-associate contacts |
description | String | No | Notes about the company |
note | String | No | Internal note |
health_score | String | No | Account health indicator |
account_tier | String | No | Service tier |
| Action | Endpoint | Notes |
|---|---|---|
| List | GET /api/v2/companies | Paginated with page / per_page |
| Get | GET /api/v2/companies/{id} | Single company |
| Search | GET /api/v2/search/companies?query="..." | Query language; 300-result cap |
| Create | POST /api/v2/companies | name required and unique |
| Update | PUT /api/v2/companies/{id} | Partial update |
GET /api/v2/search/companies?query="name:'Acme'"You can also locate a company by an autocomplete-style name lookup:
GET /api/v2/companies/autocomplete?name=AcmeA core MSP workflow is enriching a ticket with full account context:
requester_id and, when set,company_id. Read the ticket first.
GET /api/v2/contacts/{requester_id} (or searchby email if you only have an address). This yields the contact's company_id, job_title, and contact channels.
GET /api/v2/companies/{company_id} for theorganization's domains, account_tier, and health_score.
company_id, matchthe email domain against company domains to infer the right account.
cache lookups within a session to stay under the per-minute rate limit.
Ticket #4821
requester_id: 1001 -> Contact "John Smith" ([email protected])
company_id: 5001
-> Company "Acme Corporation"
domains: ["acme.com"], tier: "Gold"| Error | Cause | Resolution |
|---|---|---|
| 400 Validation failed | Missing name or contact channel; duplicate company name | Supply required fields; pick a unique company name |
| 404 Not found | Unknown contact/company ID | Re-list or re-search to confirm |
| 409 Conflict | Email/company already exists | Search for and reuse the existing record |
| 403 Forbidden | API key lacks scope | Check agent permissions (especially for make_agent) |
emailfirst; let ticket creation auto-create only when intentional.
domains let Freshdeskauto-associate new contacts to the right company.
undo.
running.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.