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

# Portal Get Anon Page Render

> Retrieve a sanitized anonymous page render for an auth page.

Anonymous-readable. Returns a sanitized 'hub-page-renders' JSON:API response
containing only whitelisted branding, page settings, and section content.

path param page_type in {login, register, payments}

Non-whitelisted type values return 404 (no DB hit, publicly documented whitelist).
Unknown slug, soft-deleted hub/team/page, or missing page returns 404.
All 404 responses use the same JSON:API error shape.

Rate-limited at 600 req/hour per IP (reuses _portal_slug_rl pattern).



## OpenAPI

````yaml /openapi/mio-openapi.json get /api/v1/hubs/{slug}/pages/{page_type}
openapi: 3.1.0
info:
  description: >-
    Production API reference for Membership.io. Use the authored guides for
    workflows and the generated endpoint pages for exact parameters and schemas.
  title: Membership.io API
  version: 0.1.0
servers:
  - description: Production
    url: https://api.member.dev
security:
  - bearerAuth: []
paths:
  /api/v1/hubs/{slug}/pages/{page_type}:
    get:
      tags:
        - hubs-portal
      summary: Portal Get Anon Page Render
      description: >-
        Retrieve a sanitized anonymous page render for an auth page.


        Anonymous-readable. Returns a sanitized 'hub-page-renders' JSON:API
        response

        containing only whitelisted branding, page settings, and section
        content.


        path param page_type in {login, register, payments}


        Non-whitelisted type values return 404 (no DB hit, publicly documented
        whitelist).

        Unknown slug, soft-deleted hub/team/page, or missing page returns 404.

        All 404 responses use the same JSON:API error shape.


        Rate-limited at 600 req/hour per IP (reuses _portal_slug_rl pattern).
      operationId: hubs_portal.get_hubs_portal_get_hubs_by_slug_pages_by_page_type
      parameters:
        - in: path
          name: slug
          required: true
          schema:
            maxLength: 100
            minLength: 1
            title: Slug
            type: string
        - in: path
          name: page_type
          required: true
          schema:
            title: Page Type
            type: string
      responses:
        '200':
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/HubPageRenderResponse'
          description: Successful Response
        '404':
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/JsonApiErrorResponse'
          description: >-
            page_not_found — the slug is unknown, the hub/team/page is
            soft-deleted, page_type is not in the anonymous whitelist {login,
            register, payments}, or no matching page exists. All cases share
            this response shape (no disclosure of which case occurred).
        '422':
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
          description: Validation Error
components:
  schemas:
    HubPageRenderResponse:
      additionalProperties: false
      description: >-
        Top-level JSON:API response envelope for GET
        /api/hubs/{slug}/pages/{type}.
      properties:
        data:
          $ref: '#/components/schemas/HubPageRenderResource'
      required:
        - data
      title: HubPageRenderResponse
      type: object
    JsonApiErrorResponse:
      description: Error JSON:API response.
      properties:
        errors:
          items:
            $ref: '#/components/schemas/JsonApiError'
          title: Errors
          type: array
        meta:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Meta
      required:
        - errors
      title: JsonApiErrorResponse
      type: object
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          title: Detail
          type: array
      title: HTTPValidationError
      type: object
    HubPageRenderResource:
      additionalProperties: false
      description: JSON:API resource object for a hub-page-renders resource.
      properties:
        attributes:
          $ref: '#/components/schemas/HubPageRenderAttributes'
        id:
          title: Id
          type: string
        type:
          const: hub_page_renders
          default: hub_page_renders
          title: Type
          type: string
      required:
        - id
        - attributes
      title: HubPageRenderResource
      type: object
    JsonApiError:
      properties:
        code:
          anyOf:
            - type: string
            - type: 'null'
          title: Code
        detail:
          anyOf:
            - type: string
            - type: 'null'
          title: Detail
        id:
          anyOf:
            - type: string
            - type: 'null'
          title: Id
        meta:
          anyOf:
            - additionalProperties: true
              type: object
            - type: 'null'
          title: Meta
        source:
          anyOf:
            - additionalProperties:
                type: string
              type: object
            - type: 'null'
          title: Source
        status:
          title: Status
          type: string
        title:
          title: Title
          type: string
      required:
        - status
        - title
      title: JsonApiError
      type: object
    ValidationError:
      properties:
        ctx:
          title: Context
          type: object
        input:
          title: Input
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          title: Location
          type: array
        msg:
          title: Message
          type: string
        type:
          title: Error Type
          type: string
      required:
        - loc
        - msg
        - type
      title: ValidationError
      type: object
    HubPageRenderAttributes:
      additionalProperties: false
      properties:
        branding:
          $ref: '#/components/schemas/AnonBrandingView'
        page_type:
          title: Page Type
          type: string
        sections:
          items:
            $ref: '#/components/schemas/AnonSectionView'
          title: Sections
          type: array
        settings:
          anyOf:
            - $ref: '#/components/schemas/LoginPageSettings'
            - $ref: '#/components/schemas/RegisterPageSettings'
            - $ref: '#/components/schemas/PaymentsPageSettings'
            - type: 'null'
          title: Settings
        title:
          title: Title
          type: string
      required:
        - page_type
        - title
        - branding
        - settings
        - sections
      title: HubPageRenderAttributes
      type: object
    AnonBrandingView:
      properties:
        background_color:
          anyOf:
            - type: string
            - type: 'null'
          title: Background Color
        custom_login_logo_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Custom Login Logo Url
        logo_url:
          anyOf:
            - type: string
            - type: 'null'
          title: Logo Url
        primary_color:
          anyOf:
            - type: string
            - type: 'null'
          title: Primary Color
        secondary_color:
          anyOf:
            - type: string
            - type: 'null'
          title: Secondary Color
      required:
        - logo_url
        - primary_color
        - secondary_color
        - background_color
        - custom_login_logo_url
      title: AnonBrandingView
      type: object
    AnonSectionView:
      properties:
        position:
          title: Position
          type: integer
        settings:
          anyOf:
            - $ref: '#/components/schemas/FeatureSectionSettings'
            - $ref: '#/components/schemas/RowSectionSettings'
            - type: 'null'
          title: Settings
        title:
          anyOf:
            - type: string
            - type: 'null'
          title: Title
        type:
          title: Type
          type: string
      required:
        - type
        - title
        - position
        - settings
      title: AnonSectionView
      type: object
    LoginPageSettings:
      additionalProperties: false
      description: Whitelisted page.settings keys for a login page.
      properties:
        show_registration_link:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Show Registration Link
        show_social_login:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Show Social Login
      title: LoginPageSettings
      type: object
    RegisterPageSettings:
      additionalProperties: false
      description: Whitelisted page.settings keys for a register page.
      properties:
        require_tos_accept:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Require Tos Accept
        show_social_login:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Show Social Login
      title: RegisterPageSettings
      type: object
    PaymentsPageSettings:
      additionalProperties: false
      description: Whitelisted page.settings keys for a payments page.
      properties:
        show_coupon_field:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Show Coupon Field
        show_order_summary:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Show Order Summary
      title: PaymentsPageSettings
      type: object
    FeatureSectionSettings:
      additionalProperties: false
      description: |-
        Settings for a 'feature' section.

        body is plain text (no HTML). icon is omitted if it does not match
        ^[a-z0-9\-]+$ (named icon identifier pattern).
      properties:
        body:
          anyOf:
            - type: string
            - type: 'null'
          title: Body
        icon:
          anyOf:
            - type: string
            - type: 'null'
          title: Icon
        label:
          anyOf:
            - type: string
            - type: 'null'
          title: Label
      title: FeatureSectionSettings
      type: object
    RowSectionSettings:
      additionalProperties: false
      description: |-
        Settings for a 'row' layout section.

        layout must be one of {"columns", "stack"} — any other value is None.
        No child-section data is rendered (Section has no parent/child FK).
      properties:
        layout:
          anyOf:
            - enum:
                - columns
                - stack
              type: string
            - type: 'null'
          title: Layout
      title: RowSectionSettings
      type: object
  securitySchemes:
    bearerAuth:
      bearerFormat: JWT or mio_sk API key
      description: >-
        Send platform JWTs, contact JWTs, or team API keys as `Authorization:
        Bearer <token>`.
      scheme: bearer
      type: http

````