---
title: "Get a published extension"
method: GET
path: "/v1/public/published-extension/{extensionId}"
tags: ["Public"]
---

# Get a published extension

`GET /v1/public/published-extension/{extensionId}`

## Request

- Base URL: `https://api.finalpos.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.finalpos.com/v1/public/published-extension/{extensionId}`
- Auth: none required

Returns a single extension with `status: "public"` by id, including its resolved surfaces and owning organization. Publicly accessible — no API key required. Responds `404` if the extension does not exist or is not public.

## Path parameters

- `extensionId` string, required

## Response `200`

The published extension.

- PublishedExtensionDto
  - `_id` string, required: Extension id.
  - `label` string, required: Extension display name.
  - `status` string, required: Publication status. Always `public` for these endpoints.
  - `category` string, required: Extension category.
  - `short_description` string, required: Short marketing description.
  - `long_description` string, required: Long marketing description.
  - `url` string: Hosted iframe URL of the extension, if deployed.
  - `description` string: General/legacy description.
  - `price` string: Price label.
  - `website` string: Marketing website URL.
  - `main_image` string: Main listing image URL.
  - `backgroundUrl` string: Background image URL.
  - `gallery` string[]: Gallery image URLs.
  - `theme` string: Theme identifier.
  - `redirectUrl` string: Post-install redirect URL.
  - `organizationId` string: Owning organization id (reference to `companies`).
  - `organization` OrganizationSummaryDto, required
    - `_id` string, required: Organization (Company) id.
    - `name` string, nullable, required: Organization name.
    - `logo` string, nullable, required: Organization logo URL, if set.
    - `organization_alias` string, nullable, required: Organization's public alias, from the `organization_alias` company-settings attribute.
  - `createdAt` string, required: Creation timestamp (ISO 8601).
  - `updatedAt` string, required: Last-update timestamp (ISO 8601).
  - `surfaces` SurfaceDto[], required: Surfaces (injection points) attached to this extension. Empty when none are linked.
    - `_id` string, required: Surface id.
    - `organizationId` string, required: Owning organization id.
    - `name` string, required: Human-readable surface name.
    - `surfaceId` string, required: Developer-facing handle used in code: openSurface({ id }).
    - `platform` 'builder' | 'hub' | 'render', required: Hosting platform. Each surface type belongs to exactly one platform.
    - `type` 'builder-component' | 'pop-up-overlay' | 'full-screen-overlay' | 'extendable-div' | 'merchant-hub-widget' | 'merchant-hub-page' | 'station-home-widget' | 'station-settings-page', required: Surface type discriminator.
    - `url` string, required: Iframe URL that loads when the surface is triggered.
    - `icon` string: Icon for Builder Component surfaces.
    - `hasManualButton` boolean: Whether a Button Grid trigger exists alongside the hook (overlay surfaces only).
    - `buttonLabel` string: Label shown on the Button Grid trigger.
    - `hubResource` 'products' | 'orders' | 'customers' | 'users': Hub resource the surface attaches to (Merchant Hub Widget / Page only).
    - `createdAt` string, required: Creation timestamp (ISO 8601).
    - `updatedAt` string, required: Last-update timestamp (ISO 8601).

## Other responses

- `404`: No published extension exists with this id.
- `429`: Rate limit exceeded for the caller IP. Back off and retry after the `retryAfter` interval.

---

[API](https://skmtc.dev/finalpos/apis/final-pos-public-api.md) · [All operations](https://skmtc.dev/finalpos/apis/final-pos-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/finalpos/apis/final-pos-public-api/revisions/6a6842dcb479?raw)
