API review

Freshsales API review

Freshworks' sales CRM with a REST API for contacts, sales accounts, deals, activities and custom modules, including single and bulk upsert by a unique identifier (100 per bulk call, async job status), behind a strict 1,000 requests/hour account limit. Best for freshworks-stack clients that want contacts/accounts/deals kept in sync.

Verified 25 Oct 2026 · 7 endpoints listed

What a call costs

The actions you pay for, as Freshsales prices them.

ActionCostPer
Branded documents add-on$19 (INR ₹1,299)per user/month
Freddy AI Agent$49 (INR ₹4,299)per 100 sessions

Pricing, plan by plan

US dollars, as Freshsales's pricing page shows them on 25 Oct 2026. Monthly and annual billing are shown apart.

Free tier Free plan $0 for up to 3 users, WITHOUT API access (shown on the pricing-compare page, not on the main pricing page). Paid plans: 21-day free trial on Enterprise, no card, phone optional (our signup 2026-10-25)

Free

$0

Free

up to 3 users

No API

Growth

$11/mo

billed monthly

$9/mo

billed annually

per user/month; API 1,000 requests/account/hour; 20 workflows; INR from our Indian IP: ₹899 monthly / ₹749 annual

API included

Pro

$47/mo

billed monthly

$39/mo

billed annually

per user/month; API 2,000 requests/account/hour; 50 workflows; INR: ₹3,889 monthly / ₹3,239 annual

API included

Enterprise

$71/mo

billed monthly

$59/mo

billed annually

per user/month; API 5,000 requests/account/hour (extendable); 100 workflows; custom modules; auto profile enrichment; INR: ₹5,879 monthly / ₹4,899 annual

API included

Rate limits

Per-account hourly API cap that depends on the plan: Growth 1,000, Pro 2,000, Enterprise 5,000 requests/hour (in-app Plans and Billing 'API Access' row, 2026-10-25); Enterprise also lists an 'Extendable API rate limit' (pricing-compare).

LimitFreeGrowthProEnterprise
Noteno API access (pricing-compare)––extendable
Per Hour–1,0002,0005,000
More on limitsLess

The API reference's 429 text still says a flat 1,000 requests/hour per account. Bulk upsert: 100 entities per request and max 10 concurrent in-progress jobs. Trials run on Enterprise, so trial-time tests see 5,000/hour.

How to get an API key

Freshsales uses API key. The steps below follow Freshsales's own docs.

  1. Create a Freshsales account. API access starts on the Growth plan.
  2. Docs: Settings > API Settings tab > 'Your API key'. Live app (2026-10-25): Personal Settings > API (/crm/sales/personal-settings/api-settings); the key is only shown after ticking a visible reCAPTCHA 'I'm not a robot' checkbox
  3. Send it with every request: header: Authorization: Token token=<API key>.
  4. Make a first call: Create or update one contact matched on a unique identifier. Keep the key in an environment variable, never in the command.
    curl -X POST "https://{domain}.myfreshworks.com/crm/sales/api/contacts/upsert" \
      -H "Authorization: Token token=$FRESHSALES_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{}'

Where the docs live

WhatWhere
Documentationdevelopers.freshworks.com/crm/api
API referencedevelopers.freshworks.com/crm/api
Base URLhttps://{domain}.myfreshworks.com/crm/sales/api

Strengths and limits

Where it fits

  • Freshworks-stack clients that want contacts/accounts/deals kept in sync
  • Idempotent writes: /upsert and /bulk_upsert by a unique identifier (e.g. emails for contacts, name for accounts)
  • Bulk upserts of up to 100 entities per request (max 10 concurrent bulk jobs)

Where it falls short

  • High-volume syncs or enrichment loops: the whole account gets 1,000 (Growth) / 2,000 (Pro) / 5,000 (Enterprise) API requests per hour; the Free plan has no API
  • Event-driven integrations needing API-managed webhooks (none in the API reference)
  • Agent/MCP access to CRM data (Freshworks' only MCP is a developer server for custom-app submission)

Worth knowing

  • The hourly API budget is per account and shared by every integration: 1,000 (Growth), 2,000 (Pro), 5,000 (Enterprise) per the in-app plans page; the API reference still says 1,000 for everyone. Trials run on Enterprise, so a trial test overstates what a Growth customer gets.
  • Bulk upsert records are {"<identifier field>": "<value>", "data": {...}} with exactly one identifier each (not a nested unique_identifier object), and run async; check /job_statuses before assuming success. Source: developers.freshworks.com/crm/api
  • Account upsert examples match on name, so 'Acme' and 'Acme Inc' become two accounts unless you pick a better unique field. Source: developers.freshworks.com/crm/api
  • The reference is one 1.4 MB single-page app; some sample URLs in it are malformed (e.g. 'apicontacts'). Observed 2026-10-25.
  • Upsert by 'email' is deprecated and rejected; use 'emails'. When several records match, upsert errors and returns the ids to merge instead of picking one. Source: developers.freshworks.com/crm/api
4 moreShow fewer
  • The Free plan (up to 3 users) appears only on the pricing-compare page and has no API access; the main pricing page shows only Growth/Pro/Enterprise. Source: freshworks.com/crm/pricing-compare
  • The pricing page geo-switches to INR with JavaScript from an Indian IP; the server HTML and the archive.org snapshot carry the USD figures.
  • The API key screen is gated by a visible reCAPTCHA checkbox, so key retrieval cannot be scripted.
  • Base URL check: docs write paths as /api/<resource> under &lt;domain&gt;.myfreshworks.com/crm/sales; this record keeps /api in base_url and omits it from paths, so nothing is doubled. Source: developers.freshworks.com/crm/api

Who should use it

Use Freshsales for
Freshworks-stack clients that want contacts/accounts/deals kept in sync
Look elsewhere for
High-volume syncs or enrichment loops: the whole account gets 1,000 (Growth) / 2,000 (Pro) / 5,000 (Enterprise) API requests per hour; the Free plan has no API

If Freshsales is not the answer

Other CRM tools in this directory, each with its own review.

Before you build

Four things to settle first, each read off Freshsales's own pages.

  • Confirm the API is on your planAPI access starts on the Growth plan. Free tier: Free plan $0 for up to 3 users, WITHOUT API access (shown on the pricing-compare page, not on the main pricing page).
  • Keep the key out of your codeAPI key. It is sent as: header: Authorization: Token token=<API key>.
  • Design around the rate limitPer-account hourly API cap that depends on the plan: Growth 1,000, Pro 2,000, Enterprise 5,000 requests/hour (in-app Plans and Billing 'API Access' row, 2026-10-25); Enterprise also lists an 'Extendable API rate limit' (pricing-compare).
  • Know the catch before you scaleThe hourly API budget is per account and shared by every integration: 1,000 (Growth), 2,000 (Pro), 5,000 (Enterprise) per the in-app plans page; the API reference still says 1,000 for everyone. Trials run on Enterprise, so a trial test overstates what a Growth customer gets.

Want us to build it for you?

Tell us what you want Freshsales to do in your stack. We will show you how we would wire it into your data, outbound or CRM, and what we would check first.

Read from freshworks.com/crm/pricing, developers.freshworks.com/crm/api and developers.freshworks.com/crm/api. Verified 25 Oct 2026.

All 7 endpointsFor developers: method, path, what it does and what it costs.

Base URL: https://{domain}.myfreshworks.com/crm/sales/api

Bulk and async: bulk_upsert for contacts, sales_accounts and deals: 100 entities per request, max 10 concurrent in-progress jobs, async with job_statuses; also bulk assign owner and bulk delete. Source: developers.freshworks.com/crm/api

7 endpoints
MethodPathWhat it doesCost
POST/contacts/upsertCreate or update one contact matched on a unique identifiernone
POSTasync/contacts/bulk_upsertBulk create/update contacts by unique identifiernone
POST/sales_accounts/upsertCreate or update one account (e.g. unique_identifier name)none
POSTasync/sales_accounts/bulk_upsertBulk upsert accountsnone
POSTasync/deals/bulk_upsertBulk upsert dealsnone
GET/job_statuses/{id}Status of an async bulk upsert job (bulk upsert jobs only)none
POST/contactsCreate a contactnone