Skip to main content
  1. Docs
  2. Reference
  3. REST API Docs
  4. Registry

Registry

    The Pulumi Registry hosts reusable packages, templates, and policy packs for infrastructure deployments. The Registry API allows you to list, retrieve, publish, and manage packages, templates, and policy packs in the Pulumi Registry.

    Registry identifiers

    Resources in the Registry are identified by a three-part identifier: {source}/{publisher}/{name}.

    • Source indicates the package’s origin. For example:
      • pulumi: packages published directly to the public Pulumi registry
      • opentofu: OpenTofu packages bridged to Pulumi
      • private: organization-specific private registry packages
    • Publisher is the organization that owns the package. For private packages this matches the organization’s canonical name; for public packages it is managed by Registry administrators.
    • Name is the unique identifier for the package within its source and publisher.

    See the Pulumi Registry for the browsable catalog.

    List Packages

    GET /api/registry/packages

    Retrieves all registry packages accessible to the caller, with support for filtering, sorting, and pagination. No authentication is required, but authenticated requests may include additional usage statistics per package. Results can be filtered by package name, publisher, owning organization, package type, usage, search query, and visibility level. The sort parameter controls the ordering of results, and the asc parameter toggles ascending vs. descending order. Results are paginated with a default limit of 100 per page; use the continuationToken from the response to retrieve subsequent pages. Each entry in the response contains the full package metadata including name, publisher, source, version, title, description, repository URL, category, featured status, package types, maturity status, readme URL, schema URL, creation timestamp, and visibility.

    Request Parameters

    • asc boolean query optional
      When true, sort results in ascending order
    • continuationToken string query optional
      Pagination token for retrieving the next page of results
    • limit integer query optional
      Results per page (default: 100)
    • name string query optional
      Filter by specific package name
    • orgLogin string query optional
      Filter by owning organization
    • packageType string query optional
      Filter by package type
    • publisher string query optional
      Filter by publisher organization
    • search string query optional
      Search query string
    • sort string query optional
      Sort field for results
    • usage string query optional
      Filter by usage type
    • visibility string query optional
      Filter by visibility level

    Responses

    200 OK
    • packages array[PackageMetadata] required
      The list of packages
    • name string required
      The name of the package.
    • publisher string required
      The publisher of the package.
    • publisherDisplayName string optional
      The display name of the publisher.
    • source string required
      The source of the package.
    • version string required
      The version of the package in semver format.
    • title string optional
      The title/display name of the package.
    • description string optional
      The description of the package.
    • logoUrl string optional
      The URL of the logo for the package.
    • repoUrl string optional
      The URL of the repository the package is hosted in.
    • category string optional
      The category of the package.
    • isFeatured boolean required
      Whether the package is featured.
    • packageTypes array[string] optional
      The package types, e.g. “native”, “component”, “bridged”
    • packageStatus enum required
      The maturity level of the package, e.g. “ga”, “public_preview”
      Values: ga, public_preview
    • readmeURL string required
      The URL of the readme for the package.
    • schemaURL string required
      The URL of the schema for the package.
    • pluginDownloadURL string optional
      The URL to download the plugin at, as found in the schema.
    • createdAt string required
      The date and time the package version was created.
    • visibility enum required
      The visibility of the package.
      Values: public, private
    • parameterization PackageParameterization optional
      The parameterization of the provider, if any.
    • usageStats PackageUsageStats optional
      Usage statistics for this package within the requesting org. Only populated when the caller is authenticated.
    • continuationToken string optional
      Continuation token for pagination
    Errors: 400 Bad continuationToken

    Post Publish Package Version

    POST /api/registry/packages/{source}/{publisher}/{name}/versions

    Initiates the first step of a two-phase package version publish workflow. This creates a publish transaction and returns an operationID along with pre-signed upload URLs for the package artifacts (schema, index, and installationConfiguration). The caller must upload all required artifacts to the provided URLs and then call the PostPublishPackageVersionComplete endpoint with the operationID to finalize the publish. The request body must include the semantic version to publish. Returns 202 Accepted with the operation details, 404 if the source does not exist, or 409 if the specified version already exists.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name

    Request Body

    • version string required
      The semantic version of the package to publish.
    • publishedAt string optional
      Optional timestamp for when the package version was originally published. If not provided, defaults to current server time. Useful for backfilling historical versions with their original publish dates.

    Responses

    202 Accepted
    • operationID string required
      The unique identifier for the publish operation.
    • uploadURLs PackageUploadURLs required
      The URLs to upload package artifacts to.
    • schema string required
      The pre-signed URL for uploading the package schema.
    • index string required
      The pre-signed URL for uploading the package index.
    • installationConfiguration string required
      The pre-signed URL for uploading the package installation configuration.
    Errors: 404 Source 409 Version already exists

    Get Package Version

    GET /api/registry/packages/{source}/{publisher}/{name}/versions/{version}

    Retrieves metadata for a specific version of a registry package. The package is identified by its source, publisher organization, and name. The version parameter accepts either a specific semantic version string or the special value ’latest’ to retrieve the most recently published version. The response includes the package’s name, publisher, version, title, description, repository URL, category, featured status, package types, maturity status, readme URL, schema URL, plugin download URL, creation timestamp, visibility, parameterization details, and usage statistics (when the caller is authenticated). Returns 404 if the specified package version does not exist.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string or ’latest'

    Responses

    200 OK
    • name string required
      The name of the package.
    • publisher string required
      The publisher of the package.
    • publisherDisplayName string optional
      The display name of the publisher.
    • source string required
      The source of the package.
    • version string required
      The version of the package in semver format.
    • title string optional
      The title/display name of the package.
    • description string optional
      The description of the package.
    • logoUrl string optional
      The URL of the logo for the package.
    • repoUrl string optional
      The URL of the repository the package is hosted in.
    • category string optional
      The category of the package.
    • isFeatured boolean required
      Whether the package is featured.
    • packageTypes array[string] optional
      The package types, e.g. “native”, “component”, “bridged”
    • packageStatus enum required
      The maturity level of the package, e.g. “ga”, “public_preview”
      Values: ga, public_preview
    • readmeURL string required
      The URL of the readme for the package.
    • schemaURL string required
      The URL of the schema for the package.
    • pluginDownloadURL string optional
      The URL to download the plugin at, as found in the schema.
    • createdAt string required
      The date and time the package version was created.
    • visibility enum required
      The visibility of the package.
      Values: public, private
    • parameterization PackageParameterization optional
      The parameterization of the provider, if any.
    • baseProvider ArtifactVersionNameSpec required
      The base provider that this package is parameterized from.
    • parameter array[string] required
      The opaque parameterization data passed to the base provider, base64-encoded.
    • usageStats PackageUsageStats optional
      Usage statistics for this package within the requesting org. Only populated when the caller is authenticated.
    • totalStacks integer optional
      Total number of stacks using this package.
    • onLatest integer optional
      Number of stacks on the latest version of this package.
    • onOlder integer optional
      Number of stacks on an older version of this package.
    • versionUnresolved integer optional
      Number of stacks where the version could not be resolved.
    Errors: 404 package version

    Delete Publish Package Version

    DELETE /api/registry/packages/{source}/{publisher}/{name}/versions/{version}

    Removes a specific version of a package from the registry. The package is identified by its source (e.g. ‘pulumi’, ‘opentofu’, or ‘private’), publisher organization, name, and semantic version. Requires the RegistryPublish permission on the publisher organization. Returns 204 No Content on success.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string of the package version to delete

    Responses

    204 No Content

    Post Publish Package Version Complete

    POST /api/registry/packages/{source}/{publisher}/{name}/versions/{version}/complete

    Finalizes the second step of the two-phase package version publish workflow. After initiating a publish with PostPublishPackageVersion and uploading all required artifacts (schema, index, installationConfiguration) to the pre-signed URLs, call this endpoint with the operationID to complete the publish. The service validates that all artifacts were uploaded successfully before making the version available in the registry. Returns 201 Created on success, 400 for a bad request (e.g. missing artifacts), 404 if the publish operation is not found, or 409 if the version already exists.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string of the package version to complete

    Request Body

    • operationID string required
      The identifier of the publish operation to complete.

    Responses

    Errors: 400 Bad request 404 Publish Operation 409 Version already exists

    Get Package Docs

    GET /api/registry/packages/{source}/{publisher}/{name}/versions/{version}/docs/{typeToken}

    Returns API documentation for a single resource or function identified by its URL-encoded Pulumi type token. Use ’lang’ to filter content to a single language and ‘os’ to collapse OS choosers in descriptions. Supports JSON or markdown via Accept. Returns 404 if the package version or type token does not exist.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string or ’latest'
    • typeToken string path required
      URL-encoded Pulumi type token. Encode with JavaScript’s encodeURIComponent or an equivalent that percent-encodes reserved characters; e.g. the type token ‘random:index/randomPassword:RandomPassword’ becomes ‘random%3Aindex%2FrandomPassword%3ARandomPassword’.
    • lang string query optional
      Filter to a single language. Defaults to Go. Values: typescript, python, go, csharp, java, yaml, hcl
    • os string query optional
      Collapse OS choosers in descriptions to a single OS. Values: linux, macos, windows

    Responses

    200 OK
    • version string required
      The resolved semantic version of the package.
    • navUrl string required
      Path to the package navigation endpoint for this version.
    • typeToken string required
      The Pulumi type token identifying this resource or function (e.g. ‘random:index/randomPassword:RandomPassword’).
    • kind string required
      Whether this is a ‘resource’ or ‘function’.
    • language string required
      Rendering target for code snippets and resolved names. Individual content may fall back to another available language when the target is missing. Never null.
    • name map[string]string required
      Display name keyed by language.
    • description array[RegistryContentNode] required
      Description as an array of content nodes. Chooser nodes are resolved.
    • kind string required
      Node kind. Known kinds: ’text’, ’language-chooser’, ‘os-chooser’. Render ‘markdown’ for unrecognized kinds.
    • markdown string required
      Markdown content. For ’text’ nodes, the content itself. For chooser nodes, a concatenation of options for fallback rendering.
    • options array[RegistryContentNodeOption] optional
      Options for chooser nodes; absent for ’text'.
    • inputs array[RegistryDocsProperty] optional
      Input properties.
    • name map[string]string required
      Property name, keyed by language.
    • type map[string]string required
      Display type, keyed by language.
    • required boolean required
      Whether the property is required.
    • replaceOnChanges boolean required
      Whether changing this property forces replacement.
    • deprecated boolean optional
      Whether this property is deprecated.
    • description map[string]string required
      Markdown description, keyed by language.
    • typeRef RegistryDocsTypeRef optional
      Reference to a local supporting type or a remote type. Null for primitive types.
    • outputs array[RegistryDocsProperty] optional
      Output properties.
    • name map[string]string required
      Property name, keyed by language.
    • type map[string]string required
      Display type, keyed by language.
    • required boolean required
      Whether the property is required.
    • replaceOnChanges boolean required
      Whether changing this property forces replacement.
    • deprecated boolean optional
      Whether this property is deprecated.
    • description map[string]string required
      Markdown description, keyed by language.
    • typeRef RegistryDocsTypeRef optional
      Reference to a local supporting type or a remote type. Null for primitive types.
    • supportingTypes array[RegistryDocsSupportingType] optional
      Supporting types referenced by inputs and outputs (inlined, not referenced by index).
    • typeToken string required
      Pulumi type token of this type.
    • name map[string]string required
      Display name keyed by language.
    • kind string required
      ‘object’ or ’enum’.
    • properties array[RegistryDocsProperty] optional
      Properties (when kind is ‘object’).
    • values array[RegistryDocsEnumValue] optional
      Enum values (when kind is ’enum’).
    Errors: 400 invalid query parameter 404 package version or type token

    Get Package Examples

    GET /api/registry/packages/{source}/{publisher}/{name}/versions/{version}/examples

    Returns code examples aggregated across the package’s resources and functions. Each example carries its ’typeToken’ and ‘kind’. Use ‘q’ for case-insensitive substring search on title and type token. Results are sorted by type token, then by example position within each type token. Use ’limit’ (default 20, max 100) to cap returned examples; ’totalCount’ reports the unfiltered count. Supports JSON or markdown via Accept. Returns 404 if the package version does not exist.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string or ’latest'
    • lang string query optional
      Snippet language. Defaults to Go. Values: typescript, python, go, csharp, java, yaml, hcl
    • limit integer query optional
      Maximum examples to return. Default 20; clamped to 100.
    • q string query optional
      URL-encoded case-insensitive substring filter on title and type token

    Responses

    200 OK
    • version string required
      Resolved semantic version.
    • navUrl string required
      Path to the package navigation endpoint.
    • language string required
      Resolved snippet language.
    • examples array[RegistryExample] required
      Examples sorted by type token, then by position within each type token. Capped at ’limit'.
    • id string required
      Stable identifier within the package version. Format: ‘#’, where slug is the kebab-case title (e.g. ‘aws:ec2/instance:Instance#account-analyzer’), falling back to ’example-’ when there is no heading. Duplicates within the same type token are suffixed ‘-2’, ‘-3’, etc.
    • title string required
      Title derived from the surrounding heading or caption. Capped at 120 chars. Empty when none was available; rely on ‘id’ for addressability.
    • code string required
      Example source code in the resolved language.
    • typeToken string required
      Pulumi type token this example belongs to.
    • kind string required
      Whether ’typeToken’ is a ‘resource’ or ‘function’.
    • totalCount integer required
      Total examples matching the query before ’limit’ was applied.
    Errors: 400 invalid query parameter 404 package version

    Get Package Installation

    GET /api/registry/packages/{source}/{publisher}/{name}/versions/{version}/installation

    Returns installation configuration as an ordered list of content nodes. Not all packages have installation configuration; returns 404 when absent. Use ’lang’ and ‘os’ to filter language- and OS-specific content. Supports JSON or markdown via Accept. Returns 404 if the package version does not exist or has no installation configuration.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string or ’latest'
    • lang string query optional
      Filter language-specific content to a single language. Values: typescript, python, go, csharp, java, yaml, hcl
    • os string query optional
      Filter OS-specific content to a single OS. Values: linux, macos, windows

    Responses

    200 OK
    • version string required
      The resolved semantic version of the package.
    • language string optional
      The language the content was filtered for, if a language filter was applied.
    • os string optional
      The operating system the content was filtered for, if an OS filter was applied.
    • navUrl string required
      Path to the package navigation endpoint for this version.
    • content array[RegistryContentNode] required
      Ordered list of content nodes composing the installation configuration document.
    • kind string required
      Node kind. Known kinds: ’text’, ’language-chooser’, ‘os-chooser’. Render ‘markdown’ for unrecognized kinds.
    • markdown string required
      Markdown content. For ’text’ nodes, the content itself. For chooser nodes, a concatenation of options for fallback rendering.
    • options array[RegistryContentNodeOption] optional
      Options for chooser nodes; absent for ’text'.
    Errors: 400 invalid query parameter 404 package version or installation configuration

    Get Package Nav

    GET /api/registry/packages/{source}/{publisher}/{name}/versions/{version}/nav

    Returns the package navigation: a flat list of modules in schema-declaration order. By default returns a summary (module names and counts only) suitable for discovery. Pass ‘depth=full’ to include resources and functions; combine with ‘q’ to filter results by name or type token. Module names like ‘s3/bucket’ are flat strings, not nested. Supports JSON or markdown via Accept. Returns 404 if the package version does not exist.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string or ’latest'
    • depth string query optional
      ‘summary’ (default) returns module names and counts only; ‘full’ includes resources and functions.
    • lang string query optional
      Language for name resolution. Defaults to Go. Values: typescript, python, go, csharp, java, yaml, hcl
    • q string query optional
      Case-insensitive substring filter on resource/function names and type tokens. Modules with no matches are omitted. Combine with ‘depth=full’ to return matched items.

    Responses

    200 OK
    • source string required
      Package source (e.g. ‘pulumi’).
    • publisher string required
      Package publisher (e.g. ‘pulumi’).
    • name string required
      Package name (e.g. ‘aws’).
    • version string required
      Resolved semantic version.
    • title string required
      Display title.
    • description string optional
      Short description of the package.
    • language string optional
      Rendering target for resolved names. Individual content may fall back to another available language when the target is missing.
    • packageVersionUrl string required
      Path to the package version metadata endpoint.
    • readmeUrl string required
      Path to the README endpoint.
    • installationUrl string optional
      Path to the installation configuration endpoint, if present.
    • docsUrlTemplate string required
      URL template for the docs endpoint. Substitute ‘{typeToken}’ with a URL-encoded Pulumi type token from a navigation item.
    • modules array[GetPackageNavModule] required
      Modules in this package.
    • name string required
      Module display name, resolved for the requested language. May contain ‘/’ (e.g. ‘s3/bucket’).
    • resources array[GetPackageNavItem] optional
      Resources in this module. Returned only when ‘depth=full’ is set.
    • functions array[GetPackageNavItem] optional
      Functions in this module. Returned only when ‘depth=full’ is set.
    • resourcesTotal integer required
      Total resources in this module, independent of ‘q’.
    • functionsTotal integer required
      Total functions in this module, independent of ‘q’.
    • modulesTotal integer required
      Total number of modules in the package, independent of ‘q’.
    Errors: 400 invalid query parameter 404 package version

    Get Package Readme

    GET /api/registry/packages/{source}/{publisher}/{name}/versions/{version}/readme

    Returns the package README as an ordered list of content nodes. Each node has a ‘kind’ and a ‘markdown’ fallback for unknown kinds. Use ’lang’ and ‘os’ to filter language- and OS-specific content. Supports JSON or markdown via Accept. Returns 404 if the package version does not exist.

    Request Parameters

    • source string path required
      The package source: ‘pulumi’, ‘opentofu’, or ‘private’
    • publisher string path required
      Organization that owns the package
    • name string path required
      The package name
    • version string path required
      Semantic version string or ’latest'
    • lang string query optional
      Filter language-specific content to a single language. Values: typescript, python, go, csharp, java, yaml, hcl
    • os string query optional
      Filter OS-specific content to a single OS. Values: linux, macos, windows

    Responses

    200 OK
    • version string required
      The resolved semantic version of the package.
    • language string optional
      The language the content was filtered for, if a language filter was applied.
    • os string optional
      The operating system the content was filtered for, if an OS filter was applied.
    • navUrl string required
      Path to the package navigation endpoint for this version.
    • content array[RegistryContentNode] required
      Ordered list of content nodes composing the README document.
    • kind string required
      Node kind. Known kinds: ’text’, ’language-chooser’, ‘os-chooser’. Render ‘markdown’ for unrecognized kinds.
    • markdown string required
      Markdown content. For ’text’ nodes, the content itself. For chooser nodes, a concatenation of options for fallback rendering.
    • options array[RegistryContentNodeOption] optional
      Options for chooser nodes; absent for ’text'.
    Errors: 400 invalid query parameter 404 package version

    List Templates

    GET /api/registry/templates

    Lists registry-backed templates with optional filtering, search, and pagination. This endpoint returns only registry-backed templates and does not include VCS-backed templates (those sourced from GitHub or GitLab repositories). No authentication is required. Results can be filtered by template name and owning organization (orgLogin). The search parameter performs case-insensitive partial matching against the template name, display name, description, metadata values, and runtime language. Results are paginated with a default limit of 100 per page; use the continuationToken from the response to retrieve subsequent pages. Each entry in the response includes the template’s name, publisher, source, display name, description, runtime, language, readme URL, download URL, visibility, and updated timestamp.

    Request Parameters

    • continuationToken string query optional
      Pagination token for retrieving the next page of results
    • limit integer query optional
      Maximum number of results to return (default: 100)
    • name string query optional
      Filter by specific template name
    • orgLogin string query optional
      Filter by owning organization
    • search string query optional
      Search query matching template name, display name, description, metadata values, or runtime language. Multiple space-separated terms require all terms to match (AND semantics).

    Responses

    200 OK
    • templates array[Template] required
      The list of templates
    • name string required
      The unique identifier name of the template.
    • publisher string required
      The organization or user that published the template.
    • source string required
      The source identifier indicating where the template originates from.
    • displayName string required
      The human-readable display name shown in the UI.
    • description string optional
      A free-form text description of the template’s purpose.
    • runtime TemplateRuntimeInfo optional
      The runtime that the template uses with optional configuration.
    • language enum required
      The language that the template is in, inferred from the runtime. This may differ from the runtime (e.g., dotnet runtime with C# language, nodejs runtime with TypeScript language) or be the same (e.g., python).
      Values: unknown, python, go, dotnet, java, javascript, typescript, yaml
    • readmeURL string optional
      ReadmeURL is just a pre-signed URL, derived from the artifact key.
    • downloadURL string required

      An URL, valid for at least 5 minutes that you can retrieve the full download bundle for your template.

      The bundle will be a .tar.gz.

    • repoSlug string optional
      A link to the hosting repository. Non-VCS backed templates do not have a repo slug as of now.
    • visibility enum required
      The visibility of the template (public or private).
      Values: public, private
    • updatedAt string required
      The timestamp when the template was last updated.
    • metadata map[string]string optional
      Key-value metadata associated with the template.
    • config map[string]AppProjectTemplateConfigValue optional
      Configuration values for the template.
    • url string required
      For registry-backed templates, the URL will be a registry:// URL. For VCS-backed templates, this will be the VCS URL (e.g., GitHub, GitLab).
    • continuationToken string optional
      An opaque token for fetching the next page of results
    • diagnostics array[string] optional
      Diagnostic messages encountered during template listing
    Errors: 400 Bad continuationToken

    List Template Versions

    GET /api/registry/templates/{source}/{publisher}/{name}/versions

    Lists all versions of a specific template, ordered by version descending (latest first). The template is identified by its source, publisher organization, and name. Results are paginated with a default limit of 100 per page. Use the continuationToken from the response to retrieve subsequent pages. Each entry in the response contains the template version metadata. Returns 400 for an invalid continuationToken or 404 if the template does not exist.

    Request Parameters

    • source string path required
      The template source: ‘private’, ‘github’, or ‘gitlab’
    • publisher string path required
      Organization that owns the template
    • name string path required
      The template name
    • continuationToken string query optional
      Pagination token for retrieving the next page of results
    • limit integer query optional
      Maximum number of results to return (default: 100)

    Responses

    200 OK
    • templates array[TemplateVersion] required
      Templates contains all versions of the specified template, sorted by version descending.
    • name string required
      The unique identifier name of the template.
    • version string required
      Version is the semantic version of this template.
    • publisher string required
      The organization or user that published the template.
    • source string required
      The source identifier indicating where the template originates from.
    • displayName string required
      The human-readable display name shown in the UI.
    • description string optional
      A free-form text description of the template’s purpose.
    • runtime TemplateRuntimeInfo optional
      The runtime that the template uses with optional configuration.
    • language enum required
      The language that the template is in, inferred from the runtime. This may differ from the runtime (e.g., dotnet runtime with C# language, nodejs runtime with TypeScript language) or be the same (e.g., python).
      Values: unknown, python, go, dotnet, java, javascript, typescript, yaml
    • readmeURL string optional
      ReadmeURL is just a pre-signed URL, derived from the artifact key.
    • downloadURL string required

      An URL, valid for at least 5 minutes that you can retrieve the full download bundle for your template.

      The bundle will be a .tar.gz.

    • repoSlug string optional
      A link to the hosting repository. Non-VCS backed templates do not have a repo slug as of now.
    • visibility enum required
      The visibility of the template (public or private).
      Values: public, private
    • updatedAt string required
      The timestamp when the template was last updated.
    • metadata map[string]string optional
      Key-value metadata associated with the template.
    • config map[string]AppProjectTemplateConfigValue optional
      Configuration values for the template.
    • url string required
      For registry-backed templates, the URL will be a registry:// URL. For VCS-backed templates, this will be the VCS URL (e.g., GitHub, GitLab).
    • continuationToken string optional
      Token to fetch the next page of results. If null or empty, there are no more results.
    Errors: 400 Bad continuationToken 404 template

    Post Publish Template Version

    POST /api/registry/templates/{source}/{publisher}/{name}/versions

    Initiates the first step of a two-phase template version publish workflow. This creates a publish transaction and returns an operationID along with a pre-signed upload URL for the template archive. The source must be ‘private’. The caller must upload the template archive (a gzip-compressed tar file containing a root-level Pulumi.yaml with a template section, and optionally a README.md) to the provided URL, then call PostPublishTemplateVersionComplete with the operationID to finalize the publish. The request body must include the semantic version to publish. Returns 202 Accepted with the operation details, or 404 if the source does not exist.

    Request Parameters

    • source string path required
      The template source: ‘private’, ‘github’, or ‘gitlab’
    • publisher string path required
      Organization that owns the template
    • name string path required
      The template name

    Request Body

    • version string required
      The semantic version of the template to publish.

    Responses

    202 Accepted
    • operationID string required
      The unique identifier for the publish operation.
    • uploadURLs TemplateUploadURLs required
      The URLs to upload template artifacts to.
    • archive string required
      The pre-signed URL for uploading the template archive.
    Errors: 404 Source

    Get Template Version

    GET /api/registry/templates/{source}/{publisher}/{name}/versions/{version}

    Retrieves metadata for a specific version of a registry template. The template is identified by its source (e.g. ‘private’, ‘github’, or ‘gitlab’), publisher organization, and name. The version parameter accepts either a specific semantic version string or the special value ’latest’ to retrieve the most recent version. The response includes the template’s name, display name, description, runtime information, language, readme URL, download URL (a pre-signed URL valid for at least 5 minutes for retrieving the .tar.gz archive), repository slug (for VCS-backed templates), visibility, updated timestamp, metadata, and configuration values. Returns 400 if a specific version is provided for VCS-backed templates (which do not support versioning), or 404 if the template version does not exist.

    Request Parameters

    • source string path required
      The template source: ‘private’, ‘github’, or ‘gitlab’
    • publisher string path required
      Organization that owns the template
    • name string path required
      The template name
    • version string path required
      Semantic version string or ’latest'

    Responses

    200 OK
    • name string required
      The unique identifier name of the template.
    • publisher string required
      The organization or user that published the template.
    • source string required
      The source identifier indicating where the template originates from.
    • displayName string required
      The human-readable display name shown in the UI.
    • description string optional
      A free-form text description of the template’s purpose.
    • runtime TemplateRuntimeInfo optional
      The runtime that the template uses with optional configuration.
    • name string optional
      The runtime language or platform, e.g. ’nodejs’, ‘python’, ‘go’, ‘dotnet’, ‘java’, ‘yaml’.
    • options map[string]object optional
      Optional configuration options for the runtime.
    • language enum required
      The language that the template is in, inferred from the runtime. This may differ from the runtime (e.g., dotnet runtime with C# language, nodejs runtime with TypeScript language) or be the same (e.g., python).
      Values: unknown, python, go, dotnet, java, javascript, typescript, yaml
    • readmeURL string optional
      ReadmeURL is just a pre-signed URL, derived from the artifact key.
    • downloadURL string required

      An URL, valid for at least 5 minutes that you can retrieve the full download bundle for your template.

      The bundle will be a .tar.gz.

    • repoSlug string optional
      A link to the hosting repository. Non-VCS backed templates do not have a repo slug as of now.
    • visibility enum required
      The visibility of the template (public or private).
      Values: public, private
    • updatedAt string required
      The timestamp when the template was last updated.
    • metadata map[string]string optional
      Key-value metadata associated with the template.
    • config map[string]AppProjectTemplateConfigValue optional
      Configuration values for the template.
    • url string required
      For registry-backed templates, the URL will be a registry:// URL. For VCS-backed templates, this will be the VCS URL (e.g., GitHub, GitLab).
    Errors: 400 version cannot be specified for VCS-backed templates 404 template version

    Delete Template Version

    DELETE /api/registry/templates/{source}/{publisher}/{name}/versions/{version}

    Removes a specific version of a template from the registry. The template is identified by its source (e.g. ‘private’, ‘github’, or ‘gitlab’), publisher organization, name, and semantic version. If this is the last remaining version of the template, the ‘force’ query parameter must be set to true; doing so will also delete the template itself. Returns 204 No Content on success, or 400 if an invalid query parameter is provided.

    Request Parameters

    • source string path required
      The template source: ‘private’, ‘github’, or ‘gitlab’
    • publisher string path required
      Organization that owns the template
    • name string path required
      The template name
    • version string path required
      Semantic version string of the template version to delete
    • force boolean query optional
      When true, allows deletion of the final remaining template version

    Responses

    204 No Content
    Errors: 400 invalid query parameter

    Post Publish Template Version Complete

    POST /api/registry/templates/{source}/{publisher}/{name}/versions/{version}/complete

    Finalizes the second step of the two-phase template version publish workflow. After initiating a publish with PostPublishTemplateVersion and uploading the template archive (.tar.gz) to the pre-signed URL, call this endpoint with the operationID to complete the publish. The service validates that the archive was uploaded successfully before making the version available in the registry. Once complete, the template becomes available to the publisher’s organization. Returns 201 Created on success, 400 for invalid operation state, 404 if the publish operation is not found, or 409 if the version already exists.

    Request Parameters

    • source string path required
      The template source: ‘private’, ‘github’, or ‘gitlab’
    • publisher string path required
      Organization that owns the template
    • name string path required
      The template name
    • version string path required
      Semantic version string of the template version to complete

    Request Body

    • operationID string required
      The identifier of the publish operation to complete.

    Responses

    Errors: 400 Operation 404 Publish Operation 409 Version already exists