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/procore:procore-capital-planning-change-history-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
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: Procore REST Capital Planning — Change History API
version: v1.0/v2.0
description: Merged from the per-resource OpenAPI documents Procore publishes through its developer portal (https://developers.procore.com/api/v1/resource_groups). Originals are kept verbatim in openapi/_original/resources/.
x-source: https://developers.procore.com/api/v1/resource_groups
servers:
- url: https://api.procore.com
description: Production
security:
- bearerAuth: []
tags:
- name: Capital Planning — Change History
paths:
/rest/v1.0/companies/{company_id}/capital_planning/change_history:
parameters:
- name: Procore-Company-Id
in: header
description: Unique company identifier associated with the Procore User Account.
required: true
schema:
type: integer
x-compliance-level: partial
get:
description: Returns a paged, filterable, date-sorted list of change records across every project in the company.
operationId: ChangeHistoryController_listHistory_rest/v1.0
parameters:
- name: company_id
required: true
in: path
description: Procore company identifier
schema:
type: string
- name: search
required: false
in: query
description: Free text, split on whitespace. Matches rows whose project name, item name, or "Changed" label contains any of the terms.
schema:
type: string
- name: date_to
required: false
in: query
description: YYYY-MM-DD, inclusive. Applies on its own.
schema:
type: string
- name: date_from
required: false
in: query
description: YYYY-MM-DD, inclusive. Applies on its own; pass the same date as date_to for a single day.
schema:
type: string
- name: changed[]
required: false
in: query
description: Filter by "Changed" label (e.g. "Planned Amount", "Curve", "Forecast")
schema:
type: array
items:
type: string
- name: actor_id[]
required: false
in: query
description: Filter by the acting user’s Procore id
schema:
type: array
items:
type: string
- name: project_id[]
required: false
in: query
description: Filter by procore_project_id
schema:
type: array
items:
type: string
- name: sort
required: false
in: query
description: 'Sort by date: "asc" or "desc" (default desc, newest first)'
schema:
type: string
- name: per_page
required: false
in: query
description: Page size (default 50, max 100)
schema:
type: number
- name: page
required: false
in: query
description: Page number, 1-indexed (default 1)
schema:
type: number
responses:
'200':
description: Paged change history rows
headers:
Total:
description: Total matching records
schema:
type: integer
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
id:
type: string
example: '10042'
procore_project_id:
type: string
example: '9988'
project_name:
type: string
example: Tower A
item_type:
allOf:
- type: string
enum:
- line_item
- forecast_period
item_name:
type:
- string
- 'null'
example: Concrete
changed:
type: string
example: Planned Amount
old_value:
type:
- string
- 'null'
example: '1000000.00'
new_value:
type:
- string
- 'null'
example: '1250000.00'
actor_procore_id:
type:
- string
- 'null'
example: '4242'
actor_name:
type:
- string
- 'null'
example: Jane Doe
created_at:
type: string
example: '2027-03-01T18:40:00.000Z'
required:
- id
- procore_project_id
- project_name
- item_type
- item_name
- changed
- old_value
- new_value
- actor_procore_id
- actor_name
- created_at
meta:
type: object
properties:
total:
type: number
example: 132
page:
type: number
example: 1
per_page:
type: number
example: 50
required:
- total
- page
- per_page
required:
- data
- meta
'400':
description: Bad request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
required:
- field
- message
required:
- code
- message
- details
required:
- error
'403':
description: Access denied — `TOOL_NOT_ACTIVATED`, `INSUFFICIENT_PERMISSIONS`, `READONLY_ACCESS`, or `ADMIN_ACCESS_REQUIRED`
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
required:
- field
- message
required:
- code
- message
- details
required:
- error
'503':
description: The permission check could not be completed (`AUTHORIZATION_UNAVAILABLE`) — safe to retry
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
required:
- field
- message
required:
- code
- message
- details
required:
- error
summary: List capital planning change history
tags:
- Capital Planning — Change History
x-doc:
visibility: public
stage: beta
exposure: public
x-code-samples:
- id: node_request
title: Node.js
content: "const request = require('request');\n\nconst options = {\n method: 'GET',\n url: 'https://api.procore.com/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history',\n qs: {\n search: 'SOME_STRING_VALUE',\n date_to: 'SOME_STRING_VALUE',\n date_from: 'SOME_STRING_VALUE',\n 'changed[]': 'SOME_ARRAY_VALUE',\n 'actor_id[]': 'SOME_ARRAY_VALUE',\n 'project_id[]': 'SOME_ARRAY_VALUE',\n sort: 'SOME_STRING_VALUE',\n per_page: 'SOME_NUMBER_VALUE',\n page: 'SOME_NUMBER_VALUE'\n },\n headers: {'Procore-Company-Id': 'SOME_STRING_VALUE'}\n};\n\nrequest(options, function (error, response, body) {\n if (error) throw new Error(error);\n\n console.log(body);\n});\n"
- id: python_python3
title: Python3
content: 'import http.client
conn = http.client.HTTPSConnection("api.procore.com")
headers = { ''Procore-Company-Id'': "SOME_STRING_VALUE" }
conn.request("GET", "/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history?search=SOME_STRING_VALUE&date_to=SOME_STRING_VALUE&date_from=SOME_STRING_VALUE&changed%5B%5D=SOME_ARRAY_VALUE&actor_id%5B%5D=SOME_ARRAY_VALUE&project_id%5B%5D=SOME_ARRAY_VALUE&sort=SOME_STRING_VALUE&per_page=SOME_NUMBER_VALUE&page=SOME_NUMBER_VALUE", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))'
- id: shell_curl
title: Curl
content: "curl --request GET \\\n --url 'https://api.procore.com/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history?search=SOME_STRING_VALUE&date_to=SOME_STRING_VALUE&date_from=SOME_STRING_VALUE&changed%5B%5D=SOME_ARRAY_VALUE&actor_id%5B%5D=SOME_ARRAY_VALUE&project_id%5B%5D=SOME_ARRAY_VALUE&sort=SOME_STRING_VALUE&per_page=SOME_NUMBER_VALUE&page=SOME_NUMBER_VALUE' \\\n --header 'Procore-Company-Id: SOME_STRING_VALUE'"
- id: csharp_httpclient
title: C#
content: "var client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n Method = HttpMethod.Get,\n RequestUri = new Uri(\"https://api.procore.com/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history?search=SOME_STRING_VALUE&date_to=SOME_STRING_VALUE&date_from=SOME_STRING_VALUE&changed%5B%5D=SOME_ARRAY_VALUE&actor_id%5B%5D=SOME_ARRAY_VALUE&project_id%5B%5D=SOME_ARRAY_VALUE&sort=SOME_STRING_VALUE&per_page=SOME_NUMBER_VALUE&page=SOME_NUMBER_VALUE\"),\n Headers =\n {\n { \"Procore-Company-Id\", \"SOME_STRING_VALUE\" },\n },\n};\nusing (var response = await client.SendAsync(request))\n{\n response.EnsureSuccessStatusCode();\n var body = await response.Content.ReadAsStringAsync();\n Console.WriteLine(body);\n}"
x-rate-limit-enabled: true
x-procore-kong-tags:
- rate-limit:enabled
/rest/v1.0/companies/{company_id}/capital_planning/change_history/filter_options:
parameters:
- name: Procore-Company-Id
in: header
description: Unique company identifier associated with the Procore User Account.
required: true
schema:
type: integer
x-compliance-level: partial
get:
description: Returns the selectable values for the Project, Action By, or Changed filter, sourced from change history itself so removed projects and departed users remain reachable.
operationId: ChangeHistoryController_listFilterOptions_rest/v1.0
parameters:
- name: company_id
required: true
in: path
description: Procore company identifier
schema:
type: string
- name: limit
required: false
in: query
description: Max options to return (default 50, max 100)
schema:
type: number
- name: search
required: false
in: query
description: Case-insensitive substring match on the option label
schema:
type: string
- name: kind
required: true
in: query
description: 'One of: project, actor, changed'
schema:
type: string
responses:
'200':
description: Change history filter options
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
value:
type: string
example: '9988'
label:
type: string
example: Tower A
required:
- value
- label
required:
- data
'400':
description: Bad request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
required:
- field
- message
required:
- code
- message
- details
required:
- error
'403':
description: Access denied — `TOOL_NOT_ACTIVATED`, `INSUFFICIENT_PERMISSIONS`, `READONLY_ACCESS`, or `ADMIN_ACCESS_REQUIRED`
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
required:
- field
- message
required:
- code
- message
- details
required:
- error
'503':
description: The permission check could not be completed (`AUTHORIZATION_UNAVAILABLE`) — safe to retry
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
field:
type: string
message:
type: string
required:
- field
- message
required:
- code
- message
- details
required:
- error
summary: List change history filter options
tags:
- Capital Planning — Change History
x-doc:
visibility: public
stage: beta
exposure: public
x-code-samples:
- id: node_request
title: Node.js
content: "const request = require('request');\n\nconst options = {\n method: 'GET',\n url: 'https://api.procore.com/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history/filter_options',\n qs: {\n limit: 'SOME_NUMBER_VALUE',\n search: 'SOME_STRING_VALUE',\n kind: 'SOME_STRING_VALUE'\n },\n headers: {'Procore-Company-Id': 'SOME_STRING_VALUE'}\n};\n\nrequest(options, function (error, response, body) {\n if (error) throw new Error(error);\n\n console.log(body);\n});\n"
- id: python_python3
title: Python3
content: 'import http.client
conn = http.client.HTTPSConnection("api.procore.com")
headers = { ''Procore-Company-Id'': "SOME_STRING_VALUE" }
conn.request("GET", "/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history/filter_options?limit=SOME_NUMBER_VALUE&search=SOME_STRING_VALUE&kind=SOME_STRING_VALUE", headers=headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))'
- id: shell_curl
title: Curl
content: "curl --request GET \\\n --url 'https://api.procore.com/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history/filter_options?limit=SOME_NUMBER_VALUE&search=SOME_STRING_VALUE&kind=SOME_STRING_VALUE' \\\n --header 'Procore-Company-Id: SOME_STRING_VALUE'"
- id: csharp_httpclient
title: C#
content: "var client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n Method = HttpMethod.Get,\n RequestUri = new Uri(\"https://api.procore.com/rest/v1.0/companies/%7Bcompany_id%7D/capital_planning/change_history/filter_options?limit=SOME_NUMBER_VALUE&search=SOME_STRING_VALUE&kind=SOME_STRING_VALUE\"),\n Headers =\n {\n { \"Procore-Company-Id\", \"SOME_STRING_VALUE\" },\n },\n};\nusing (var response = await client.SendAsync(request))\n{\n response.EnsureSuccessStatusCode();\n var body = await response.Content.ReadAsStringAsync();\n Console.WriteLine(body);\n}"
x-rate-limit-enabled: true
x-procore-kong-tags:
- rate-limit:enabled
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer