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-schedule-import-controller-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 Schedule Import Controller 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: schedule-import-controller
paths:
/rest/v2.0/companies/{company_id}/projects/{project_id}/schedules/{schedule_id}/imports/{job_id}/logs:
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:
- schedule-import-controller
summary: Get import logs
description: Get structured validation/import logs for the latest completed or failed import.
operationId: getImportLogs
parameters:
- name: locale
in: header
description: Optional. Locale for parsing the import report (e.g. en, fr-FR, ja-JP). Must match the locale used when the import was initiated. A mismatch will result in a parsing error.
required: false
schema:
type: string
example: en
- 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: schedule_id
in: path
description: Unique identifier for the schedule
required: true
schema:
type: string
example: '1234'
- name: job_id
in: path
description: Import job id
required: true
schema:
type: string
responses:
'200':
description: Import logs (summary + items)
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
summary:
description: Summary counts
type: object
properties:
error_count:
type: integer
format: int32
description: Number of error entries
example: 5
warning_count:
type: integer
format: int32
description: Number of warning entries
example: 3
items:
type: array
description: Log entries
items:
type: object
properties:
level:
type: string
description: Log level (localized, e.g. ERROR, ERREUR, FEHLER)
example: ERROR
message:
type: string
description: Human-readable message
example: Non-nullable field 'task_name' is null
'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: Import job or schedule not found
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
reason_code:
type: string
message:
type: string
source:
type: string
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.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D/logs',\n headers: {locale: 'en'}\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 = { ''locale'': "en" }
conn.request("GET", "/rest/v2.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D/logs", 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/v2.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D/logs \\\n --header 'locale: en'"
- 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.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D/logs\"),\n Headers =\n {\n { \"locale\", \"en\" },\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/v2.0/companies/{company_id}/projects/{project_id}/schedules/{schedule_id}/imports/{job_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:
- schedule-import-controller
summary: Get import status
description: Get the status of an import job.
operationId: getImportStatus
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: schedule_id
in: path
description: Unique identifier for the schedule
required: true
schema:
type: string
example: '1234'
- name: job_id
in: path
description: Import job id
required: true
schema:
type: string
responses:
'200':
description: Import status
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
job_id:
type: string
description: Import job id
example: '123'
status:
type: string
description: Current status
enum:
- queued
- processing
- completed
- failed
- none
example: processing
status_url:
type: string
description: URL to poll for status
example: https://api.procore.com/rest/v2.0/...
finished_at:
type: string
format: date-time
description: When the import job finished in UTC (ISO 8601)
example: '2024-01-15T10:30:45Z'
errors:
description: Present when status is failed (with optional detailed_log_url if logs exist), or when status is completed with warnings (warning message + detailed_log_url). Omitted on success with no logs.
type: object
properties:
message:
type: string
description: Error or warning message
detailed_log_url:
type: string
description: URL to fetch detailed log. Omitted when there are no logs (e.g. failed with no logs).
'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: Import job or schedule not found
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
reason_code:
type: string
message:
type: string
source:
type: string
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.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D'\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.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D")
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.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D"
- 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.0/companies/1234/projects/5678/schedules/1234/imports/%7Bjob_id%7D\"),\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.0/companies/{company_id}/projects/{project_id}/schedules/{schedule_id}/import:
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
put:
tags:
- schedule-import-controller
summary: Initiate schedule import
description: Upload a schedule file to import.
operationId: initiateImport
parameters:
- name: locale
in: header
description: Optional. Locale for the import report (e.g. en, fr-FR, ja-JP). Determines the language of validation errors and warnings in the generated report. Must be the same locale used when fetching logs via the logs endpoint.
required: false
schema:
type: string
example: en
- 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: schedule_id
in: path
description: Unique identifier for the schedule
required: true
schema:
type: string
example: '1234'
requestBody:
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'Schedule file to import. Supported formats: .mpp, .ppx, .xer.'
required:
- file
responses:
'202':
description: Import accepted; poll status_url for progress
content:
application/json:
schema:
type: object
properties:
data:
type: object
properties:
job_id:
type: string
description: Import job id
example: '123'
status:
type: string
description: Current status
enum:
- queued
- processing
- completed
- failed
- none
example: processing
status_url:
type: string
description: URL to poll for status
example: https://api.procore.com/rest/v2.0/...
finished_at:
type: string
format: date-time
description: When the import job finished in UTC (ISO 8601)
example: '2024-01-15T10:30:45Z'
errors:
description: Present when status is failed (with optional detailed_log_url if logs exist), or when status is completed with warnings (warning message + detailed_log_url). Omitted on success with no logs.
type: object
properties:
message:
type: string
description: Error or warning message
detailed_log_url:
type: string
description: URL to fetch detailed log. Omitted when there are no logs (e.g. failed with no logs).
'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.
'409':
description: A conflicting operation is already in progress for this schedule
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
reason_code:
type: string
message:
type: string
source:
type: string
'413':
description: File exceeds maximum allowed size
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
message:
type: string
details:
type: array
items:
type: object
properties:
reason_code:
type: string
message:
type: string
source:
type: string
'422':
description: The request was well-formed but was unable to be followed due to semantic errors.
x-doc:
visibility: public
stage: ga
exposure: public
x-code-samples:
- id: node_request
mimeType: multipart/form-data
title: Node.js
content: "const request = require('request');\n\nconst options = {\n method: 'PUT',\n url: 'https://api.procore.com/rest/v2.0/companies/1234/projects/5678/schedules/1234/import',\n headers: {\n locale: 'en',\n 'content-type': 'multipart/form-data; boundary=---011000010111000001101001'\n },\n formData: {file: 'string'}\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
mimeType: multipart/form-data
title: Python3
content: "import http.client\n\nconn = http.client.HTTPSConnection(\"api.procore.com\")\n\npayload = \"-----011000010111000001101001\\r\\nContent-Disposition: form-data; name=\\\"file\\\"\\r\\n\\r\\nstring\\r\\n-----011000010111000001101001--\\r\\n\"\n\nheaders = {\n 'locale': \"en\",\n 'content-type': \"multipart/form-data; boundary=---011000010111000001101001\"\n }\n\nconn.request(\"PUT\", \"/rest/v2.0/companies/1234/projects/5678/schedules/1234/import\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))"
- id: shell_curl
mimeType: multipart/form-data
title: Curl
content: "curl --request PUT \\\n --url https://api.procore.com/rest/v2.0/companies/1234/projects/5678/schedules/1234/import \\\n --header 'content-type: multipart/form-data' \\\n --header 'locale: en' \\\n --form file=string"
- id: csharp_httpclient
mimeType: multipart/form-data
title: C#
content: "var client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n Method = HttpMethod.Put,\n RequestUri = new Uri(\"https://api.procore.com/rest/v2.0/companies/1234/projects/5678/schedules/1234/import\"),\n Headers =\n {\n { \"locale\", \"en\" },\n },\n Content = new MultipartFormDataContent\n {\n new StringContent(\"string\")\n {\n Headers =\n {\n ContentDisposition = new ContentDispositionHeaderValue(\"form-data\")\n {\n Name = \"file\",\n }\n }\n },\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