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

# Allow a website to show your widgets

> Adds a website to an account's own list. Give a website name such as `example.com`, or `*.example.com` for a website and all of its subdomains. A scheme, a port, a path, capital letters and a leading `www.` are dropped, so `https://www.Example.com/shop` is kept as `example.com`, and `example.com` covers `www.example.com` too. Something that is not a website name is refused, not stored.
Until the first website is added nothing is restricted, and a widget can be shown anywhere. Once the list has one, a widget of the account is shown on the listed websites (and on Widgetic's own) and nowhere else. A page on your own machine (`localhost`, `127.0.0.1` or `[::1]`, on any port) is always allowed, so there is nothing to add to test locally. So is the website where a partner your account administers integrates Widgetic, with every subdomain of it (`platformDomain` in the answer of `GET /partners/mine`), so there is nothing to add for it either and a list can never lock it out. A change can take about 15 seconds to reach every server.
The list is a safeguard against other websites showing your widgets in a visitor's browser. It is not access control: anyone who knows a widget's id can still fetch its published content with a plain request that names no website.
There is no limit on the list of an account that administers a partner, so a partner can add the website of each of its customers as they publish on their own domain, one call each. Any other account can list at most 50 websites, and the 51st is answered with a 409 (`BUSINESS_STATE_CONFLICT`). A wildcard such as `*.example.com` counts as one website, not one per subdomain, so use it instead of listing each subdomain.
A page that frames a widget can name only so many websites to the browser (about fifty of ordinary length). Past that, the browser no longer checks the list for that page; the lookup that the Embed SDK makes for the widget still refuses every website that is not on the list.



## OpenAPI

````yaml /openapi/widgetic-api-public.json post /users/{id}/workspace/domains
openapi: 3.0.0
info:
  title: Widgetic API Gateway
  version: 1.0.0
  description: API documentation for the Widgetic API Gateway
  license:
    name: Widgetic Integration License
    url: https://docs.widgetic.com/resources/license
servers:
  - url: https://api.widgetic.com/v1
    description: Production server
    variables:
      env:
        default: production
        description: Environment
      apiUrl:
        default: https://api.widgetic.com
        description: API URL
      apiVersion:
        default: /v1
        description: API Version path prefix
security: []
tags: []
paths:
  /users/{id}/workspace/domains:
    post:
      tags:
        - Users
      summary: Allow a website to show your widgets
      description: >-
        Adds a website to an account's own list. Give a website name such as
        `example.com`, or `*.example.com` for a website and all of its
        subdomains. A scheme, a port, a path, capital letters and a leading
        `www.` are dropped, so `https://www.Example.com/shop` is kept as
        `example.com`, and `example.com` covers `www.example.com` too. Something
        that is not a website name is refused, not stored.

        Until the first website is added nothing is restricted, and a widget can
        be shown anywhere. Once the list has one, a widget of the account is
        shown on the listed websites (and on Widgetic's own) and nowhere else. A
        page on your own machine (`localhost`, `127.0.0.1` or `[::1]`, on any
        port) is always allowed, so there is nothing to add to test locally. So
        is the website where a partner your account administers integrates
        Widgetic, with every subdomain of it (`platformDomain` in the answer of
        `GET /partners/mine`), so there is nothing to add for it either and a
        list can never lock it out. A change can take about 15 seconds to reach
        every server.

        The list is a safeguard against other websites showing your widgets in a
        visitor's browser. It is not access control: anyone who knows a widget's
        id can still fetch its published content with a plain request that names
        no website.

        There is no limit on the list of an account that administers a partner,
        so a partner can add the website of each of its customers as they
        publish on their own domain, one call each. Any other account can list
        at most 50 websites, and the 51st is answered with a 409
        (`BUSINESS_STATE_CONFLICT`). A wildcard such as `*.example.com` counts
        as one website, not one per subdomain, so use it instead of listing each
        subdomain.

        A page that frames a widget can name only so many websites to the
        browser (about fifty of ordinary length). Past that, the browser no
        longer checks the list for that page; the lookup that the Embed SDK
        makes for the widget still refuses every website that is not on the
        list.
      operationId: addPersonalWorkspaceDomain
      parameters:
        - name: id
          in: path
          required: true
          description: The account the list belongs to. For your own, your own user id
          schema:
            type: string
            format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AddDomainRequest'
      responses:
        '201':
          description: The website was added
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PersonalWorkspaceDomainResultResponse'
        '400':
          description: >-
            The text is missing, longer than 255 characters, or not a website
            name
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Not authenticated
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: The list belongs to another account
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: The account was not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: >-
            The website is already on the list (`RESOURCE_ALREADY_EXISTS`), or
            the account does not administer a partner and its list already holds
            50 websites (`BUSINESS_STATE_CONFLICT`)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      security:
        - apiKeyAuth: []
components:
  schemas:
    AddDomainRequest:
      type: object
      required:
        - domain
      properties:
        domain:
          type: string
          description: Domain pattern to allow (supports wildcards like *.example.com)
          example: example.com
      example:
        domain: example.com
    PersonalWorkspaceDomainResultResponse:
      type: object
      required:
        - success
        - data
      properties:
        success:
          type: boolean
          description: Always `true` on a success.
          example: true
        data:
          $ref: '#/components/schemas/PersonalWorkspaceDomainResult'
        meta:
          $ref: '#/components/schemas/ResponseMeta'
    ErrorResponse:
      type: object
      required:
        - success
        - message
        - error
      additionalProperties: true
      properties:
        success:
          type: boolean
          description: Always `false` on a failure.
          example: false
        message:
          type: string
          description: The same text as `error.message`, for a caller that reads one line.
        error:
          $ref: '#/components/schemas/ErrorDetail'
    PersonalWorkspaceDomainResult:
      type: object
      properties:
        message:
          type: string
          example: Domain added successfully
        domain:
          $ref: '#/components/schemas/PersonalWorkspaceDomain'
      required:
        - message
        - domain
      example:
        message: Domain added successfully
        domain: null
    ResponseMeta:
      type: object
      description: >-
        Extra information about the answer: where a page sits in a list, the
        cursor of the next page, or warnings about a call that succeeded with a
        caveat.
      additionalProperties: true
      properties:
        page:
          type: integer
          description: The page that was read, counting from 1.
          example: 1
        size:
          type: integer
          description: How many items one page holds.
          example: 20
        total:
          type: integer
          description: How many items the whole list has.
          example: 135
        limit:
          type: integer
          description: The same as `size`.
          example: 20
        offset:
          type: integer
          description: How many items come before this page.
          example: 0
        hasNextPage:
          type: boolean
          example: true
        hasPreviousPage:
          type: boolean
          example: false
        nextCursor:
          type: string
          nullable: true
          description: >-
            Pass this as `cursor` to read the next page of a list that is read
            by cursor. `null` on the last page.
        warnings:
          type: array
          items:
            type: string
          description: >-
            Things the call did not do, though it succeeded (for example a table
            that could not be created just now).
    ErrorDetail:
      type: object
      required:
        - code
        - message
        - timestamp
      properties:
        code:
          type: string
          description: Machine-readable error code.
          example: RESOURCE_NOT_FOUND
        message:
          type: string
          description: Human-readable explanation.
          example: Composition not found
        param:
          type: string
          description: The field that caused the error, when one did.
          example: name
        docUrl:
          type: string
          description: Where this error is explained.
        suggestedAction:
          type: string
          description: What to do about it.
        retryAfter:
          type: integer
          description: >-
            Seconds to wait before trying again (rate limits). The same number
            is in the `Retry-After` header.
          example: 60
        details:
          type: object
          additionalProperties: true
          description: >-
            More about the error: the fields that failed, a limit that was
            reached.
        correlationId:
          type: string
          description: Quote this when you ask support about the call.
          example: req_123e4567-e89b-12d3-a456-426614174000
        timestamp:
          type: string
          format: date-time
          example: '2026-10-15T10:00:00.000Z'
    PersonalWorkspaceDomain:
      type: object
      description: >-
        One website on a person's own list of the websites allowed to show their
        widgets
      properties:
        id:
          type: string
          format: uuid
          description: The id of the entry. Use it to change or remove the entry
        userId:
          type: string
          format: uuid
          description: The account the list belongs to
        domain:
          type: string
          description: >-
            The website as it is kept: lower case, with no scheme, port, path or
            leading `www.`. A leading `*.` means the website and all of its
            subdomains
          example: example.com
        createdAt:
          type: string
          format: date-time
        updatedAt:
          type: string
          format: date-time
      required:
        - id
        - userId
        - domain
      example:
        id: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        userId: 3fa85f64-5717-4562-b3fc-2c963f66afa6
        domain: example.com
        createdAt: '2026-01-15T09:30:00.000Z'
        updatedAt: '2026-01-15T09:30:00.000Z'
  securitySchemes:
    apiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.