Agent skill
close
Close CRM API for sales management. Use when user mentions "Close CRM", "Close.io", "sales leads", or asks about sales pipeline.
Install this agent skill to your Project
npx add-skill https://github.com/vm0-ai/vm0-skills/tree/main/close
SKILL.md
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
Didn't find tool you were looking for?