Procore Company Project Tools API

The Company Project Tools API from Procore — 1 operation(s) for company project tools.

Operations 1

GET /rest/v2.0/companies/{company_id}/project_tools/{engine_name} List project tools #

Work with this as data

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-company-project-tools-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 Specification

procore-company-project-tools-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Procore REST Company Project Tools 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: Company Project Tools
paths:
  /rest/v2.0/companies/{company_id}/project_tools/{engine_name}:
    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: engine_name
      in: path
      required: true
      description: 'Tool engine name (e.g. `assets`, `rfi`). Matches `Tool.engine_name`

        for `provider_type` Project.'
      schema:
        type: string
      example: assets
    x-compliance-level: partial
    get:
      x-doc:
        visibility: public
        stage: beta
        exposure: public
      summary: List project tools
      description: 'Returns projects under a company that have a project-scoped Tool record

        for the given `engine_name`, along with each project''s active state and

        whether the tool is active on that project.


        Without filters all projects are returned regardless of status. Use

        `filters[tool_active]` and `filters[project_active]` to narrow results,

        or `filters[name]` to search by project name.


        A tool is considered active when both `is_active` and `is_available` are

        true, matching the criteria used by `Project#has_active_tool?`.


        `name` is the project''s display name: it''s prefixed with the project

        number (e.g. `"1234 - Downtown Renovation"`) when the company has

        `prepend_project_number` enabled and the project has a number,

        matching the format used by `GET /rest/v1.0/navigation`''s

        `available_projects`. `filters[name]` and `sort=name` both take the

        project number into account in that case.


        Results are ordered by ascending project id by default. Use `sort` to

        order by `name`, `project_active`, or `tool_active` instead.'
      tags:
      - Company Project Tools
      parameters:
      - name: page
        in: query
        description: Page
        required: false
        schema:
          type: integer
      - name: per_page
        in: query
        description: Elements per page
        required: false
        schema:
          type: integer
          default: 10
          minimum: 1
          maximum: 100
      - name: filters[tool_active]
        in: query
        required: false
        description: 'Filter by tool activation status. `true` — tool active (`is_active`

          and `is_available` both true). `false` — tool inactive.

          Omit to return all records regardless of tool status.'
        schema:
          type: boolean
      - name: filters[project_active]
        in: query
        required: false
        description: 'Filter by project active state. `true` — active projects only.

          `false` — inactive projects only.

          Omit to return all records regardless of project status.'
        schema:
          type: boolean
      - name: filters[name]
        in: query
        required: false
        description: 'Search by project name. Matches projects whose `name` (as returned

          in the response) contains the given value, case-insensitively — so

          when project numbers are prepended, `4521`, `harbor`, and

          `4521 - harbor` all match `"4521 - Harbor Tower"`.'
        schema:
          type: string
        example: renovation
      - name: sort
        in: query
        required: false
        description: 'Comma-separated list of fields to sort by, applied in order.

          Prefix a field with `-` to sort it descending. For example,

          `sort=-project_active,name` returns active projects first, then

          inactive ones, alphabetically by name within each group.

          Defaults to ascending project id when omitted. Supported fields:

          `name`, `project_active`, `tool_active`.'
        schema:
          type: string
        example: -project_active,name
      responses:
        '200':
          description: OK
          headers:
            Per-Page:
              description: Number of items retrieved per page
              schema:
                type: integer
            Total:
              description: Total number of items to be retrieved
              schema:
                type: integer
            Link:
              description: Link headers for the first, prev, next, and last link
              schema:
                type: string
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: Project ID.
                        name:
                          type: string
                          description: 'Project display name. Prefixed with the project

                            number when the company has `prepend_project_number`

                            enabled and the project has a number.'
                        project_active:
                          type: boolean
                          description: Whether the project is active.
                        tool_active:
                          type: boolean
                          description: 'Whether the tool is active on this project

                            (`is_active` and `is_available` both true).'
              examples:
                response:
                  value:
                    data:
                    - id: '100'
                      name: 1234 - Project Alpha
                      project_active: true
                      tool_active: true
                    - id: '101'
                      name: Project Beta
                      project_active: false
                      tool_active: false
        '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
        default:
          description: Unexpected error
          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
        title: Node.js
        content: "const request = require('request');\n\nconst options = {\n  method: 'GET',\n  url: 'https://api.procore.com/rest/v2.0/companies/%7Bcompany_id%7D/project_tools/assets',\n  qs: {\n    page: 'SOME_INTEGER_VALUE',\n    per_page: 'SOME_INTEGER_VALUE',\n    'filters[tool_active]': 'SOME_BOOLEAN_VALUE',\n    'filters[project_active]': 'SOME_BOOLEAN_VALUE',\n    'filters[name]': 'renovation',\n    sort: '-project_active,name'\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.0/companies/%7Bcompany_id%7D/project_tools/assets?page=SOME_INTEGER_VALUE&per_page=SOME_INTEGER_VALUE&filters%5Btool_active%5D=SOME_BOOLEAN_VALUE&filters%5Bproject_active%5D=SOME_BOOLEAN_VALUE&filters%5Bname%5D=renovation&sort=-project_active%2Cname")


          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/%7Bcompany_id%7D/project_tools/assets?page=SOME_INTEGER_VALUE&per_page=SOME_INTEGER_VALUE&filters%5Btool_active%5D=SOME_BOOLEAN_VALUE&filters%5Bproject_active%5D=SOME_BOOLEAN_VALUE&filters%5Bname%5D=renovation&sort=-project_active%2Cname'"
      - 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/%7Bcompany_id%7D/project_tools/assets?page=SOME_INTEGER_VALUE&per_page=SOME_INTEGER_VALUE&filters%5Btool_active%5D=SOME_BOOLEAN_VALUE&filters%5Bproject_active%5D=SOME_BOOLEAN_VALUE&filters%5Bname%5D=renovation&sort=-project_active%2Cname\"),\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
      x-changelog:
      - summary: Added Company Project Tools endpoint
        description: Returns projects within a company that have a project-scoped tool for the given engine_name, including each project's display name, active state, and whether the tool is active (is_active and is_available both true, matching Project#has_active_tool?). The name is prefixed with the project number when the company has prepend_project_number enabled and the project has a number, matching GET /rest/v1.0/navigation's available_projects format. Without filters all records are returned. Optional filters[tool_active] and filters[project_active] boolean params narrow results by tool or project active state respectively, and filters[name] searches by the underlying project name (case-insensitive, partial match). Results are ordered by ascending project id by default; an optional sort param (e.g. sort=-project_active,name, for active projects first then inactive, alphabetically within each group) supports ordering by name, project_active, and/or tool_active, descending when prefixed with '-'; sort=name orders by the underlying project name.
        endpoint: GET /companies/{company_id}/project_tools/{engine_name}
        type: new
        breaking: false
        datestamp: '2026-09-15'
        versions:
        - '2.0'
        x-doc:
          visibility: public
          stage: beta
          exposure: public
        link: company-project-tools?version=2.0#list-project-tools
      - summary: filters[name] matches project numbers
        description: When the company has prepend_project_number enabled, filters[name] now matches against the returned "number - name" value, so searching by the project number, the name, or the full "number - name" string all work.
        endpoint: GET /companies/{company_id}/project_tools/{engine_name}
        type: refinement
        breaking: false
        datestamp: '2026-10-12'
        versions:
        - '2.0'
        x-doc:
          visibility: public
          stage: beta
          exposure: public
        link: company-project-tools?version=2.0#list-project-tools
      operationId: listProjectTools
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer