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-calendars-controller-v-21-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 Calendars Controller V 21 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: calendars-controller-v-21
paths:
/rest/v2.1/companies/{company_id}/projects/{project_id}/calendars:
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: full
get:
tags:
- calendars-controller-v-21
summary: List Calendars (V2.1)
description: List all calendars in a project associated with the Scheduling/Programming tool. V2.1 returns only source intervals (parent_interval_id IS NULL) and exposes the availability JSON on Exception intervals. Use the Show Project API when you need the project time zone to interpret UTC timestamps or values expressed in project time.
operationId: listCalendars
parameters:
- name: company_id
in: path
description: Unique identifier for the company
required: true
schema:
type: string
example: '1234'
- name: project_id
in: path
description: Unique identifier for the project
required: true
schema:
type: string
example: '5678'
- name: filters[calendar_id]
in: query
description: Filter calendars by calendar_id
required: false
schema:
type: string
- name: filters[name]
in: query
description: Filter calendars by name
required: false
schema:
type: string
- name: filters[is_global]
in: query
description: Filter calendars by global status
required: false
schema:
type: boolean
- name: sort
in: query
description: Sort by supported fields. Accepts comma separated values to sort by multiple fields. Order is ascending by default, prefix field with '-' for descending
required: false
schema:
type: string
enum:
- calendar_id
- name
- is_global
- name: page
in: query
description: The page number to retrieve
required: false
schema:
type: integer
format: int32
- name: per_page
in: query
description: Number of records per page
required: false
schema:
type: integer
default: 10
maximum: 100
responses:
'200':
description: Successfully retrieved calendars
headers:
Per-Page:
description: Number of records per page
style: simple
schema:
type: integer
format: int32
Total:
description: Total number of records available
style: simple
schema:
type: integer
format: int64
Link:
description: Link header for the first, prev, next, and the last page links
style: simple
schema:
type: string
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
calendar_id:
type: string
description: The unique identifier for the calendar
example: '101'
pattern: ^\d+$
name:
type: string
description: The name of the calendar
example: 5 Day Work Week w/o Holidays
is_global:
type: boolean
description: Indicates if the calendar is available to all projects in the company
example: false
hours_per_day:
type: integer
format: int32
description: The number of working hours in a day
example: 8
days_per_week:
type: integer
format: int32
description: The number of working days in a week
example: 5
days_per_month:
type: integer
format: int32
description: The number of working days in a month
example: 20
project_id:
type: string
description: Procore Project ID
example: '12345'
pattern: ^\d+$
company_id:
type: string
description: Procore Company ID
example: '67890'
pattern: ^\d+$
calendar_intervals:
type: array
description: The intervals associated with this calendar
items:
type: object
properties:
interval_id:
type: string
description: The unique identifier for the interval
example: '1001'
pattern: ^\d+$
name:
type: string
description: The name of the interval
example: Exception 1
recurrent_start_date:
type: string
description: The start of a recurring interval. The day of week and time values are in project time zone
example: on Sun, Mon, Tue, Wed, Thu, Fri at 17:00
recurrent_end_date:
type: string
description: The end of a recurring interval. The day of week and time values are in project time zone
example: on Sun, Mon, Tue, Wed, Thu, Fri at 18:00
start_date:
type: string
description: The start date and time of the interval in UTC (ISO 8601 format)
example: '2024-05-14T08:00:00Z'
end_date:
type: string
description: The end date and time of the interval in UTC (ISO 8601 format)
example: '2024-05-14T17:00:00Z'
type:
type: string
description: The type of interval
example: working
is_working:
type: boolean
description: A flag to indicate whether this period is considered working time
example: true
availability:
description: JSON array of working slots within an Exception interval. Only present on Exception intervals.
example:
- id: slot-1
startDate: 08:00
endDate: '12:00'
required:
- interval_id
- is_working
- type
is_archived:
type: boolean
description: Indicates if the calendar is archived
example: false
created_at:
type: string
description: The creation timestamp of the calendar in UTC (ISO 8601 format)
example: '2024-05-14T08:00:00Z'
updated_at:
type: string
description: The last update timestamp of the calendar in UTC (ISO 8601 format)
example: '2024-05-15T09:30:00Z'
required:
- calendar_id
- calendar_intervals
- company_id
- days_per_month
- days_per_week
- hours_per_day
- is_global
- name
'400':
description: The server could not understand the request due to invalid syntax or parameters that fail to meet validation requirements.
'401':
description: Although the HTTP standard specifies "unauthorized", semantically this response means "unauthenticated". That is, the client must authenticate itself to get the requested response.
'403':
description: The client does not have access rights to the content; that is, it is authenticated, but the server is refusing to give the requested resource. Unlike 401, the client's identity is known to the server.
'404':
description: The server can not find the requested resource. This can mean either the URL is not recognized, or the resource itself does not exist. Servers may also send this response instead of 403 to hide the existence of a resource from an unauthorized client.
x-doc:
visibility: public
stage: ga
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/v2.1/companies/1234/projects/5678/calendars',\n qs: {\n 'filters[calendar_id]': 'SOME_STRING_VALUE',\n 'filters[name]': 'SOME_STRING_VALUE',\n 'filters[is_global]': 'SOME_BOOLEAN_VALUE',\n sort: 'SOME_STRING_VALUE',\n page: 'SOME_INTEGER_VALUE',\n per_page: 'SOME_INTEGER_VALUE'\n }\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")
conn.request("GET", "/rest/v2.1/companies/1234/projects/5678/calendars?filters%5Bcalendar_id%5D=SOME_STRING_VALUE&filters%5Bname%5D=SOME_STRING_VALUE&filters%5Bis_global%5D=SOME_BOOLEAN_VALUE&sort=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&per_page=SOME_INTEGER_VALUE")
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/v2.1/companies/1234/projects/5678/calendars?filters%5Bcalendar_id%5D=SOME_STRING_VALUE&filters%5Bname%5D=SOME_STRING_VALUE&filters%5Bis_global%5D=SOME_BOOLEAN_VALUE&sort=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&per_page=SOME_INTEGER_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/v2.1/companies/1234/projects/5678/calendars?filters%5Bcalendar_id%5D=SOME_STRING_VALUE&filters%5Bname%5D=SOME_STRING_VALUE&filters%5Bis_global%5D=SOME_BOOLEAN_VALUE&sort=SOME_STRING_VALUE&page=SOME_INTEGER_VALUE&per_page=SOME_INTEGER_VALUE\"),\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/v2.1/companies/{company_id}/projects/{project_id}/calendars/{calendar_id}:
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: full
get:
tags:
- calendars-controller-v-21
summary: Get Calendar by ID (V2.1)
description: Get a single calendar by id. V2.1 returns only source intervals (parent_interval_id IS NULL) and exposes the availability JSON on Exception intervals. Use the Show Project API when you need the project time zone to interpret UTC timestamps or values expressed in project time.
operationId: getCalendarById
parameters:
- name: company_id
in: path
description: Unique identifier for the company
required: true
schema:
type: string
example: '1234'
- name: project_id
in: path
description: Unique identifier for the project
required: true
schema:
type: string
example: '5678'
- name: calendar_id
in: path
description: Calendar ID
required: true
schema:
type: string
pattern: ^\d+$
example: '101'
responses:
'200':
description: Successfully retrieved calendar
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
calendar_id:
type: string
description: The unique identifier for the calendar
example: '101'
pattern: ^\d+$
name:
type: string
description: The name of the calendar
example: 5 Day Work Week w/o Holidays
is_global:
type: boolean
description: Indicates if the calendar is available to all projects in the company
example: false
hours_per_day:
type: integer
format: int32
description: The number of working hours in a day
example: 8
days_per_week:
type: integer
format: int32
description: The number of working days in a week
example: 5
days_per_month:
type: integer
format: int32
description: The number of working days in a month
example: 20
project_id:
type: string
description: Procore Project ID
example: '12345'
pattern: ^\d+$
company_id:
type: string
description: Procore Company ID
example: '67890'
pattern: ^\d+$
calendar_intervals:
type: array
description: The intervals associated with this calendar
items:
type: object
properties:
interval_id:
type: string
description: The unique identifier for the interval
example: '1001'
pattern: ^\d+$
name:
type: string
description: The name of the interval
example: Exception 1
recurrent_start_date:
type: string
description: The start of a recurring interval. The day of week and time values are in project time zone
example: on Sun, Mon, Tue, Wed, Thu, Fri at 17:00
recurrent_end_date:
type: string
description: The end of a recurring interval. The day of week and time values are in project time zone
example: on Sun, Mon, Tue, Wed, Thu, Fri at 18:00
start_date:
type: string
description: The start date and time of the interval in UTC (ISO 8601 format)
example: '2024-05-14T08:00:00Z'
end_date:
type: string
description: The end date and time of the interval in UTC (ISO 8601 format)
example: '2024-05-14T17:00:00Z'
type:
type: string
description: The type of interval
example: working
is_working:
type: boolean
description: A flag to indicate whether this period is considered working time
example: true
availability:
description: JSON array of working slots within an Exception interval. Only present on Exception intervals.
example:
- id: slot-1
startDate: 08:00
endDate: '12:00'
required:
- interval_id
- is_working
- type
is_archived:
type: boolean
description: Indicates if the calendar is archived
example: false
created_at:
type: string
description: The creation timestamp of the calendar in UTC (ISO 8601 format)
example: '2024-05-14T08:00:00Z'
updated_at:
type: string
description: The last update timestamp of the calendar in UTC (ISO 8601 format)
example: '2024-05-15T09:30:00Z'
required:
- calendar_id
- calendar_intervals
- company_id
- days_per_month
- days_per_week
- hours_per_day
- is_global
- name
'400':
description: The server could not understand the request due to invalid syntax or parameters that fail to meet validation requirements.
'401':
description: Although the HTTP standard specifies "unauthorized", semantically this response means "unauthenticated". That is, the client must authenticate itself to get the requested response.
'403':
description: The client does not have access rights to the content; that is, it is authenticated, but the server is refusing to give the requested resource. Unlike 401, the client's identity is known to the server.
'404':
description: The server can not find the requested resource. This can mean either the URL is not recognized, or the resource itself does not exist. Servers may also send this response instead of 403 to hide the existence of a resource from an unauthorized client.
x-doc:
visibility: public
stage: ga
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/v2.1/companies/1234/projects/5678/calendars/101'\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")
conn.request("GET", "/rest/v2.1/companies/1234/projects/5678/calendars/101")
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/v2.1/companies/1234/projects/5678/calendars/101"
- 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/v2.1/companies/1234/projects/5678/calendars/101\"),\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