> ## Documentation Index
> Fetch the complete documentation index at: https://docs.runpod.io/llms.txt
> Use this file to discover all available pages before exploring further.

# List public templates

> Returns the public template catalog. `source` selects which slice:
`official` (the default) is Runpod-curated templates, `verified` is
community templates Runpod has verified, and `community` is everything
else other users have shared publicly. Both pod and serverless
templates appear — use each entry's `serverless` flag to tell them
apart. `registry` is always null for templates you don't own. Your own
templates (public or private) are managed under `/v2/templates`; fetch
any individual template — catalog or owned — via `/v2/templates/{id}`.

At most 100 templates are returned. Pagination is not yet supported.




## OpenAPI

````yaml get /v2/catalog/templates
openapi: 3.1.0
info:
  title: Runpod REST API
  version: 2.0.0
  description: Runpod public REST API — v2
servers:
  - url: https://api.runpod.io
    description: Runpod API v2 production server
security:
  - bearerAuth: []
tags:
  - name: Account
    description: Account-scoped settings and primitives (SSH public keys).
  - name: Pods
    description: GPU and CPU pod lifecycle, configuration, actions, and log streaming.
  - name: Serverless
    description: >-
      Serverless endpoint lifecycle, worker visibility, releases, and worker log
      streaming.
  - name: Templates
    description: Reusable pod and endpoint configuration templates.
  - name: Network Volumes
    description: Persistent network storage volumes for workloads.
  - name: Registries
    description: Container registry credentials used to pull private images.
  - name: Catalog
    description: Available GPU, CPU, data center, and public template catalog metadata.
  - name: Billing
    description: Billing history and usage cost records across resource types.
paths:
  /v2/catalog/templates:
    get:
      tags:
        - Catalog
      summary: List public templates
      description: |
        Returns the public template catalog. `source` selects which slice:
        `official` (the default) is Runpod-curated templates, `verified` is
        community templates Runpod has verified, and `community` is everything
        else other users have shared publicly. Both pod and serverless
        templates appear — use each entry's `serverless` flag to tell them
        apart. `registry` is always null for templates you don't own. Your own
        templates (public or private) are managed under `/v2/templates`; fetch
        any individual template — catalog or owned — via `/v2/templates/{id}`.

        At most 100 templates are returned. Pagination is not yet supported.
      operationId: listPublicTemplates
      parameters:
        - name: source
          in: query
          required: false
          schema:
            type: string
            enum:
              - official
              - verified
              - community
            default: official
          description: |
            Which slice of the catalog to return: `official` for
            Runpod-curated templates (default), `verified` for
            Runpod-verified community templates, or `community` for all other
            publicly shared templates.
          example: official
      responses:
        '200':
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ListTemplatesResponse'
              examples:
                templates:
                  summary: Successful response
                  value:
                    templates:
                      - id: 30zmvf89kd
                        name: PyTorch 2.8
                        image: runpod/pytorch:2.8.0-py3.11-cuda12.8.1
                        args: ''
                        disk: 50
                        mounts: {}
                        ports:
                          - 8888/http
                          - 22/tcp
                        env: {}
                        registry: null
                        serverless: false
                        public: true
                        category: NVIDIA
                        startSsh: true
                        startJupyter: true
                        allowedCudaVersions: []
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '429':
          $ref: '#/components/responses/TooManyRequestsError'
        default:
          headers:
            RateLimit:
              $ref: '#/components/headers/RateLimit'
            RateLimit-Policy:
              $ref: '#/components/headers/RateLimit-Policy'
          description: Error
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  headers:
    RateLimit:
      schema:
        $ref: '#/components/schemas/RateLimitHeader'
    RateLimit-Policy:
      schema:
        $ref: '#/components/schemas/RateLimitPolicyHeader'
  schemas:
    ListTemplatesResponse:
      type: object
      required:
        - templates
      properties:
        templates:
          type: array
          items:
            $ref: '#/components/schemas/Template'
    ErrorResponse:
      type: object
      required:
        - title
        - status
        - detail
      properties:
        title:
          type: string
          description: Short human-readable summary
          examples:
            - Not Found
        status:
          type: integer
          description: HTTP status code
          examples:
            - 404
        detail:
          type: string
          description: Human-readable explanation
          examples:
            - pod not found
        errors:
          type: array
          description: Individual request-validation failures.
          items:
            type: string
          examples:
            - - '$: additional properties ''bogus'' not allowed'
    RateLimitHeader:
      type: string
      description: |
        Live per-window quota state. Optional — omitted for rate-limit-exempt
        callers.

        A structured-field list with one member per window (`minute`, `hour`,
        `day`), each carrying the remaining request count `r` and seconds until
        the window resets `t`. Returned on responses to authenticated requests,
        not only on 429s.
      examples:
        - '"minute";r=0;t=12, "hour";r=2800;t=1812, "day";r=49500;t=45012'
    RateLimitPolicyHeader:
      type: string
      description: >
        Static per-window quota policy. Optional — omitted for rate-limit-exempt

        callers.


        A structured-field list with one member per window (`minute`, `hour`,

        `day`), each carrying the quota `q` and the window length in seconds
        `w`.

        Returned on responses to authenticated requests, not only on 429s.
      examples:
        - '"minute";q=60;w=60, "hour";q=3000;w=3600, "day";q=50000;w=86400'
    Template:
      allOf:
        - $ref: '#/components/schemas/ContainerConfig'
        - type: object
          required:
            - id
            - name
            - image
            - args
            - disk
            - mounts
            - ports
            - env
            - registry
            - serverless
            - public
            - category
            - startSsh
            - startJupyter
            - allowedCudaVersions
          properties:
            id:
              type: string
              examples:
                - tpl_abc
            name:
              type: string
              examples:
                - My PyTorch Template
            mounts:
              $ref: '#/components/schemas/TemplateMounts'
            serverless:
              type: boolean
              description: >-
                Whether this template is for serverless workers (true) or pods
                (false)
              examples:
                - false
            public:
              type: boolean
              description: Whether this template is visible to other Runpod users
              examples:
                - false
            category:
              $ref: '#/components/schemas/TemplateCategory'
            startSsh:
              type: boolean
              description: >-
                Whether containers created from this template get SSH access
                provisioned at startup (`PUBLIC_KEY` env injection).
              examples:
                - true
            startJupyter:
              type: boolean
              description: >-
                Whether containers created from this template start JupyterLab
                at startup (`JUPYTER_PASSWORD` env injection).
              examples:
                - false
            allowedCudaVersions:
              type: array
              items:
                type: string
              description: >-
                Acceptable CUDA versions for containers created from this
                template, as `major.minor`. Empty means any version. Expanded
                into GPU pod and serverless endpoint creates; CPU pods ignore
                it.
              examples:
                - []
    ContainerConfig:
      description: >
        Reusable container configuration shared across templates, pods, and
        serverless endpoints. Adding a field here automatically propagates to
        all three resources.
      allOf:
        - $ref: '#/components/schemas/BaseContainerConfig'
        - type: object
          properties:
            registry:
              type:
                - string
                - 'null'
              description: Container registry credential ID (for private images)
              examples:
                - null
    TemplateMounts:
      type: object
      additionalProperties: false
      description: |
        Storage mounts attached to a template. Templates support only a
        single persistent mount today; any `network` property is rejected
        with 422 by the schema validator.

        PATCH semantics: omitting `mounts` or sending `{}` leaves the
        existing mount unchanged.
      properties:
        persistent:
          $ref: '#/components/schemas/PersistentMount'
    TemplateCategory:
      type: string
      description: |
        Controls how the template is grouped and filtered in the Runpod console.
        It does not affect hardware selection, scheduling, or billing.
        - `CPU`    — CPU-only workloads
        - `NVIDIA` — NVIDIA GPU workloads
        - `AMD`    — AMD GPU workloads
      enum:
        - CPU
        - NVIDIA
        - AMD
    BaseContainerConfig:
      type: object
      description: >
        Container configuration universal to every containerized resource.
        Compose ContainerConfig instead unless the resource cannot support
        private registries (clusters, until the upstream input accepts a
        registry credential).
      properties:
        image:
          type: string
          description: Docker image reference
          examples:
            - runpod/pytorch:2.8.0-py3.11-cuda12.8.1
        args:
          type: string
          description: Arguments passed to the container entrypoint
          examples:
            - ''
        disk:
          type: integer
          minimum: 1
          description: Container disk in GB (ephemeral, wiped on restart)
          examples:
            - 50
        ports:
          type: array
          description: Exposed ports, formatted as port/protocol
          items:
            type: string
          examples:
            - - 8888/http
              - 22/tcp
        env:
          type: object
          additionalProperties:
            type: string
          description: Environment variables as key-value pairs
          examples:
            - JUPYTER_PASSWORD: hunter2
    PersistentMount:
      type: object
      required:
        - size
        - path
      additionalProperties: false
      description: |
        Host-local persistent storage. Pinned to the pod's host machine — data
        does not survive a host failure. Disallowed on CPU pods. Mutually
        exclusive with NetworkMount. Deprecated: prefer NetworkMount for any
        data you cannot recreate.
      properties:
        size:
          type: integer
          minimum: 10
          description: >-
            Host-local persistent storage in GB. Upstream enforces a 10 GB
            floor.
          examples:
            - 20
        path:
          type: string
          description: Mount path inside the container. May be changed via PATCH.
          examples:
            - /workspace
  responses:
    UnauthorizedError:
      description: >-
        Authentication failed because the bearer token is missing, malformed,
        expired, or invalid.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missingBearerToken:
              summary: Missing bearer token
              value:
                title: Unauthorized
                status: 401
                detail: missing bearer token
    ForbiddenError:
      headers:
        RateLimit:
          $ref: '#/components/headers/RateLimit'
        RateLimit-Policy:
          $ref: '#/components/headers/RateLimit-Policy'
      description: >-
        The bearer token is valid, but it does not grant access to the requested
        resource or action.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            insufficientAccess:
              summary: Insufficient access
              value:
                title: Forbidden
                status: 403
                detail: access denied
    TooManyRequestsError:
      description: >
        The caller exceeded its per-user rate limit. The response identifies the
        window that was exceeded and how long to wait. The `RateLimit` and
        `RateLimit-Policy` headers (per the IETF ratelimit-headers draft) also
        accompany successful responses, so clients can track quota before a 429.
      headers:
        Retry-After:
          description: Seconds to wait before retrying, per the exceeded window.
          schema:
            type: integer
          example: 12
        RateLimit:
          $ref: '#/components/headers/RateLimit'
        RateLimit-Policy:
          $ref: '#/components/headers/RateLimit-Policy'
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            rateLimited:
              summary: Rate limit exceeded
              value:
                title: Too Many Requests
                status: 429
                detail: rate limit exceeded for the minute window
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Runpod API Key
      description: >
        Runpod API key authentication. Generate an API key in the Runpod console
        and send it in the `Authorization` header as `Bearer <api_key>`. Keys
        are scoped to the permissions granted when created; requests may return
        `403` when a valid key lacks access to the requested resource or action.

````