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.

Business capability
Project Management BC-900.30

Operations 4

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 agent
Show 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 agent
List 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 agent
List 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 agent
Create a project named {name} from template {template}.
Instantiate template {template} with dates and roles {details}.

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/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 Specification

asana-project-templates-api-openapi.yml Raw ↑
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)