Portainer Custom Templates API

Manage Custom Templates

Operations 9

GET /custom_templates List available custom templates #
DELETE /custom_templates/{id} Remove a template #
GET /custom_templates/{id} Inspect a custom template #
PUT /custom_templates/{id} Update a template #
GET /custom_templates/{id}/file Get Template stack file content #
PUT /custom_templates/{id}/git_fetch Fetch the latest config file content based on custom template's git repository… #
POST /custom_templates/create/file Create a custom template #
POST /custom_templates/create/repository Create a custom template #
POST /custom_templates/create/string Create a custom template #

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/portainer-custom-templates-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

portainer-custom-templates-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  contact:
    email: info@portainer.io
  description: Portainer API is an HTTP API served by Portainer.
  license:
    name: zlib
    url: https://github.com/portainer/portainer/blob/develop/LICENSE
  title: PortainerCE Custom Templates API
  version: 2.39.1
servers:
- url: /api
tags:
- description: Manage Custom Templates
  name: Custom Templates
paths:
  /custom_templates:
    get:
      description: 'List available custom templates.

        **Access policy**: authenticated'
      operationId: CustomTemplateList
      parameters:
      - description: Template types
        in: query
        name: type
        required: true
        style: form
        explode: false
        schema:
          type: array
          items:
            enum:
            - 1
            - 2
            - 3
            type: integer
      - description: Filter by edge templates
        in: query
        name: edge
        schema:
          type: boolean
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                items:
                  $ref: '#/components/schemas/portainer.CustomTemplate'
                type: array
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: List available custom templates
      tags:
      - Custom Templates
  /custom_templates/{id}:
    delete:
      description: 'Remove a template.

        **Access policy**: authenticated'
      operationId: CustomTemplateDelete
      parameters:
      - description: Template identifier
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '204':
          description: Success
        '400':
          description: Invalid request
        '403':
          description: Access denied to resource
        '404':
          description: Template not found
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Remove a template
      tags:
      - Custom Templates
    get:
      description: 'Retrieve details about a template.

        **Access policy**: authenticated'
      operationId: CustomTemplateInspect
      parameters:
      - description: Template identifier
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/portainer.CustomTemplate'
        '400':
          description: Invalid request
        '404':
          description: Template not found
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Inspect a custom template
      tags:
      - Custom Templates
    put:
      description: 'Update a template.

        **Access policy**: authenticated'
      operationId: CustomTemplateUpdate
      parameters:
      - description: Template identifier
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/portainer.CustomTemplate'
        '400':
          description: Invalid request
        '403':
          description: Permission denied to access template
        '404':
          description: Template not found
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Update a template
      tags:
      - Custom Templates
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/customtemplates.customTemplateUpdatePayload'
        description: Template details
        required: true
  /custom_templates/{id}/file:
    get:
      description: 'Retrieve the content of the Stack file for the specified custom template

        **Access policy**: authenticated'
      operationId: CustomTemplateFile
      parameters:
      - description: Template identifier
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/customtemplates.fileResponse'
        '400':
          description: Invalid request
        '404':
          description: Custom template not found
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Get Template stack file content
      tags:
      - Custom Templates
  /custom_templates/{id}/git_fetch:
    put:
      description: 'Retrieve details about a template created from git repository method.

        **Access policy**: authenticated'
      operationId: CustomTemplateGitFetch
      parameters:
      - description: Template identifier
        in: path
        name: id
        required: true
        schema:
          type: integer
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/customtemplates.fileResponse'
        '400':
          description: Invalid request
        '404':
          description: Custom template not found
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Fetch the latest config file content based on custom template's git repository…
      tags:
      - Custom Templates
  /custom_templates/create/file:
    post:
      description: 'Create a custom template.

        **Access policy**: authenticated'
      operationId: CustomTemplateCreateFile
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/portainer.CustomTemplate'
        '400':
          description: Invalid request
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Create a custom template
      tags:
      - Custom Templates
      requestBody:
        content:
          multipart/form-data:
            schema:
              type: object
              properties:
                Title:
                  type: string
                  description: Title of the template
                Description:
                  type: string
                  description: Description of the template
                Note:
                  type: string
                  description: A note that will be displayed in the UI. Supports HTML content
                Platform:
                  type: integer
                  enum:
                  - 1
                  - 2
                  description: Platform associated to the template (1 - 'linux', 2 - 'windows')
                Type:
                  type: integer
                  enum:
                  - 1
                  - 2
                  - 3
                  description: Type of created stack (1 - swarm, 2 - compose, 3 - kubernetes)
                File:
                  type: string
                  description: File
                  format: binary
                Logo:
                  type: string
                  description: URL of the template's logo
                Variables:
                  type: string
                  description: A json array of variables definitions
              required:
              - Title
              - Description
              - Note
              - Platform
              - Type
              - File
  /custom_templates/create/repository:
    post:
      description: 'Create a custom template.

        **Access policy**: authenticated'
      operationId: CustomTemplateCreateRepository
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/portainer.CustomTemplate'
        '400':
          description: Invalid request
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Create a custom template
      tags:
      - Custom Templates
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/customtemplates.customTemplateFromGitRepositoryPayload'
        description: Required when using method=repository
        required: true
  /custom_templates/create/string:
    post:
      description: 'Create a custom template.

        **Access policy**: authenticated'
      operationId: CustomTemplateCreateString
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/portainer.CustomTemplate'
        '400':
          description: Invalid request
        '500':
          description: Server error
      security:
      - ApiKeyAuth: []
      - jwt: []
      summary: Create a custom template
      tags:
      - Custom Templates
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/customtemplates.customTemplateFromFileContentPayload'
        description: body
        required: true
components:
  schemas:
    gittypes.GitCredentialAuthType:
      enum:
      - 0
      - 1
      type: integer
      x-enum-varnames:
      - GitCredentialAuthType_Basic
      - GitCredentialAuthType_Token
    gittypes.GitAuthentication:
      properties:
        AuthorizationType:
          $ref: '#/components/schemas/gittypes.GitCredentialAuthType'
        GitCredentialID:
          description: 'Git credentials identifier when the value is not 0

            When the value is 0, Username, Password, and Authtype are set without using saved credential

            This is introduced since 2.15.0'
          example: 0
          type: integer
        Password:
          type: string
        Username:
          type: string
      type: object
    customtemplates.customTemplateFromFileContentPayload:
      properties:
        Description:
          description: Description of the template
          example: High performance web server
          type: string
        EdgeTemplate:
          description: EdgeTemplate indicates if this template purpose for Edge Stack
          example: false
          type: boolean
        FileContent:
          description: Content of stack file
          type: string
        Logo:
          description: URL of the template's logo
          example: https://portainer.io/img/logo.svg
          type: string
        Note:
          description: A note that will be displayed in the UI. Supports HTML content
          example: This is my <b>custom</b> template
          type: string
        Platform:
          allOf:
          - $ref: '#/components/schemas/portainer.CustomTemplatePlatform'
          description: 'Platform associated to the template.

            Valid values are: 1 - ''linux'', 2 - ''windows''

            Required for Docker stacks'
          enum:
          - 1
          - 2
          example: 1
        Title:
          description: Title of the template
          example: Nginx
          type: string
        Type:
          allOf:
          - $ref: '#/components/schemas/portainer.StackType'
          description: 'Type of created stack:

            * 1 - swarm

            * 2 - compose

            * 3 - kubernetes'
          enum:
          - 1
          - 2
          - 3
          example: 1
        Variables:
          description: Definitions of variables in the stack file
          items:
            $ref: '#/components/schemas/portainer.CustomTemplateVariableDefinition'
          type: array
      required:
      - Description
      - FileContent
      - Title
      - Type
      type: object
    portainer.CustomTemplate:
      properties:
        CreatedByUserId:
          description: User identifier who created this template
          example: 3
          type: integer
        Description:
          description: Description of the template
          example: High performance web server
          type: string
        EdgeTemplate:
          description: EdgeTemplate indicates if this template purpose for Edge Stack
          example: false
          type: boolean
        EntryPoint:
          description: Path to the Stack file
          example: docker-compose.yml
          type: string
        GitConfig:
          $ref: '#/components/schemas/gittypes.RepoConfig'
        Id:
          description: CustomTemplate Identifier
          example: 1
          type: integer
        IsComposeFormat:
          description: IsComposeFormat indicates if the Kubernetes template is created from a Docker Compose file
          example: false
          type: boolean
        Logo:
          description: URL of the template's logo
          example: https://portainer.io/img/logo.svg
          type: string
        Note:
          description: A note that will be displayed in the UI. Supports HTML content
          example: This is my <b>custom</b> template
          type: string
        Platform:
          allOf:
          - $ref: '#/components/schemas/portainer.CustomTemplatePlatform'
          description: 'Platform associated to the template.

            Valid values are: 1 - ''linux'', 2 - ''windows'''
          enum:
          - 1
          - 2
          example: 1
        ProjectPath:
          description: Path on disk to the repository hosting the Stack file
          example: /data/custom_template/3
          type: string
        ResourceControl:
          $ref: '#/components/schemas/portainer.ResourceControl'
        Title:
          description: Title of the template
          example: Nginx
          type: string
        Type:
          allOf:
          - $ref: '#/components/schemas/portainer.StackType'
          description: 'Type of created stack:

            * 1 - swarm

            * 2 - compose

            * 3 - kubernetes'
          enum:
          - 1
          - 2
          - 3
          example: 1
        Variables:
          items:
            $ref: '#/components/schemas/portainer.CustomTemplateVariableDefinition'
          type: array
      type: object
    portainer.UserResourceAccess:
      properties:
        AccessLevel:
          $ref: '#/components/schemas/portainer.ResourceAccessLevel'
        UserId:
          type: integer
      type: object
    gittypes.RepoConfig:
      properties:
        Authentication:
          allOf:
          - $ref: '#/components/schemas/gittypes.GitAuthentication'
          description: Git credentials
        ConfigFilePath:
          description: Path to where the config file is in this url/refName
          example: docker-compose.yml
          type: string
        ConfigHash:
          description: Repository hash
          example: bc4c183d756879ea4d173315338110b31004b8e0
          type: string
        ReferenceName:
          description: The reference name
          example: refs/heads/branch_name
          type: string
        TLSSkipVerify:
          description: TLSSkipVerify skips SSL verification when cloning the Git repository
          example: false
          type: boolean
        URL:
          description: The repo url
          example: https://github.com/portainer/portainer.git
          type: string
      type: object
    portainer.CustomTemplateVariableDefinition:
      properties:
        defaultValue:
          example: default value
          type: string
        description:
          example: Description
          type: string
        label:
          example: My Variable
          type: string
        name:
          example: MY_VAR
          type: string
      type: object
    customtemplates.customTemplateUpdatePayload:
      properties:
        ComposeFilePathInRepository:
          default: docker-compose.yml
          description: Path to the Stack file inside the Git repository
          example: docker-compose.yml
          type: string
        Description:
          description: Description of the template
          example: High performance web server
          type: string
        EdgeTemplate:
          description: EdgeTemplate indicates if this template purpose for Edge Stack
          example: false
          type: boolean
        FileContent:
          description: Content of stack file
          type: string
        IsComposeFormat:
          description: IsComposeFormat indicates if the Kubernetes template is created from a Docker Compose file
          example: false
          type: boolean
        Logo:
          description: URL of the template's logo
          example: https://portainer.io/img/logo.svg
          type: string
        Note:
          description: A note that will be displayed in the UI. Supports HTML content
          example: This is my <b>custom</b> template
          type: string
        Platform:
          allOf:
          - $ref: '#/components/schemas/portainer.CustomTemplatePlatform'
          description: 'Platform associated to the template.

            Valid values are: 1 - ''linux'', 2 - ''windows''

            Required for Docker stacks'
          enum:
          - 1
          - 2
          example: 1
        RepositoryAuthentication:
          description: Use authentication to clone the Git repository
          example: true
          type: boolean
        RepositoryAuthorizationType:
          allOf:
          - $ref: '#/components/schemas/gittypes.GitCredentialAuthType'
          description: RepositoryAuthorizationType is the authorization type to use
          example: 0
        RepositoryGitCredentialID:
          description: 'GitCredentialID used to identify the bound git credential. Required when RepositoryAuthentication

            is true and RepositoryUsername/RepositoryPassword are not provided'
          example: 0
          type: integer
        RepositoryPassword:
          description: 'Password used in basic authentication or token used in token authentication.

            Required when RepositoryAuthentication is true and RepositoryGitCredentialID is 0'
          example: myGitPassword
          type: string
        RepositoryReferenceName:
          description: Reference name of a Git repository hosting the Stack file
          example: refs/heads/master
          type: string
        RepositoryURL:
          description: URL of a Git repository hosting the Stack file
          example: https://github.com/openfaas/faas
          type: string
        RepositoryUsername:
          description: 'Username used in basic authentication. Required when RepositoryAuthentication is true

            and RepositoryGitCredentialID is 0. Ignored if RepositoryAuthType is token'
          example: myGitUsername
          type: string
        TLSSkipVerify:
          description: TLSSkipVerify skips SSL verification when cloning the Git repository
          example: false
          type: boolean
        Title:
          description: Title of the template
          example: Nginx
          type: string
        Type:
          allOf:
          - $ref: '#/components/schemas/portainer.StackType'
          description: Type of created stack (1 - swarm, 2 - compose, 3 - kubernetes)
          enum:
          - 1
          - 2
          - 3
          example: 1
        Variables:
          description: Definitions of variables in the stack file
          items:
            $ref: '#/components/schemas/portainer.CustomTemplateVariableDefinition'
          type: array
      required:
      - Description
      - FileContent
      - RepositoryURL
      - Title
      - Type
      type: object
    portainer.StackType:
      enum:
      - 0
      - 1
      - 2
      - 3
      type: integer
      x-enum-varnames:
      - _
      - DockerSwarmStack
      - DockerComposeStack
      - KubernetesStack
    customtemplates.fileResponse:
      properties:
        FileContent:
          type: string
      type: object
    customtemplates.customTemplateFromGitRepositoryPayload:
      properties:
        ComposeFilePathInRepository:
          default: docker-compose.yml
          description: Path to the Stack file inside the Git repository
          example: docker-compose.yml
          type: string
        Description:
          description: Description of the template
          example: High performance web server
          type: string
        EdgeTemplate:
          description: EdgeTemplate indicates if this template purpose for Edge Stack
          example: false
          type: boolean
        IsComposeFormat:
          description: IsComposeFormat indicates if the Kubernetes template is created from a Docker Compose file
          example: false
          type: boolean
        Logo:
          description: URL of the template's logo
          example: https://portainer.io/img/logo.svg
          type: string
        Note:
          description: A note that will be displayed in the UI. Supports HTML content
          example: This is my <b>custom</b> template
          type: string
        Platform:
          allOf:
          - $ref: '#/components/schemas/portainer.CustomTemplatePlatform'
          description: 'Platform associated to the template.

            Valid values are: 1 - ''linux'', 2 - ''windows''

            Required for Docker stacks'
          enum:
          - 1
          - 2
          example: 1
        RepositoryAuthentication:
          description: Use basic authentication to clone the Git repository
          example: true
          type: boolean
        RepositoryPassword:
          description: Password used in basic authentication. Required when RepositoryAuthentication is true.
          example: myGitPassword
          type: string
        RepositoryReferenceName:
          description: Reference name of a Git repository hosting the Stack file
          example: refs/heads/master
          type: string
        RepositoryURL:
          description: URL of a Git repository hosting the Stack file
          example: https://github.com/openfaas/faas
          type: string
        RepositoryUsername:
          description: Username used in basic authentication. Required when RepositoryAuthentication is true.
          example: myGitUsername
          type: string
        TLSSkipVerify:
          description: TLSSkipVerify skips SSL verification when cloning the Git repository
          example: false
          type: boolean
        Title:
          description: Title of the template
          example: Nginx
          type: string
        Type:
          allOf:
          - $ref: '#/components/schemas/portainer.StackType'
          description: 'Type of created stack:

            * 1 - swarm

            * 2 - compose

            * 3 - kubernetes'
          enum:
          - 1
          - 2
          example: 1
        Variables:
          description: Definitions of variables in the stack file
          items:
            $ref: '#/components/schemas/portainer.CustomTemplateVariableDefinition'
          type: array
      required:
      - Description
      - RepositoryURL
      - Title
      - Type
      type: object
    portainer.ResourceControlType:
      enum:
      - 0
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
      type: integer
      x-enum-varnames:
      - _
      - ContainerResourceControl
      - ServiceResourceControl
      - VolumeResourceControl
      - NetworkResourceControl
      - SecretResourceControl
      - StackResourceControl
      - ConfigResourceControl
      - CustomTemplateResourceControl
      - ContainerGroupResourceControl
    portainer.ResourceAccessLevel:
      enum:
      - 0
      - 1
      type: integer
      x-enum-varnames:
      - _
      - ReadWriteAccessLevel
    portainer.TeamResourceAccess:
      properties:
        AccessLevel:
          $ref: '#/components/schemas/portainer.ResourceAccessLevel'
        TeamId:
          type: integer
      type: object
    portainer.CustomTemplatePlatform:
      enum:
      - 0
      - 1
      - 2
      type: integer
      x-enum-varnames:
      - _
      - CustomTemplatePlatformLinux
      - CustomTemplatePlatformWindows
    portainer.ResourceControl:
      properties:
        AccessLevel:
          $ref: '#/components/schemas/portainer.ResourceAccessLevel'
        AdministratorsOnly:
          description: Permit access to resource only to admins
          example: true
          type: boolean
        Id:
          description: ResourceControl Identifier
          example: 1
          type: integer
        OwnerId:
          description: 'Deprecated fields

            Deprecated in DBVersion == 2'
          type: integer
        Public:
          description: Permit access to the associated resource to any user
          example: true
          type: boolean
        ResourceId:
          description: 'Docker resource identifier on which access control will be applied.\

            In the case of a resource control applied to a stack, use the stack name as identifier'
          example: 617c5f22bb9b023d6daab7cba43a57576f83492867bc767d1c59416b065e5f08
          type: string
        SubResourceIds:
          description: List of Docker resources that will inherit this access control
          example:
          - 617c5f22bb9b023d6daab7cba43a57576f83492867bc767d1c59416b065e5f08
          items:
            type: string
          type: array
        System:
          type: boolean
        TeamAccesses:
          items:
            $ref: '#/components/schemas/portainer.TeamResourceAccess'
          type: array
        Type:
          allOf:
          - $ref: '#/components/schemas/portainer.ResourceControlType'
          description: 'Type of Docker resource. Valid values are: 1- container, 2 -service

            3 - volume, 4 - secret, 5 - stack, 6 - config or 7 - custom template'
          example: 1
        UserAccesses:
          items:
            $ref: '#/components/schemas/portainer.UserResourceAccess'
          type: array
      type: object
  securitySchemes:
    ApiKeyAuth:
      in: header
      name: X-API-KEY
      type: apiKey
    jwt:
      in: header
      name: Authorization
      type: apiKey