API review

Copper API review

Google Workspace-native CRM with a Developer API v1 (leads, people, companies, opportunities, projects, tasks, activities, custom fields), lead upsert, small bulk endpoints (10 records), search, and webhooks that are never retried. Best for google Workspace teams that want a simple CRM inside Gmail.

Verified 25 Oct 2026 · 8 endpoints listed

What a call costs

The actions you pay for, as Copper prices them.

ActionCost
Atomically update the lead matching given criteria or create it. Match on name, email or a custom field (match.field_name 'custom' with custom_field_definition_id + value; the field must be available on Leads and filterable). 0 matches = create, 1 = update, >1 = 422 with matching IDs, >30 = 422 without IDsnone
Fetch a person by email (email is the unique key for People)none
List/search people with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
List/search companies with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
List/search leads with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
List/search opportunities with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
Bulk create companies (beta Bulk API; email domains must not overlap existing companies, else those records fail)none
Create a webhook subscription. type: lead, person, company, opportunity, project, task (overview also lists activity_log); event: new, update, deletenone

Pricing, plan by plan

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

Free tier No free plan. 14-day free trial, no credit card; signup is Google-only ('Continue with Google', Copper only works with Gmail & Google Workspace).

Basic

$29/mo

billed monthly

$23/mo

billed annually

per seat; 2,500 contact limit; 25 custom fields; no Leads or Sales opportunities objects

No API

Professional

$69/mo

billed monthly

$59/mo

billed annually

per seat; 15,000 contact limit; 50 custom fields; workflows, bulk email, integrations

API included

Business

$134/mo

billed monthly

$99/mo

billed annually

per seat; unlimited contacts and custom fields; email series, custom reports, Okta SSO

API included

Rate limits

All API calls: 180 requests per minute on a rolling window, 429 when exceeded.

More on limitsLess

Bulk APIs: additional 3 requests/second and max 10 records per request. Webhook notifications: 600 per minute and 1,800 per 10 minutes per account.

How to get an API key

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

  1. Create a Copper account. API access starts on the Professional plan.
  2. Copper web app > System settings > API Keys > GENERATE API KEY; OAuth 2.0 for partner integrations
  3. Send it with every request: headers: X-PW-AccessToken: <API key>, X-PW-Application: developer_api, X-PW-UserEmail: <email of key owner>, Content-Type: application/json.
  4. Make a first call: Atomically update the lead matching given criteria or create it. Match on name, email or a custom field (match.field_name 'custom' with custom_field_definition_id + value; the field must be available on Leads and filterable). 0 matches = create, 1 = update, >1 = 422 with matching IDs, >30 = 422 without IDs. Keep the key in an environment variable, never in the command.
    curl -X PUT "https://api.copper.com/developer_api/v1/leads/upsert" \
      -H "X-PW-AccessToken: $COPPER_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{}'

Where the docs live

WhatWhere
Documentationdeveloper.copper.com
API referencedeveloper.copper.com/introduction/requests.html
OpenAPI specdeveloper.copper.com/download/copper_postman_collection.json
Changelogdeveloper.copper.com/introduction/changelog.html
Base URLhttps://api.copper.com/developer_api/v1
SDKsEmbedded integration SDK (for apps inside Copper)

Strengths and limits

Where it fits

  • Google Workspace teams that want a simple CRM inside Gmail
  • Upserting leads by a match field or custom field (PUT /leads/upsert)
  • People and companies with platform-enforced unique keys (person email, company email domain)

Where it falls short

  • Bulk loads: 180 requests/minute overall, bulk endpoints max 10 records per request and 3 requests/second
  • Reliable event delivery: webhooks fire at most once and are never retried
  • Deep exports through search: search returns only the first 100,000 records
  • Copper Basic plan users: the pricing table shows 'API & Embedded integration SDK' (and Leads) only on Professional and Business

Worth knowing

4 moreShow fewer
  • API domain moved from api.prosperworks.com to api.copper.com. Source: developer.copper.com
  • No API on the Basic plan: 'API & Embedded integration SDK' is ticked only for Professional and Business. Source: copper.com/pricing (rendered comparison table)
  • Signup is Google-only, so every Copper account (and the X-PW-UserEmail header value) is a Google Workspace/Gmail identity.
  • The official MCP is announced for a November 2026 beta (Claude only, read-only); until then only third-party connectors exist, which Copper notes run on an admin API key. Source: copper.com/mcp

Who should use it

Use Copper for
Google Workspace teams that want a simple CRM inside Gmail
Look elsewhere for
Bulk loads: 180 requests/minute overall, bulk endpoints max 10 records per request and 3 requests/second

If Copper 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 Copper's own pages.

  • Confirm the API is on your planAPI access starts on the Professional plan. Free tier: No free plan.
  • Keep the key out of your codeAPI key. It is sent as: headers: X-PW-AccessToken: <API key>, X-PW-Application: developer_api, X-PW-UserEmail: <email of key owner>, Content-Type: application/json.
  • Design around the rate limitAll API calls: 180 requests per minute on a rolling window, 429 when exceeded.
  • Know the catch before you scaleWebhooks are fire-once: no retries on any failure, so a down endpoint loses events; reconcile with periodic search. Source: developer.copper.com/webhooks/overview.html

Want us to build it for you?

Tell us what you want Copper 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 copper.com/pricing, developer.copper.com/introduction/requests.html and developer.copper.com/introduction/authentication.html. Verified 25 Oct 2026.

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

Base URL: https://api.copper.com/developer_api/v1

Bulk and async: Beta Bulk APIs (since 2023-08-22): bulk create for people, companies, leads, opportunities (added 2025-01-09) and activities; bulk update for people, companies and leads only. Max 10 records per request, extra 3 requests/second limit, response order matches request order. Source: developer.copper.com/companies/bulk-company-create.html; developer.copper.com/introduction/changelog.html (verified 2026-10-25)

Webhooks: Yes. Up to 100 active subscriptions per account; 600 notifications/min and 1,800 per 10 min; up to 30 record IDs per notification; https only; optional secret and custom headers; fired at most once and NEVER retried regardless of response. Source: developer.copper.com/webhooks/overview.html (verified 2026-10-25)

8 endpoints
MethodPathWhat it doesCost
PUT/leads/upsertAtomically update the lead matching given criteria or create it. Match on name, email or a custom field (match.field_name 'custom' with custom_field_definition_id + value; the field must be available on Leads and filterable). 0 matches = create, 1 = update, >1 = 422 with matching IDs, >30 = 422 without IDsnone
POST/people/fetch_by_emailFetch a person by email (email is the unique key for People)none
POST/people/searchList/search people with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
POST/companies/searchList/search companies with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
POST/leads/searchList/search leads with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
POST/opportunities/searchList/search opportunities with filters (AND across criteria; some fields filter on empty, assignee_ids -2 = unassigned)none
POST/companies/bulk_createBulk create companies (beta Bulk API; email domains must not overlap existing companies, else those records fail)none
POST/webhooksCreate a webhook subscription. type: lead, person, company, opportunity, project, task (overview also lists activity_log); event: new, update, deletenone