Close CRM API
Manage leads, contacts, opportunities, tasks, and activities in Close CRM.
Official docs:
https://developer.close.com/
When to Use
- List, search, create, update, and delete leads
- Manage contacts within leads
- Track opportunities (deals) and their statuses
- Create and manage tasks
- View activities (calls, emails, notes, meetings)
- Get current user and organization info
Core APIs
Get Current User
curl -s "https://api.close.com/api/v1/me/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '{id, email, first_name, last_name}'
Get Organization Info
curl -s "https://api.close.com/api/v1/organization/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[0] | {id, name}'
List Users
curl -s "https://api.close.com/api/v1/user/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, email, first_name, last_name}'
Leads
List Leads
curl -s "https://api.close.com/api/v1/lead/?_limit=10" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, display_name, status_label, created_by_name}'
Get a Lead
curl -s "https://api.close.com/api/v1/lead/<lead-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '{id, display_name, status_label, contacts, opportunities}'
Create a Lead
Write to /tmp/request.json:
{
"name": "Acme Corp",
"contacts": [
{
"name": "Jane Smith",
"emails": [
{
"type": "office",
"email": "jane@acme.com"
}
],
"phones": [
{
"type": "office",
"phone": "+14155551234"
}
]
}
]
}
curl -s -X POST "https://api.close.com/api/v1/lead/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, display_name}'
Update a Lead
Write to /tmp/request.json:
{
"name": "Acme Corporation"
}
curl -s -X PUT "https://api.close.com/api/v1/lead/<lead-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, display_name}'
Delete a Lead
curl -s -X DELETE "https://api.close.com/api/v1/lead/<lead-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)"
Contacts
List Contacts
curl -s "https://api.close.com/api/v1/contact/?_limit=10" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, name, lead_id, emails, phones}'
Get a Contact
curl -s "https://api.close.com/api/v1/contact/<contact-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '{id, name, title, lead_id, emails, phones}'
Create a Contact
Write to /tmp/request.json:
{
"lead_id": "<lead-id>",
"name": "John Doe",
"title": "VP of Engineering",
"emails": [
{
"type": "office",
"email": "john@acme.com"
}
],
"phones": [
{
"type": "mobile",
"phone": "+14155559876"
}
]
}
curl -s -X POST "https://api.close.com/api/v1/contact/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, name, lead_id}'
Update a Contact
Write to /tmp/request.json:
{
"title": "CTO"
}
curl -s -X PUT "https://api.close.com/api/v1/contact/<contact-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, name, title}'
Delete a Contact
curl -s -X DELETE "https://api.close.com/api/v1/contact/<contact-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)"
Opportunities
List Opportunities
curl -s "https://api.close.com/api/v1/opportunity/?_limit=10" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, lead_name, status_label, status_type, value, value_currency}'
Get an Opportunity
curl -s "https://api.close.com/api/v1/opportunity/<opportunity-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '{id, lead_name, status_label, status_type, value, value_currency, confidence, note}'
Create an Opportunity
First, list available opportunity statuses to get a valid status_id:
curl -s "https://api.close.com/api/v1/status/opportunity/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, label, type}'
Write to /tmp/request.json:
{
"lead_id": "<lead-id>",
"status_id": "<status-id>",
"value": 5000,
"value_currency": "USD",
"note": "Enterprise license deal",
"confidence": 75
}
curl -s -X POST "https://api.close.com/api/v1/opportunity/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, lead_name, status_label, value}'
Update an Opportunity
Write to /tmp/request.json:
{
"value": 10000,
"confidence": 90
}
curl -s -X PUT "https://api.close.com/api/v1/opportunity/<opportunity-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, status_label, value, confidence}'
Delete an Opportunity
curl -s -X DELETE "https://api.close.com/api/v1/opportunity/<opportunity-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)"
Tasks
List Tasks
curl -s "https://api.close.com/api/v1/task/?_limit=10&is_complete=false" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, _type, text, date, is_complete, assigned_to_name, lead_name}'
Get a Task
curl -s "https://api.close.com/api/v1/task/<task-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '{id, _type, text, date, is_complete, lead_name}'
Create a Task
Write to /tmp/request.json:
{
"_type": "lead",
"lead_id": "<lead-id>",
"text": "Follow up on proposal",
"date": "2026-03-15",
"assigned_to": "<user-id>"
}
curl -s -X POST "https://api.close.com/api/v1/task/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, text, date, is_complete}'
Complete a Task
Write to /tmp/request.json:
{
"is_complete": true
}
curl -s -X PUT "https://api.close.com/api/v1/task/<task-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, text, is_complete}'
Delete a Task
curl -s -X DELETE "https://api.close.com/api/v1/task/<task-id>/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)"
Activities
List Activities
Filter by type: Call, Email, EmailThread, Note, Meeting, SMS, LeadStatusChange, OpportunityStatusChange, TaskCompleted.
curl -s "https://api.close.com/api/v1/activity/?_limit=10" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, _type, lead_id, date_created}'
List Activities for a Lead
curl -s "https://api.close.com/api/v1/activity/?lead_id=<lead-id>&_limit=10" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, _type, date_created}'
Create a Note Activity
Write to /tmp/request.json:
{
"lead_id": "<lead-id>",
"note": "Had a productive call with the team. They are interested in the enterprise plan."
}
curl -s -X POST "https://api.close.com/api/v1/activity/note/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" --header "Content-Type: application/json" -d @/tmp/request.json | jq '{id, note, date_created}'
Lead Statuses
List Lead Statuses
curl -s "https://api.close.com/api/v1/status/lead/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, label}'
Pipelines
List Pipelines
curl -s "https://api.close.com/api/v1/pipeline/" --header "Authorization: Bearer $(printenv CLOSE_TOKEN)" | jq '.data[] | {id, name}'
Guidelines
- All API endpoints use the base URL
https://api.close.com/api/v1/ - Authentication uses Bearer token:
--header "Authorization: Bearer $(printenv CLOSE_TOKEN)" - Leads are the primary object — contacts, opportunities, tasks, and activities all belong to leads
- Use
_limitand_skipquery parameters for pagination (default limit is 100, max is 200) - When creating contacts, always provide a
lead_idto associate them with an existing lead - Opportunity statuses have a
status_typeofactive,won, orlost— list available statuses before creating opportunities - Tasks support types:
lead(general) andoutgoing_call— useleadtype for most tasks - Use
_fieldsquery parameter to select specific fields and reduce response size