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-workflow-instances-bulk-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 Workflow Instances (Bulk) 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: Workflow Instances (Bulk)
paths:
/rest/v2.0/companies/{company_id}/projects/{project_id}/workflows/instances/bulk_create:
parameters:
- name: Procore-Company-Id
in: header
description: Unique company identifier associated with the Procore User Account.
required: true
schema:
type: integer
- name: company_id
in: path
description: Unique identifier for the company.
required: true
schema:
type: string
- name: project_id
in: path
required: true
description: Unique identifier for the project.
schema:
type: string
x-compliance-level: partial
post:
x-doc:
visibility: public
stage: ga
exposure: public
summary: Bulk Create Workflow Instances (Project) (Public)
description: 'Asynchronously bulk create workflow instances for a list of project-level items. If an active instance already exists for an item, a failure will be returned for that item.
The returned async operation id can be used to query for status using the `GET /rest/v2.0/companies/{company_id}/async_operations/{operation_id}` API. The result field of the operation contains a list of completed and failed items.
For example:
````json
{
"completed_items": [
{
"item_id": "123",
"instance_id": "456"
}
],
"failed_items": [
{
"item_id": "789",
"step": "create",
"message": "Item not found"
}
]
}
````'
tags:
- Workflow Instances (Bulk)
parameters:
- required: false
name: Idempotency-Token
in: header
description: Client-generated UUID v4 identifying a create operation. Retrying with the same token returns the original result instead of creating a duplicate.
schema:
type: string
requestBody:
content:
application/json:
schema:
type: object
description: Workflow Instances Bulk Create
properties:
tool_type:
type: string
description: Tool that instances are being created for.
example: drawing
tool_subtype:
type:
- string
- 'null'
description: Tool sub-type. Only required for specific tools.
example: '-18472'
items:
type: array
description: List of objects to create workflow instances for.
items:
type: object
properties:
item_id:
type: string
description: ID of the item to create the workflow for.
example: '9238237'
preset_id:
type: string
description: ID of the workflow configuration to use when creating the workflow.
example: '328274'
required:
- tool_type
- items
responses:
'202':
description: Accepted
content:
application/json:
schema:
type: object
description: Workflow Instances Bulk Create
properties:
data:
type: object
description: Result of the bulk creation request
properties:
operation_id:
type: string
description: ID of the asynchronous operation
example: '115654'
operation_type:
type: string
description: Type of the asynchronous operation
example: workflows_instance_bulk_create
'400':
description: Bad Request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'403':
description: Forbidden
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'422':
description: Unprocessable Entity
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
x-code-samples:
- id: node_request
mimeType: application/json
title: Node.js
content: "const request = require('request');\n\nconst options = {\n method: 'POST',\n url: 'https://api.procore.com/rest/v2.0/companies/%7Bcompany_id%7D/projects/%7Bproject_id%7D/workflows/instances/bulk_create',\n headers: {'Idempotency-Token': 'SOME_STRING_VALUE', 'content-type': 'application/json'},\n body: {\n tool_type: 'drawing',\n tool_subtype: '-18472',\n items: [{item_id: '9238237', preset_id: '328274'}]\n },\n json: true\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: application/json
title: Python3
content: "import http.client\n\nconn = http.client.HTTPSConnection(\"api.procore.com\")\n\npayload = \"{\\\"tool_type\\\":\\\"drawing\\\",\\\"tool_subtype\\\":\\\"-18472\\\",\\\"items\\\":[{\\\"item_id\\\":\\\"9238237\\\",\\\"preset_id\\\":\\\"328274\\\"}]}\"\n\nheaders = {\n 'Idempotency-Token': \"SOME_STRING_VALUE\",\n 'content-type': \"application/json\"\n }\n\nconn.request(\"POST\", \"/rest/v2.0/companies/%7Bcompany_id%7D/projects/%7Bproject_id%7D/workflows/instances/bulk_create\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))"
- id: shell_curl
mimeType: application/json
title: Curl
content: "curl --request POST \\\n --url https://api.procore.com/rest/v2.0/companies/%7Bcompany_id%7D/projects/%7Bproject_id%7D/workflows/instances/bulk_create \\\n --header 'Idempotency-Token: SOME_STRING_VALUE' \\\n --header 'content-type: application/json' \\\n --data '{\"tool_type\":\"drawing\",\"tool_subtype\":\"-18472\",\"items\":[{\"item_id\":\"9238237\",\"preset_id\":\"328274\"}]}'"
- id: csharp_httpclient
mimeType: application/json
title: C#
content: "var client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n Method = HttpMethod.Post,\n RequestUri = new Uri(\"https://api.procore.com/rest/v2.0/companies/%7Bcompany_id%7D/projects/%7Bproject_id%7D/workflows/instances/bulk_create\"),\n Headers =\n {\n { \"Idempotency-Token\", \"SOME_STRING_VALUE\" },\n },\n Content = new StringContent(\"{\\\"tool_type\\\":\\\"drawing\\\",\\\"tool_subtype\\\":\\\"-18472\\\",\\\"items\\\":[{\\\"item_id\\\":\\\"9238237\\\",\\\"preset_id\\\":\\\"328274\\\"}]}\")\n {\n Headers =\n {\n ContentType = new MediaTypeHeaderValue(\"application/json\")\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
operationId: bulkCreateWorkflowInstancesProjectPublic
/rest/v2.0/companies/{company_id}/workflows/instances/bulk_create:
parameters:
- name: Procore-Company-Id
in: header
description: Unique company identifier associated with the Procore User Account.
required: true
schema:
type: integer
- name: company_id
in: path
description: Unique identifier for the company.
required: true
schema:
type: string
x-compliance-level: partial
post:
x-doc:
visibility: public
stage: ga
exposure: public
summary: Bulk Create Workflow Instances (Company) (Public)
description: 'Asynchronously bulk create workflow instances for a list of company-level items. If an active instance already exists for an item, a failure will be returned for that item.
The returned async operation id can be used to query for status using the `GET /rest/v2.0/companies/{company_id}/async_operations/{operation_id}` API. The result field of the operation contains a list of completed and failed items.
For example:
````json
{
"completed_items": [
{
"item_id": "123",
"instance_id": "456"
}
],
"failed_items": [
{
"item_id": "789",
"step": "create",
"message": "Item not found"
}
]
}
````'
tags:
- Workflow Instances (Bulk)
parameters:
- required: false
name: Idempotency-Token
in: header
description: Client-generated UUID v4 identifying a create operation. Retrying with the same token returns the original result instead of creating a duplicate.
schema:
type: string
requestBody:
content:
application/json:
schema:
type: object
description: Workflow Instances Bulk Create
properties:
tool_type:
type: string
description: Tool that instances are being created for.
example: drawing
tool_subtype:
type:
- string
- 'null'
description: Tool sub-type. Only required for specific tools.
example: '-18472'
items:
type: array
description: List of objects to create workflow instances for.
items:
type: object
properties:
item_id:
type: string
description: ID of the item to create the workflow for.
example: '9238237'
preset_id:
type: string
description: ID of the workflow configuration to use when creating the workflow.
example: '328274'
required:
- tool_type
- items
responses:
'202':
description: Accepted
content:
application/json:
schema:
type: object
description: Workflow Instances Bulk Create
properties:
data:
type: object
description: Result of the bulk creation request
properties:
operation_id:
type: string
description: ID of the asynchronous operation
example: '115654'
operation_type:
type: string
description: Type of the asynchronous operation
example: workflows_instance_bulk_create
'400':
description: Bad Request
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'401':
description: Unauthorized
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'403':
description: Forbidden
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'404':
description: Not Found
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
'422':
description: Unprocessable Entity
content:
application/json:
schema:
type: object
properties:
error:
type: object
properties:
code:
type: string
description: HTTP status in screaming snake case (like BAD_REQUEST)
message:
type: string
description: Human readable message describing error.
details:
type: array
description: Additional information about the error.
items:
type: object
required:
- reason_code
- message
properties:
reason_code:
type: string
description: A machine-readable code that identifies the error specifically enough for the client to interpret what happened and take action.
example: BLANK
message:
type: string
description: Human readable message
example: Name can't be blank
source:
type: string
description: Source of the error
example: name
x-code-samples:
- id: node_request
mimeType: application/json
title: Node.js
content: "const request = require('request');\n\nconst options = {\n method: 'POST',\n url: 'https://api.procore.com/rest/v2.0/companies/%7Bcompany_id%7D/workflows/instances/bulk_create',\n headers: {'Idempotency-Token': 'SOME_STRING_VALUE', 'content-type': 'application/json'},\n body: {\n tool_type: 'drawing',\n tool_subtype: '-18472',\n items: [{item_id: '9238237', preset_id: '328274'}]\n },\n json: true\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: application/json
title: Python3
content: "import http.client\n\nconn = http.client.HTTPSConnection(\"api.procore.com\")\n\npayload = \"{\\\"tool_type\\\":\\\"drawing\\\",\\\"tool_subtype\\\":\\\"-18472\\\",\\\"items\\\":[{\\\"item_id\\\":\\\"9238237\\\",\\\"preset_id\\\":\\\"328274\\\"}]}\"\n\nheaders = {\n 'Idempotency-Token': \"SOME_STRING_VALUE\",\n 'content-type': \"application/json\"\n }\n\nconn.request(\"POST\", \"/rest/v2.0/companies/%7Bcompany_id%7D/workflows/instances/bulk_create\", payload, headers)\n\nres = conn.getresponse()\ndata = res.read()\n\nprint(data.decode(\"utf-8\"))"
- id: shell_curl
mimeType: application/json
title: Curl
content: "curl --request POST \\\n --url https://api.procore.com/rest/v2.0/companies/%7Bcompany_id%7D/workflows/instances/bulk_create \\\n --header 'Idempotency-Token: SOME_STRING_VALUE' \\\n --header 'content-type: application/json' \\\n --data '{\"tool_type\":\"drawing\",\"tool_subtype\":\"-18472\",\"items\":[{\"item_id\":\"9238237\",\"preset_id\":\"328274\"}]}'"
- id: csharp_httpclient
mimeType: application/json
title: C#
content: "var client = new HttpClient();\nvar request = new HttpRequestMessage\n{\n Method = HttpMethod.Post,\n RequestUri = new Uri(\"https://api.procore.com/rest/v2.0/companies/%7Bcompany_id%7D/workflows/instances/bulk_create\"),\n Headers =\n {\n { \"Idempotency-Token\", \"SOME_STRING_VALUE\" },\n },\n Content = new StringContent(\"{\\\"tool_type\\\":\\\"drawing\\\",\\\"tool_subtype\\\":\\\"-18472\\\",\\\"items\\\":[{\\\"item_id\\\":\\\"9238237\\\",\\\"preset_id\\\":\\\"328274\\\"}]}\")\n {\n Headers =\n {\n ContentType = new MediaTypeHeaderValue(\"application/json\")\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
operationId: bulkCreateWorkflowInstancesCompanyPublic
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer