Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
title: No API Explorer Projects API
version: '1.22'
servers:
- url: https://io.plangrid.com
security:
- {}
tags:
- name: Projects
paths:
/projects:
post:
summary: Create Project
description: Create a new PlanGrid project. The PlanGrid account associated with the API key is added as an admin to the project team.
operationId: create-project
requestBody:
content:
application/json:
schema:
type: object
required:
- name
properties:
name:
type: string
description: Name of the project. Must be at least one character long.
custom_id:
type: string
description: Project code.
default: 'null'
type:
type: string
description: Project type with possible values of `general`, `manufacturing`, `power`, `water-sewer-waste`, `industrial-petroleum`, `transportation`, `hazardous-waste`, `telecom`, `education-k-12`, `education-higher`, `gov-federal`, `gov-state-local`, or `other`.
default: 'null'
status:
type: string
description: Project status.
default: 'null'
owner:
type: string
description: Project owner.
default: 'null'
start_date:
type: string
description: Project start date. See [Timestamps and Timezones](https://developer.plangrid.com/docs/timestamps-and-timezones) for accepted date formats.
default: 'null'
end_date:
type: string
description: Project end date. See [Timestamps and Timezones](https://developer.plangrid.com/docs/timestamps-and-timezones) for accepted date formats.
default: 'null'
street_1:
type: string
description: Project address, street line 1.
default: 'null'
street_2:
type: string
description: Project address, street line 2.
default: 'null'
city:
type: string
description: Project address town or city.
default: 'null'
region:
type: string
description: Project address state, province, or region.
default: 'null'
postal_code:
type: string
description: Project address zip or postal code.
default: 'null'
country:
type: string
description: Project address country in 2-letter ISO 3166 code.
default: 'null'
add_to_organization:
type: boolean
description: Boolean indicating whether to add the project to the organization that the API user belongs to or not. By default the project is created as a personal project and not as an organization-linked project.
default: false
responses:
'201':
description: '201'
content:
application/json:
examples:
Success:
value: "{\n \"uid\": \"bafce976-8f33-437f-9c52-fb274456940f\",\n \"name\": \"My New Construction Project.\",\n \"custom_id\": \"1234\",\n \"type\": \"general\",\n \"status\": \"bidding\",\n \"owner\": \"ACME\",\n \"start_date\": \"2001-10-01\",\n \"end_date\": \"2050-10-01\",\n \"street_1\": \"350 5th Avenue\",\n \"street_2\": null,\n \"city\": \"New York\",\n \"region\": \"New York\",\n \"postal_code\": \"10118\",\n \"country\": \"US\" \n}\n"
schema:
type: object
properties:
uid:
type: string
example: bafce976-8f33-437f-9c52-fb274456940f
name:
type: string
example: My New Construction Project.
custom_id:
type: string
example: '1234'
type:
type: string
example: general
status:
type: string
example: bidding
owner:
type: string
example: ACME
start_date:
type: string
example: '2001-10-01'
end_date:
type: string
example: '2050-10-01'
street_1:
type: string
example: 350 5th Avenue
street_2: {}
city:
type: string
example: New York
region:
type: string
example: New York
postal_code:
type: string
example: '10118'
country:
type: string
example: US
'400':
description: '400'
content:
application/json:
examples:
Name Missing:
value: "{\n \"message\": \"Project name required to create a project.\"\n}\n"
Name Blank:
value: "{\n \"message\": \"Project name must be at least one character long.\"\n}\n"
Invalid Custom ID:
value: "{\n \"message\": \"Custom ID must be null or a string at least one character long.\"\n}"
Invalid Type:
value: "{\n \"message\": \"Type (2) must be a valid project type.\"\n}"
Invalid Status:
value: "{\n \"message\": \"Status must be null or a string at least one character long.\"\n}"
Invalid Owner:
value: "{\n \"message\": \"Owner must be null or a string at least one character long.\"\n}"
Invalid Start Date:
value: "{\n \"message\": \"Start date (1234) must be null or a date string in ISO-8601 format (YYYY-MM-DD).\"\n}"
Invalid End Date:
value: "{\n \"message\": \"End date (1234) must be null or a date string in ISO-8601 format (YYYY-MM-DD).\"\n}"
Invalid Street 1:
value: "{\n \"message\": \"Street 1 must be null or a string at least one character long.\"\n}"
Invalid Street 2:
value: "{\n \"message\": \"Street 2 must be null or a string at least one character long.\"\n}"
Invalid City:
value: "{\n \"message\": \"City must be null or a string at least one character long.\"\n}"
Invalid Region:
value: "{\n \"message\": \"Postal code must be null or a string at least one character long.\"\n}"
Invalid Country:
value: "{\n \"message\": \"Country must be an ISO 3166 two letter country code.\"\n}"
schema:
oneOf:
- title: Name Missing
type: object
properties:
message:
type: string
example: Project name required to create a project.
- title: Name Blank
type: object
properties:
message:
type: string
example: Project name must be at least one character long.
- title: Invalid Custom ID
type: object
properties:
message:
type: string
example: Custom ID must be null or a string at least one character long.
- title: Invalid Type
type: object
properties:
message:
type: string
example: Type (2) must be a valid project type.
- title: Invalid Status
type: object
properties:
message:
type: string
example: Status must be null or a string at least one character long.
- title: Invalid Owner
type: object
properties:
message:
type: string
example: Owner must be null or a string at least one character long.
- title: Invalid Start Date
type: object
properties:
message:
type: string
example: Start date (1234) must be null or a date string in ISO-8601 format (YYYY-MM-DD).
- title: Invalid End Date
type: object
properties:
message:
type: string
example: End date (1234) must be null or a date string in ISO-8601 format (YYYY-MM-DD).
- title: Invalid Street 1
type: object
properties:
message:
type: string
example: Street 1 must be null or a string at least one character long.
- title: Invalid Street 2
type: object
properties:
message:
type: string
example: Street 2 must be null or a string at least one character long.
- title: Invalid City
type: object
properties:
message:
type: string
example: City must be null or a string at least one character long.
- title: Invalid Region
type: object
properties:
message:
type: string
example: Postal code must be null or a string at least one character long.
- title: Invalid Country
type: object
properties:
message:
type: string
example: Country must be an ISO 3166 two letter country code.
deprecated: false
tags:
- Projects
get:
summary: List All Projects
description: Get a list of projects where the PlanGrid account is a team member. Results are paginated, see Pagination for details on how pagination works in PlanGrid's API.
operationId: list-all-projects
parameters:
- name: limit
in: query
description: Number of projects to retrieve. Maximum value of 50.
schema:
type: integer
format: int32
default: 50
- name: skip
in: query
description: Number of projects to skip in the set of results.
schema:
type: integer
format: int32
default: 0
- name: updated_after
in: query
description: Only retrieve projects created/updated after specified UTC date and time (does not count changes in records contained in project). See [Timestamps and Timezones](https://developer.plangrid.com/docs/timestamps-and-timezones) for accepted date formats.
schema:
type: string
format: date
responses:
'200':
description: '200'
content:
application/json:
examples:
Success:
value: "{\n \"data\": [\n {\n \"uid\": \"bafce976-8f33-437f-9c52-fb274456940f\",\n \"name\": \"LA Natural History Museum\",\n \"custom_id\": \"5678\",\n \"type\": \"general\",\n \"status\": \"completed\",\n \"owner\": \"ACME\",\n \"start_date\": \"2001-10-01\",\n \"end_date\": \"2050-10-01\",\n \"street_1\": \"900 Exposition Blvd\",\n \"street_2\": null,\n \"city\": \"Los Angeles\",\n \"region\": \"California\",\n \"postal_code\": \"90007\",\n \"country\": \"US\"\n },\n {\n \"uid\": \"327e8c64-a70d-433c-b4ac-d077415a5547\",\n \"name\": \"3265 17th Street\",\n \"custom_id\": \"1234\",\n \"type\": \"general\",\n \"status\": \"bidding\",\n \"owner\": \"ACME\",\n \"start_date\": \"2001-10-01\",\n \"end_date\": \"2050-10-01\",\n \"street_1\": \"3265 17th Street\",\n \"street_2\": \"#404\",\n \"city\": \"New York\",\n \"region\": \"New York\",\n \"postal_code\": \"10118\",\n \"country\": \"US\"\n }\n ],\n \"total_count\": 100,\n \"next_page_url\": \"https://io.plangrid.com/projects?skip=2&limit=2\"\n}\n"
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
uid:
type: string
example: bafce976-8f33-437f-9c52-fb274456940f
name:
type: string
example: LA Natural History Museum
custom_id:
type: string
example: '5678'
type:
type: string
example: general
status:
type: string
example: completed
owner:
type: string
example: ACME
start_date:
type: string
example: '2001-10-01'
end_date:
type: string
example: '2050-10-01'
street_1:
type: string
example: 900 Exposition Blvd
street_2: {}
city:
type: string
example: Los Angeles
region:
type: string
example: California
postal_code:
type: string
example: '90007'
country:
type: string
example: US
total_count:
type: integer
example: 100
default: 0
next_page_url:
type: string
example: https://io.plangrid.com/projects?skip=2&limit=2
deprecated: false
security: []
tags:
- Projects
/projects/{project_uid}/rfis2/{rfi_uid}/return_messages:
get:
summary: Get RFI Return Message in a Project
description: Retrieves the return message from an RFI in a project. Return message data is described in The RFI Return Message Object.
operationId: get-rfi-return-message-in-a-project
parameters:
- name: project_uid
in: path
description: Unique identifier of project.
required: true
schema:
type: string
- name: limit
in: query
description: Number of answers to retrieve. Maximum value of 50.
schema:
type: integer
format: int32
default: 50
- name: skip
in: query
description: Number of answers to skip in the set of results.
schema:
type: integer
format: int32
default: 0
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"data\": [\n {\n\t\"created_at\": \"2020-05-26T19:59:06.203798+00:00\",\n\t\"created_by\": {\n\t\t\"type\": \"user\",\n\t\t\"uid\": \"5c48e3dca97740498aed0692\",\n\t\t\"url\": \"https://io.plangrid.com/projects/6f27e34d-3697-0ba7-df37-67045591b53b/users/5c48e3dca97740498aed0692\"\n\t},\n\t\"is_draft\": false,\n\t\"num_references_on_create\": 0,\n\t\"references\": [],\n\t\"rfi_uid\": \"2098d23b-f825-4f96-a675-91411d56bfc6\",\n\t\"source\": \"app\",\n\t\"status\": {\n\t\t\"bucket\": \"draft_with_manager\",\n\t\t\"label\": \"Draft with manager\",\n\t\t\"uid\": \"a4577f01-3991-4487-a5d1-4eea5a541ea1\"\n\t},\n\t\"text\": \"poor poor\",\n\t\"uid\": \"8fffba85-91c5-421b-88c4-b315f3957702\",\n\t\"updated_at\": \"2020-05-26T19:59:06.203798+00:00\",\n\t\"updated_by\": {\n\t\t\"type\": \"user\",\n\t\t\"uid\": \"5c48e3dca97740498aed0692\",\n\t\t\"url\": \"https://io.plangrid.com/projects/6f27e34d-3697-0ba7-df37-67045591b53b/users/5c48e3dca97740498aed0692\"\n\t},\n\t\"user_created_at\": \"2020-05-26T19:59:06.203798+00:00\"\n}\n ],\n \"next_page_url\": null,\n \"total_count\": 1\n}"
schema:
type: object
properties:
data:
type: array
items:
type: object
properties:
created_at:
type: string
example: '2020-05-26T19:59:06.203798+00:00'
created_by:
type: object
properties:
type:
type: string
example: user
uid:
type: string
example: 5c48e3dca97740498aed0692
url:
type: string
example: https://io.plangrid.com/projects/6f27e34d-3697-0ba7-df37-67045591b53b/users/5c48e3dca97740498aed0692
is_draft:
type: boolean
example: false
default: true
num_references_on_create:
type: integer
example: 0
default: 0
references:
type: array
items:
type: object
properties: {}
rfi_uid:
type: string
example: 2098d23b-f825-4f96-a675-91411d56bfc6
source:
type: string
example: app
status:
type: object
properties:
bucket:
type: string
example: draft_with_manager
label:
type: string
example: Draft with manager
uid:
type: string
example: a4577f01-3991-4487-a5d1-4eea5a541ea1
text:
type: string
example: poor poor
uid:
type: string
example: 8fffba85-91c5-421b-88c4-b315f3957702
updated_at:
type: string
example: '2020-05-26T19:59:06.203798+00:00'
updated_by:
type: object
properties:
type:
type: string
example: user
uid:
type: string
example: 5c48e3dca97740498aed0692
url:
type: string
example: https://io.plangrid.com/projects/6f27e34d-3697-0ba7-df37-67045591b53b/users/5c48e3dca97740498aed0692
user_created_at:
type: string
example: '2020-05-26T19:59:06.203798+00:00'
next_page_url: {}
total_count:
type: integer
example: 1
default: 0
'400':
description: '400'
content:
application/json:
examples:
Result:
value: '{}'
schema:
type: object
properties: {}
deprecated: false
tags:
- Projects
x-readme-fauxas: true
x-provenance:
method: searched
source: https://developer.plangrid.com/reference
harvested: '2026-10-14'
tool: harvest-readme-openapi.py
note: Assembled verbatim from the OpenAPI definition ReadMe embeds in each operation page of the provider's developer portal; paths and components merged by API title, nothing authored.
assembled_from:
- https://developer.plangrid.com/reference/create-project.md
- https://developer.plangrid.com/reference/get-rfi-return-message-in-a-project.md
- https://developer.plangrid.com/reference/get-user-profile.md
- https://developer.plangrid.com/reference/list-all-projects.md
- https://developer.plangrid.com/reference/retrieve-access-token.md
- https://developer.plangrid.com/reference/retrieve-authorization-code.md
- https://developer.plangrid.com/reference/retrieve-rate-limits.md
- https://developer.plangrid.com/reference/send-batch-request.md
merge:
pages: 8
deduped: 0
conflicts_kept_first: 0