Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/copper-financial:copper-financial-companies-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Copper CRM Read-Only Companies API
description: Read-only operations for Copper CRM API - optimized for ChatGPT integration
version: 1.0.0
contact:
name: Copper Developer Support
url: https://developer.copper.com/
email: support@copper.com
servers:
- url: https://api.copper.com/developer_api/v1
description: Copper API Production Server
security:
- bearerAuth: []
tags:
- name: Companies
description: Company management operations
paths:
/companies/search:
post:
tags:
- Companies
summary: Search companies
description: Search companies. Response uses a pagination envelope (`page_number`,`total`,`data`) so ChatGPT can read pagination info; the X-PW-TOTAL header still exists. Paginate with page_number/page_size (max 200) until received records equal total. Limited to 100K results.
operationId: searchCompanies
parameters:
- name: custom_field_computed_values
in: query
required: false
description: When true, returns computed custom field values (human-readable labels) in addition to option IDs for Dropdown and Multi-select fields. The response will include a 'computed_value' field alongside the 'value' field in custom_fields array.
schema:
type: boolean
default: false
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
ids:
type: array
items:
type: integer
description: An array of Company IDs to retrieve
name:
oneOf:
- type: string
description: 'Simple string for exact match (case-insensitive). Example: ''Acme Corp'' will only match companies named exactly ''Acme Corp''.'
- type: object
description: Advanced object format for controlling match type
properties:
value:
type: string
description: The company name to search for
special_value:
type: array
description: Array specifying the match type
items:
type: object
properties:
type:
type: string
enum:
- partial
- exact
description: 'Match type: ''partial'' for substring matching (e.g., ''Happy Cat'' matches ''Happy Cat Hotels''), ''exact'' for exact match'
required:
- type
maxItems: 1
required:
- value
- special_value
example:
value: Happy Cat
special_value:
- type: partial
description: Filter by company name. Use simple string for exact match (case-insensitive), or use object format with special_value for partial matching capability.
email_domain:
type: string
description: Filter by email domain (unique key for companies)
email_domains:
type: array
items:
type: string
description: An array of email domains to filter by
phone_number:
type: string
description: Filter by phone number
city:
type: string
description: Filter by city in address
state:
type: string
description: Filter by state in address
postal_code:
type: string
description: Filter by postal code in address
country:
type: string
description: Filter by country in address (two-character country code)
primary_contact_ids:
type: array
items:
type: integer
description: An array of person IDs who are the primary contacts for these companies.
tags:
type: array
items:
type: string
description: An array of tags to filter by
assignee_ids:
type: array
items:
type: integer
description: An array of assignee IDs to filter by (the user IDs who own these companies). Use -2 for no assignee.
contact_type_ids:
type: array
items:
type: integer
description: An array of contact type IDs to filter by. See List Contact Types.
socials:
type: array
items:
type: string
description: An array of social profile URLs to filter by
followed:
type: integer
enum:
- 1
- 2
description: Filter by followed status. Use 1 for followed companies, 2 for not followed.
age:
type: integer
description: Maximum age in seconds of the company record
minimum_interaction_count:
type: integer
description: Filter by minimum number of interactions
maximum_interaction_count:
type: integer
description: Filter by maximum number of interactions
minimum_interaction_date:
type: integer
description: Unix timestamp for the earliest date of the last interaction
maximum_interaction_date:
type: integer
description: Unix timestamp for the latest date of the last interaction
minimum_created_date:
type: integer
description: Unix timestamp for the minimum creation date
maximum_created_date:
type: integer
description: Unix timestamp for the maximum creation date
minimum_modified_date:
type: integer
description: Unix timestamp for the minimum modification date
maximum_modified_date:
type: integer
description: Unix timestamp for the maximum modification date
custom_fields:
type: array
description: An array of custom field filters to search by. For date fields, use minimum_value and maximum_value. For multi-select fields, you can use allow_empty to include records where the field is empty.
items:
type: object
properties:
custom_field_definition_id:
type: integer
description: The custom field definition ID to filter by
value:
description: The value to match (can be string, number, array of option IDs, etc.)
minimum_value:
type: integer
description: For date/number fields, the minimum value (Unix timestamp for dates)
maximum_value:
type: integer
description: For date/number fields, the maximum value (Unix timestamp for dates)
allow_empty:
type: boolean
description: When true, includes records where this custom field is empty/null
sort_by:
type: string
enum:
- name
- phone
- contact
- contact_first_name
- contact_last_name
- date_modified
- date_created
- email_domain
- city
- state
- country
- zip
- assignee
- contact_group
- last_interaction
- interaction_count
- primary_website
- socials
description: The field on which to sort the results
sort_direction:
type: string
enum:
- asc
- desc
description: The direction in which to sort the results
page_number:
type: integer
minimum: 1
default: 1
description: The page number (starting with 1) that you would like to view
page_size:
type: integer
minimum: 1
maximum: 200
default: 50
description: The number of entries included in a page of results
fields:
type: array
description: Specify which fields to include in the response to reduce payload size. Include system field names as strings (e.g., 'name', 'email_domain', 'phone_numbers'). To include specific custom fields, add an object with custom_fields array. If omitted, all fields are returned.
items:
oneOf:
- type: string
description: System field name (e.g., 'id', 'name', 'email_domain', 'phone_numbers', 'address', 'assignee_id', 'contact_type_id', 'primary_contact_id', 'tags', 'socials', 'websites', 'interaction_count', 'date_created', 'date_modified')
- type: object
properties:
custom_fields:
type: array
description: Array of custom field definition IDs to include
items:
type: object
properties:
custom_field_definition_id:
type: integer
description: The ID of the custom field definition to include in the response
required:
- custom_field_definition_id
required:
- custom_fields
example:
- id
- name
- email_domain
- assignee_id
- interaction_count
responses:
'200':
description: Companies retrieved successfully
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
X-PW-TOTAL:
$ref: '#/components/headers/X-PW-TOTAL'
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/PaginationEnvelope'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Company'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
/companies/{id}/activities:
post:
tags:
- Companies
summary: Get company activities
description: Retrieve all activities associated with a specific company
operationId: getCompanyActivities
parameters:
- name: id
in: path
required: true
description: Company ID
schema:
type: integer
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
page_number:
type: integer
minimum: 1
default: 1
description: The page number (starting with 1) that you would like to view
page_size:
type: integer
minimum: 1
maximum: 200
default: 50
description: The number of entries included in a page of results
responses:
'200':
description: Company activities retrieved successfully
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
X-PW-TOTAL:
$ref: '#/components/headers/X-PW-TOTAL'
content:
application/json:
schema:
allOf:
- $ref: '#/components/schemas/PaginationEnvelope'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Activity'
'400':
$ref: '#/components/responses/BadRequest'
'401':
$ref: '#/components/responses/Unauthorized'
'404':
$ref: '#/components/responses/NotFound'
'429':
$ref: '#/components/responses/TooManyRequests'
'500':
$ref: '#/components/responses/InternalServerError'
components:
headers:
Retry-After:
description: The number of seconds to wait before making a new request after hitting the rate limit
schema:
type: integer
example: 60
X-RateLimit-Reset:
description: The time at which the current rate limit window resets, in UTC epoch seconds
schema:
type: integer
example: 1640995200
X-RateLimit-Remaining:
description: The number of requests remaining in the current time window
schema:
type: integer
example: 179
X-PW-TOTAL:
description: 'An upper bound of the total number of records that match the search criteria. This value is now also surfaced inside the response body as the ''total'' field of the pagination envelope so ChatGPT does not need to read headers. Use this with page_size (or the body-level total) to calculate the number of pages needed for pagination. Note: Search requests are limited to returning only the first 100,000 records regardless of pagination parameters.'
schema:
type: integer
example: 775
X-RateLimit-Limit:
description: The maximum number of requests allowed in the current time window
schema:
type: integer
example: 180
schemas:
Activity:
type: object
description: Copper keeps a record of activities for People, Leads, Opportunities, and Companies. Only 'User' type Activities can be created or modified using the developer API. 'System' type Activities are read-only.
properties:
id:
type: integer
description: Unique identifier for the activity
example: 3061844454
parent:
type: object
description: The identifier of the resource to which this activity belongs
properties:
id:
type: integer
description: The ID of the parent resource
example: 9607580
type:
type: string
description: The type of the parent resource
enum:
- lead
- person
- company
- opportunity
example: company
required:
- id
- type
type:
type: object
description: The activity type of this activity
properties:
id:
type: integer
description: The ID of the activity type
example: 190711
category:
type: string
description: The category of the activity type
enum:
- user
- system
example: user
required:
- id
- category
user_id:
type: integer
nullable: true
description: When applicable, the id of the user who performed this activity
example: 137658
details:
type: string
nullable: true
description: When applicable, the text body of this activity
example: Demo phone call
activity_date:
type: integer
nullable: true
description: A Unix timestamp representing the time at which this activity took place
example: 1496710783
old_value:
nullable: true
description: When applicable, the value of a resource's property before this activity took place
example: null
new_value:
nullable: true
description: When applicable, the value of a resource's property after this activity took place
example: null
date_created:
type: integer
description: A Unix timestamp representing the time at which this activity was created
example: 1496710787
date_modified:
type: integer
description: A Unix timestamp representing the time at which this activity was last modified
example: 1496710783
required:
- id
- parent
- type
- details
PaginationEnvelope:
type: object
description: Standard paginated response envelope returned for ChatGPT-only requests. Mirrors the previous pagination headers by surfacing totals inside the response body while keeping the original headers available.
properties:
page_number:
type: integer
description: Current page number (defaults to 1 when not provided in the request).
example: 1
total:
type: integer
description: Total number of records that match the request filters (equivalent to the X-PW-TOTAL header).
example: 775
data:
type: array
description: Records returned for the requested page. The item schema depends on the endpoint using this envelope.
items: {}
required:
- page_number
- total
- data
example:
page_number: 1
total: 775
data: []
Company:
type: object
properties:
id:
type: integer
description: Unique identifier for the company
example: 9607580
name:
type: string
description: The name of the company
example: Dunder Mifflin (sample)
address:
type: object
nullable: true
description: An encapsulation of the company's street, city, state, postal code, and country
properties:
street:
type: string
example: 213 West Main Street
city:
type: string
example: Scranton
state:
type: string
example: PA
postal_code:
type: string
example: '18501'
country:
type: string
example: ''
assignee_id:
type: integer
nullable: true
description: Unique identifier of the user that will be the owner of the company
example: null
contact_type_id:
type: integer
nullable: true
description: The unique identifier of the contact type of the company
example: null
details:
type: string
nullable: true
description: Description of the company
example: 'Keywords: Dunder Mifflin, Dunder Mifflin Infinity, Dunder Mifflin Paper'
email_domain:
type: string
nullable: true
description: The domain to which email addresses for the company belong. This is a unique key for companies - no two records can have the same domain name.
example: dundermifflin.com
phone_numbers:
type: array
description: An array of phone numbers belonging to the company
items:
type: object
properties:
number:
type: string
description: A phone number
example: '4153554776'
category:
type: string
description: The category of the phone number
example: work
primary_contact_id:
type: integer
nullable: true
description: The unique identifier of the person who is the primary contact for this company
example: 27140359
socials:
type: array
description: An array of social profiles belonging to the company
items:
type: object
properties:
url:
type: string
description: The URL of a social profile
example: https://www.linkedin.com/in/sabreinc
category:
type: string
description: The category of the social profile
example: linkedin
tags:
type: array
description: An array of the tags associated with the company
items:
type: string
example: []
websites:
type: array
description: An array of websites belonging to the company
items:
type: object
properties:
url:
type: string
description: The URL of a website
example: http://www.dundermifflin.com/index.shtml
category:
type: string
description: The category of the website
example: work
custom_fields:
type: array
description: An array of custom field values belonging to the company. When custom_field_computed_values query parameter is true, each field will include a computed_value with human-readable labels for Dropdown and Multi-select fields.
items:
type: object
properties:
custom_field_definition_id:
type: integer
description: The id of the custom field definition for which this custom field stores a value
example: 100764
value:
description: The value (number, string, option id, or timestamp) of this custom field
nullable: true
example: null
computed_value:
description: The human-readable value of this custom field. For Dropdown/Multi-select fields, this contains the option label(s) instead of IDs. Only present when custom_field_computed_values=true is specified.
nullable: true
interaction_count:
type: integer
description: The number of interactions with this company
example: 0
date_created:
type: integer
description: A Unix timestamp representing the time at which this company was created
example: 1483988828
date_modified:
type: integer
description: A Unix timestamp representing the time at which this company was last modified
example: 1489018922
required:
- id
- name
Error:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: Error code
example: RATE_LIMIT_EXCEEDED
message:
type: string
description: Human-readable error message
example: You have exceeded your rate limit of 180 requests per minute
details:
type: object
description: Additional error details
additionalProperties: true
required:
- code
- message
required:
- error
responses:
InternalServerError:
description: Internal Server Error - An unexpected error occurred
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
Unauthorized:
description: Unauthorized - Authentication credentials were missing or incorrect
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
BadRequest:
description: Bad Request - The request was invalid or cannot be served
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
TooManyRequests:
description: Too Many Requests - Rate limit exceeded
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
Retry-After:
$ref: '#/components/headers/Retry-After'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
NotFound:
description: Not Found - The requested resource was not found
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/Error'
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: Copper API key for authentication. Get your API key from your Copper account settings.
x-rate-limit:
description: Copper API rate limiting information
general:
limit: 180
period: minute
description: Maximum of 180 requests per minute for general API calls
bulk:
limit: 3
period: second
description: Maximum of 3 requests per second for bulk operations