Asana Project Templates API
The Asana Project Templates API is a tool that allows users to access and utilize pre-designed project templates within the Asana platform. With this API, users can easily create and customize project plans and processes by selecting templates that align with their specific needs and goals. This simplifies the project planning and management process by providing a framework for organizing tasks, setting deadlines, and tracking progress.
Each operation below carries the questions people ask an LLM about it and the instructions they give an agent to run it. Generated by API Evangelist overlay
GET
/project_templates/{project_template_gid}
Get a project template · Get a project template
#
Ask an LLM“What does a project template include, like its requested dates and roles?”
“Can I look up one project template by ID?”
Tell an agentShow project template {template}.
Fetch the details of project template {template}.
GET
/project_templates
List project templates in a workspace or team · Get multiple project templates
#
Ask an LLM“What project templates are available in my workspace?”
“Can I filter project templates by team or workspace?”
Tell an agentList project templates in workspace {workspace}.
Show the project templates available to team {team} via the general template list.
GET
/teams/{team_gid}/project_templates
List a team's project templates · Get a team's project templates
#
Ask an LLM“Which project templates belong to a particular team?”
“Can I page through one team's templates by team ID?”
Tell an agentList the project templates owned by team {team}.
Show team {team}'s own template library.
POST
/project_templates/{project_template_gid}/instantiateProject
Create a project from a project template · Instantiate a project from a project template
#
Ask an LLM“How do I spin up a new project from a template?”
“Do I need to fill in the template's requested dates and roles first?”
Tell an agentCreate a project named {name} from template {template}.
Instantiate template {template} with dates and roles {details}.
Documentation
Specifications
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/asana:asana-project-templates-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
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:
description: This is the interface for interacting with the Asana Platform. Our API reference is generated from our [OpenAPI spec] (https://raw.githubusercontent.com/Asana/developer-docs/master/defs/asana_oas.yaml).
x-public-description: This is the interface for interacting with the [Asana Platform](https://developers.asana.com). Our API reference is generated from our [OpenAPI spec] (https://raw.githubusercontent.com/Asana/developer-docs/master/defs/asana_oas.yaml).
title: Asana Project templates API
termsOfService: https://asana.com/terms
contact:
name: Asana Support
url: https://asana.com/support
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0
version: '1.0'
x-docs-schema-whitelist:
- AsanaResource
- AsanaNamedResource
- AuditLogEvent
- AttachmentResponse
- AttachmentCompact
- BatchResponse
- CustomFieldSettingResponse
- CustomFieldSettingCompact
- CustomFieldResponse
- CustomFieldCompact
- EnumOption
- EventResponse
- ErrorResponse
- GoalResponse
- GoalCompact
- GoalMembershipCompact
- GoalMembershipBase
- GoalMembershipResponse
- GoalRelationshipResponse
- GoalRelationshipCompact
- JobResponse
- JobCompact
- OrganizationExportResponse
- OrganizationExportCompact
- PortfolioMembershipResponse
- PortfolioMembershipCompact
- PortfolioResponse
- PortfolioCompact
- ProjectBriefResponse
- ProjectBriefCompact
- ProjectMembershipResponse
- ProjectMembershipCompact
- ProjectResponse
- ProjectCompact
- ProjectStatusResponse
- ProjectStatusCompact
- ProjectTemplateCompact
- ProjectTemplateResponse
- SectionResponse
- SectionCompact
- StatusUpdateResponse
- StatusUpdateCompact
- StoryResponse
- StoryCompact
- TagResponse
- TagCompact
- TaskResponse
- TaskCompact
- TaskCountResponse
- TeamMembershipResponse
- TeamMembershipCompact
- TeamResponse
- TeamCompact
- TimePeriodResponse
- TimePeriodCompact
- UserTaskListResponse
- UserTaskListCompact
- UserResponse
- UserCompact
- WebhookFilter
- WebhookResponse
- WebhookCompact
- WorkspaceMembershipResponse
- WorkspaceMembershipCompact
- WorkspaceResponse
- WorkspaceCompact
servers:
- url: https://app.asana.com/api/1.0
description: Main endpoint.
security:
- personalAccessToken: []
- oauth2: []
tags:
- name: Project Templates
description: 'A project template is an object that allows new projects to be created
with a predefined setup, which may include tasks, sections, rules, etc.
It simplifies the process of running a workflow that involves a similar
set of work every time.
Project templates in organizations are shared with a single team. Currently, the
team of a project template cannot be changed via the API.'
paths:
/project_templates/{project_template_gid}:
parameters:
- $ref: '#/components/parameters/project_template_path_gid'
- $ref: '#/components/parameters/pretty'
- $ref: '#/components/parameters/fields'
get:
summary: Get a project template
description: Returns the complete project template record for a single project template.
tags:
- Project Templates
operationId: getProjectTemplate
responses:
200:
description: Successfully retrieved the requested project template.
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/ProjectTemplateResponse'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
/project_templates:
parameters:
- $ref: '#/components/parameters/pretty'
- $ref: '#/components/parameters/fields'
get:
summary: Get multiple project templates
description: Returns the compact project template records for all project templates in the given team or workspace.
tags:
- Project Templates
operationId: getProjectTemplates
parameters:
- $ref: '#/components/parameters/workspace_query_param'
- $ref: '#/components/parameters/team_query_param'
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/offset'
responses:
200:
description: Successfully retrieved the requested team's or workspace's project templates.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/ProjectTemplateCompact'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
/teams/{team_gid}/project_templates:
parameters:
- $ref: '#/components/parameters/team_path_gid'
- $ref: '#/components/parameters/pretty'
- $ref: '#/components/parameters/fields'
get:
summary: Get a team's project templates
description: Returns the compact project template records for all project templates in the team.
tags:
- Project Templates
operationId: getProjectTemplatesForTeam
parameters:
- $ref: '#/components/parameters/limit'
- $ref: '#/components/parameters/offset'
responses:
200:
description: Successfully retrieved the requested team's project templates.
content:
application/json:
schema:
type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/ProjectTemplateCompact'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
/project_templates/{project_template_gid}/instantiateProject:
parameters:
- $ref: '#/components/parameters/project_template_path_gid'
- $ref: '#/components/parameters/pretty'
- $ref: '#/components/parameters/fields'
post:
summary: Instantiate a project from a project template
description: 'Creates and returns a job that will asynchronously handle the project instantiation.
To form this request, it is recommended to first make a request to get a project template. Then, from the response, copy the `gid` from the object in the `requested_dates` array. This `gid` should be used in `requested_dates` to instantiate a project.
_Note: The body of this request will differ if your workspace is an organization. To determine if your workspace is an organization, use the is_organization parameter._'
tags:
- Project Templates
operationId: instantiateProject
requestBody:
description: Describes the inputs used for instantiating a project, such as the resulting project's name, which team it should be created in, and values for date variables.
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/ProjectTemplateInstantiateProjectRequest'
responses:
201:
description: Successfully created the job to handle project instantiation.
content:
application/json:
schema:
type: object
properties:
data:
$ref: '#/components/schemas/JobResponse'
400:
$ref: '#/components/responses/BadRequest'
401:
$ref: '#/components/responses/Unauthorized'
403:
$ref: '#/components/responses/Forbidden'
404:
$ref: '#/components/responses/NotFound'
500:
$ref: '#/components/responses/InternalServerError'
components:
parameters:
project_template_path_gid:
name: project_template_gid
in: path
description: Globally unique identifier for the project template.
required: true
schema:
type: string
example: '1331'
x-env-variable: project_template
limit:
name: limit
in: query
description: 'Results per page.
The number of objects to return per page. The value must be between 1 and 100.'
example: 50
schema:
type: integer
workspace_query_param:
name: workspace
in: query
description: The workspace to filter results on.
schema:
type: string
example: '12345'
x-env-variable: workspace
team_path_gid:
name: team_gid
in: path
description: Globally unique identifier for the team.
required: true
schema:
type: string
example: '159874'
x-env-variable: team
fields:
name: opt_fields
in: query
description: 'Defines fields to return.
Some requests return *compact* representations of objects in order to conserve resources and complete the request more efficiently. Other times requests return more information than you may need. This option allows you to list the exact set of fields that the API should be sure to return for the objects. The field names should be provided as paths, described below.
The id of included objects will always be returned, regardless of the field options.'
example:
- followers
- assignee
required: false
schema:
type: array
items:
type: string
style: form
explode: false
team_query_param:
name: team
in: query
description: The team to filter projects on.
schema:
type: string
example: '14916'
x-env-variable: team
pretty:
name: opt_pretty
in: query
description: 'Provides “pretty” output.
Provides the response in a “pretty” format. In the case of JSON this means doing proper line breaking and indentation to make it readable. This will take extra time and increase the response size so it is advisable only to use this during debugging.'
required: false
allowEmptyValue: true
schema:
type: boolean
style: form
example: true
offset:
name: offset
in: query
description: 'Offset token.
An offset to the next page returned by the API. A pagination request will return an offset token, which can be used as an input parameter to the next request. If an offset is not passed in, the API will return the first page of results.
''Note: You can only pass in an offset that was returned to you via a previously paginated request.'''
example: eyJ0eXAiOJiKV1iQLCJhbGciOiJIUzI1NiJ9
schema:
type: string
schemas:
JobBase:
$ref: '#/components/schemas/JobCompact'
ProjectTemplateBase:
allOf:
- $ref: '#/components/schemas/ProjectTemplateCompact'
- type: object
properties:
description:
description: Free-form textual information associated with the project template
type: string
example: These are things we need to pack for a trip.
html_description:
description: The description of the project template with formatting as HTML.
type: string
example: <body>These are things we need to pack for a trip.</body>
public:
description: True if the project template is public to its team.
type: boolean
example: false
owner:
description: The current owner of the project template, may be null.
allOf:
- $ref: '#/components/schemas/UserCompact'
team:
allOf:
- $ref: '#/components/schemas/TeamCompact'
requested_dates:
description: Array of date variables in this project template. Calendar dates must be provided for these variables when instantiating a project.
type: array
items:
$ref: '#/components/schemas/DateVariableCompact'
readOnly: true
color:
description: Color of the project template.
type:
- string
- 'null'
enum:
- dark-pink
- dark-green
- dark-blue
- dark-red
- dark-teal
- dark-brown
- dark-orange
- dark-purple
- dark-warm-gray
- light-pink
- light-green
- light-blue
- light-red
- light-teal
- light-brown
- light-orange
- light-purple
- light-warm-gray
example: light-green
Error:
type: object
properties:
message:
type: string
readOnly: true
description: Message providing more detail about the error that occurred, if available.
example: 'project: Missing input'
help:
type: string
readOnly: true
description: Additional information directing developers to resources on how to address and fix the problem, if available.
example: 'For more information on API status codes and how to handle them, read the docs on errors: https://asana.github.io/developer-docs/#errors'''
phrase:
type: string
readOnly: true
description: '*500 errors only*. A unique error phrase which can be used when contacting developer support to help identify the exact occurrence of the problem in Asana’s logs.'
example: 6 sad squid snuggle softly
ProjectTemplateResponse:
allOf:
- $ref: '#/components/schemas/ProjectTemplateBase'
DateVariableRequest:
type: object
properties:
gid:
description: Globally unique identifier of the date field in the project template. A value of `1` refers to the project start date, while `2` refers to the project due date.
type: string
example: '1'
value:
description: The date with which the date variable should be replaced when instantiating a project. This takes a date with `YYYY-MM-DD` format.
type:
- string
- 'null'
format: date-time
example: '2022-01-01'
UserCompact:
allOf:
- $ref: '#/components/schemas/AsanaResource'
- type: object
description: A *user* object represents an account in Asana that can be given access to various workspaces, projects, and tasks.
x-docs-overrides:
properties.resource_type.example: user
properties:
name:
type: string
description: '*Read-only except when same user as requester*. The user’s name.'
example: Greg Sanchez
JobResponse:
$ref: '#/components/schemas/JobBase'
TeamCompact:
allOf:
- $ref: '#/components/schemas/AsanaResource'
- type: object
description: A *team* is used to group related projects and people together within an organization. Each project in an organization is associated with a team.
x-docs-overrides:
properties.resource_type.example: team
properties:
name:
description: The name of the team.
type: string
example: Marketing
TaskCompact:
allOf:
- $ref: '#/components/schemas/AsanaResource'
- type: object
description: The *task* is the basic object around which many operations in Asana are centered.
x-docs-overrides:
properties.resource_type.example: task
properties:
name:
description: The name of the task.
type: string
example: Bug Task
resource_subtype:
type: string
description: 'The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning.
The resource_subtype `milestone` represent a single moment in time. This means tasks with this subtype cannot have a start_date.'
enum:
- default_task
- milestone
- section
- approval
example: default_task
ProjectTemplateCompact:
allOf:
- $ref: '#/components/schemas/AsanaResource'
- type: object
description: A *project template* is an object that allows new projects to be created with a predefined setup, which may include tasks, sections, Rules, etc. It simplifies the process of running a workflow that involves a similar set of work every time.
x-docs-overrides:
properties.resource_type.example: project_template
properties:
name:
description: Name of the project template.
type: string
example: Packing list
ProjectTemplateInstantiateProjectRequest:
type: object
required:
- name
- public
properties:
name:
description: The name of the new project.
type: string
example: New Project Name
team:
description: '*Conditional*. Sets the team of the new project. If the project template exists in an _organization_, you must specify a value for `team` and not `workspace`.'
type: string
example: '12345'
workspace:
description: '*Conditional*. Sets the workspace of the new project. If the project template exists in a _workspace_, you must specify a value for `workspace` and not `team`.'
type: string
example: '12345'
public:
description: Sets the project to public to its team.
type: boolean
example: true
is_strict:
description: '*Optional*. If set to `true`, the endpoint returns an "Unprocessable Entity" error if you fail to provide a calendar date value for any date variable. If set to `false`, a default date is used for each unfulfilled date variable (e.g., the current date is used as the Start Date of a project).'
type: boolean
example: true
requested_dates:
description: Array of mappings of date variables to calendar dates.
type: array
items:
$ref: '#/components/schemas/DateVariableRequest'
ProjectCompact:
allOf:
- $ref: '#/components/schemas/AsanaResource'
- type: object
description: A *project* represents a prioritized list of tasks in Asana or a board with columns of tasks represented as cards. It exists in a single workspace or organization and is accessible to a subset of users in that workspace or organization, depending on its permissions.
x-docs-overrides:
properties.resource_type.example: project
properties:
name:
description: Name of the project. This is generally a short sentence fragment that fits on a line in the UI for maximum readability. However, it can be longer.
type: string
example: Stuff to buy
AsanaResource:
description: A generic Asana Resource, containing a globally unique identifier.
type: object
properties:
gid:
description: Globally unique identifier of the resource, as a string.
type: string
readOnly: true
example: '12345'
x-insert-after: false
resource_type:
description: The base type of this resource.
type: string
readOnly: true
example: task
x-insert-after: gid
DateVariableCompact:
type: object
properties:
gid:
description: Globally unique identifier of the date field in the project template. A value of `1` refers to the project start date, while `2` refers to the project due date.
type: string
readOnly: true
example: '1'
name:
description: The name of the date variable.
type: string
readOnly: true
example: Start Date
description:
description: The description of what the date variable is used for when instantiating a project.
type: string
readOnly: true
example: Choose a start date for your project.
JobCompact:
allOf:
- $ref: '#/components/schemas/AsanaResource'
- type: object
description: A *job* is an object representing a process that handles asynchronous work.
x-docs-overrides:
properties.resource_type.example: job
properties:
resource_subtype:
description: The subtype of this resource. Different subtypes retain many of the same fields and behavior, but may render differently in Asana or represent resources with different semantic meaning.
type: string
readOnly: true
example: duplicate_task
status:
description: 'The current status of this job. The value is one of: `not_started`, `in_progress`, `succeeded`, or `failed`.'
type: string
enum:
- not_started
- in_progress
- succeeded
- failed
readOnly: true
example: in_progress
new_project:
$ref: '#/components/schemas/ProjectCompact'
new_task:
$ref: '#/components/schemas/TaskCompact'
new_project_template:
$ref: '#/components/schemas/ProjectTemplateCompact'
ErrorResponse:
description: 'Sadly, sometimes requests to the API are not successful. Failures can
occur for a wide range of reasons. In all cases, the API should return
an HTTP Status Code that indicates the nature of the failure,
with a response body in JSON format containing additional information.
In the event of a server error the response body will contain an error
phrase. These phrases are automatically generated using the
[node-asana-phrase
library](https://github.com/Asana/node-asana-phrase) and can be used by
Asana support to quickly look up the incident that caused the server
error.'
type: object
properties:
errors:
type: array
items:
$ref: '#/components/schemas/Error'
responses:
InternalServerError:
description: There was a problem on Asana’s end. In the event of a server error the response body should contain an error phrase. These phrases can be used by Asana support to quickly look up the incident that caused the server error. Some errors are due to server load, and will not supply an error phrase.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Forbidden:
description: The authentication and request syntax was valid but the server is refusing to complete the request. This can happen if you try to read or write to objects or properties that the user does not have access to.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Unauthorized:
description: A valid authentication token was not provided with the request, so the API could not associate a user with the request.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
BadRequest:
description: This usually occurs because of a missing or malformed parameter. Check the documentation and the syntax of your request and try again.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
NotFound:
description: Either the request method and path supplied do not specify a known action in the API, or the object specified by the request does not exist.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
securitySchemes:
personalAccessToken:
type: http
description: A personal access token allows access to the api for the user who created it. This should be kept a secret and be treated like a password.
scheme: bearer
oauth2:
type: oauth2
description: 'We require that applications designed to access the Asana API on behalf of multiple users implement OAuth 2.0.
Asana supports the Authorization Code Grant flow.'
flows:
authorizationCode:
authorizationUrl: https://app.asana.com/-/oauth_authorize
tokenUrl: https://app.asana.com/-/oauth_token
refreshUrl: https://app.asana.com/-/oauth_token
scopes:
default: Provides access to all endpoints documented in our API reference. If no scopes are requested, this scope is assumed by default.
openid: Provides access to OpenID Connect ID tokens and the OpenID Connect user info endpoint.
email: Provides access to the user’s email through the OpenID Connect user info endpoint.
profile: Provides access to the user’s name and profile photo through the OpenID Connect user info endpoint.
x-readme:
proxy-enabled: false
x-provenance:
method: harvested
publisher: Asana
source: https://raw.githubusercontent.com/Asana/developer-docs/master/defs/asana_oas.yaml
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)