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

# Get Page Layout

> Read the layout of one registered SDUI page, including cards, field placements,
rendering arguments, and unevaluated display/required conditions. Nested cards
referenced by card lists and row-card tables are included transitively, once
each. Unrelated pages and record values are excluded. A registered page with
no configured cards returns an empty cards array.

**Required permission:** the page's owning entity view permission:
`event.view`, `exposure.view`, `quote.view`, `policy.view`, `submission.view`,
`person.view`, or `organization.view`. `configuration.view` is not required
and does not substitute for the owning entity's view permission.

For example, `eventViewDetails` requires `event.view`, `quoteViewDetails`
requires `quote.view`, and `policyViewDetails` requires `policy.view`.
Page keys are case-sensitive application constants, not tenant-defined names.
The response's entity identifies the page's owner, including Quote for quote,
bind, cancellation, and underwriting flow pages.

This is layout metadata, not permission to perform an action. Record reads,
linked records, edits, and workflow actions retain their own authorization.
Display conditions are presentation rules, never access controls. Clients
supply field schemas, record data, and expression evaluation separately.
Configuration-authoring `describe/*` reads continue to require `configuration.view`.




## OpenAPI

````yaml /openapi/generated-external-api.yaml get /api/v1/companies/{companyId}/pages/{pageKey}/layout
openapi: 3.0.3
info:
  title: AI Insurance External API
  description: External API for AI Insurance platform
  version: 1.0.0
  contact:
    email: support@aiinsurance.io
servers:
  - url: https://go.aiinsurance.io
    description: Production
security:
  - ApiKeyAuth: []
paths:
  /api/v1/companies/{companyId}/pages/{pageKey}/layout:
    get:
      tags:
        - Entities
      summary: Get Page Layout
      description: >
        Read the layout of one registered SDUI page, including cards, field
        placements,

        rendering arguments, and unevaluated display/required conditions. Nested
        cards

        referenced by card lists and row-card tables are included transitively,
        once

        each. Unrelated pages and record values are excluded. A registered page
        with

        no configured cards returns an empty cards array.


        **Required permission:** the page's owning entity view permission:

        `event.view`, `exposure.view`, `quote.view`, `policy.view`,
        `submission.view`,

        `person.view`, or `organization.view`. `configuration.view` is not
        required

        and does not substitute for the owning entity's view permission.


        For example, `eventViewDetails` requires `event.view`,
        `quoteViewDetails`

        requires `quote.view`, and `policyViewDetails` requires `policy.view`.

        Page keys are case-sensitive application constants, not tenant-defined
        names.

        The response's entity identifies the page's owner, including Quote for
        quote,

        bind, cancellation, and underwriting flow pages.


        This is layout metadata, not permission to perform an action. Record
        reads,

        linked records, edits, and workflow actions retain their own
        authorization.

        Display conditions are presentation rules, never access controls.
        Clients

        supply field schemas, record data, and expression evaluation separately.

        Configuration-authoring `describe/*` reads continue to require
        `configuration.view`.
      operationId: getPageLayout
      parameters:
        - $ref: '#/components/parameters/companyId'
        - name: pageKey
          in: path
          required: true
          description: >-
            Registered page key, such as eventViewDetails, quoteViewDetails, or
            policyViewDetails.
          schema:
            type: string
          examples:
            eventDetails:
              summary: Event details page
              value: eventViewDetails
      responses:
        '200':
          description: Requested page metadata and its reachable layout.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PageLayoutResponse'
              examples:
                eventDetails:
                  summary: One Event details card
                  value:
                    page:
                      pageKey: eventViewDetails
                      name: View Event - Event Details
                      description: Event details tab of the view event page
                      entity: Event
                      pageType: viewEdit
                    cards:
                      - cardKey: eventDetails
                        name: Event Details
                        entity: Event
                        cardType: viewEdit
                        columnCount: 4
                        displayPosition: 1
                        placements:
                          - fieldReferenceId: eventName
                            label: Event Name
                            position:
                              row: 1
                              column: 1
                              rowSpan: 1
                              columnSpan: 4
                              zAxis: 0
                            inputModality: Text Box
                            inputModalityArgs: null
                            displayFormat: Plain Text
                            displayFormatArgs: null
        '400':
          description: The page key is not in the application page registry.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                invalidPageKey:
                  summary: Unknown page key
                  value:
                    error:
                      code: INVALID_PAGE_KEY
                      message: Unknown page key.
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '500':
          $ref: '#/components/responses/InternalServerError'
      security:
        - BearerAuth: []
        - ApiKeyAuth: []
components:
  parameters:
    companyId:
      name: companyId
      in: path
      required: true
      schema:
        type: string
        format: uuid
      description: Company identifier
  schemas:
    PageLayoutResponse:
      type: object
      required:
        - page
        - cards
      properties:
        page:
          type: object
          required:
            - pageKey
            - name
            - description
            - entity
            - pageType
          properties:
            pageKey:
              type: string
            name:
              type: string
            description:
              type: string
            entity:
              type: string
              enum:
                - Event
                - Exposure
                - Quote
                - Policy
                - Submission
                - Person
                - Organization
            pageType:
              type: string
              enum:
                - input
                - readonly
                - viewEdit
        cards:
          type: array
          description: >-
            Direct page cards followed by the transitive closure of nested cards
            referenced by cardKeys, legacy cardKey, or rowCard. Each card
            appears once; no unrelated page attachments or record values are
            returned.
          items:
            type: object
            required:
              - cardKey
              - name
              - entity
              - columnCount
              - placements
            properties:
              cardKey:
                type: string
                description: The card's natural key.
              name:
                type: string
                description: The card's display title.
              entity:
                type: string
                description: The entity the card belongs to.
              cardType:
                type: string
                enum:
                  - input
                  - readonly
                  - viewEdit
                description: The card type (omitted when the card carries none).
              columnCount:
                type: integer
                description: >
                  The card's grid width — the bound a relayout column must stay
                  within

                  (the platform default when the card sets none).
              placements:
                type: array
                description: Every field placement on the card, sorted by grid position.
                items:
                  type: object
                  required:
                    - fieldReferenceId
                    - label
                    - position
                    - inputModality
                    - displayFormat
                    - inputModalityArgs
                    - displayFormatArgs
                  properties:
                    fieldReferenceId:
                      type: string
                      description: The placed field's natural key.
                    subFieldReferenceId:
                      type: string
                      description: For a sub-field placement, the sub-field's natural key.
                    label:
                      type: string
                      description: The placement's label.
                    position:
                      type: object
                      description: The placement's absolute 1-indexed grid coordinates.
                      required:
                        - row
                        - column
                        - rowSpan
                        - columnSpan
                        - zAxis
                      properties:
                        row:
                          type: integer
                        column:
                          type: integer
                        rowSpan:
                          type: integer
                        columnSpan:
                          type: integer
                        zAxis:
                          type: number
                          description: Layer order for overlapping cells.
                    inputModality:
                      type: string
                      nullable: true
                      description: >-
                        How the field is edited (`null` when the placement
                        carries none).
                    displayFormat:
                      type: string
                      nullable: true
                      description: >-
                        The display format (`null` when the placement carries
                        none).
                    requiredCondition:
                      type: string
                      description: >
                        A UI conditional-required JEXL rule (placement scope
                        only —

                        distinct from spec nullability). Omitted when absent.
                    autoSetCalculation:
                      type: string
                      description: The autoSet calculation expression, when set.
                    autoSetTrigger:
                      type: string
                      description: The autoSet trigger, when set.
                    autoSetConfirmation:
                      type: string
                      description: The autoSet confirmation prompt, when set.
                    inputModalityArgs:
                      type: object
                      nullable: true
                      additionalProperties: true
                      description: >-
                        Rendering arguments, including nested card references
                        when applicable.
                    displayFormatArgs:
                      type: object
                      nullable: true
                      additionalProperties: true
                      description: >-
                        Rendering arguments, including nested card references
                        when applicable.
                    displayCondition:
                      type: string
                      description: Unevaluated placement visibility JEXL expression.
              displayPosition:
                type: number
                description: >-
                  Present only on cards directly attached to the requested page.
                  Direct cards are ordered by this value; reachable nested cards
                  follow without it.
              displayCondition:
                type: string
                description: Unevaluated card visibility JEXL expression.
              cardTitleExpression:
                type: string
                description: Unevaluated JEXL expression for the rendered card title.
    ErrorResponse:
      type: object
      description: Standard error response for all external API endpoints
      required:
        - error
      properties:
        error:
          type: object
          required:
            - code
            - message
          properties:
            code:
              type: string
              description: Machine-readable error code
              example: VALIDATION_ERROR
            message:
              type: string
              description: Human-readable error message
              example: 'submissionId: Required field is missing'
            userMessages:
              type: array
              description: >-
                Clean, verbatim-displayable messages — one entry per failure,
                free of error-code tags, field paths, and internal noise.
                Suitable for showing to end users as-is.
              items:
                type: string
              example:
                - Exposures of type 'company' require an address
            details:
              type: array
              description: Additional details for validation errors (field-level errors)
              items:
                type: object
                properties:
                  field:
                    type: string
                    description: The field that caused the error
                    example: submissionId
                  code:
                    type: string
                    description: Stable problem code for this individual validation failure
                    example: BLANK_LIST_ELEMENT
                  reason:
                    type: string
                    description: Stable reason the value violates its canonical contract
                    example: blank-list-element
                  expected:
                    type: string
                    description: The expected canonical value contract
                    example: nonblank trimmed string
                  message:
                    type: string
                    description: Description of the field error
                    example: Required field is missing
  responses:
    Unauthorized:
      description: Unauthorized - Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            missingApiKey:
              summary: Missing API key
              value:
                error:
                  code: AuthenticationError
                  message: API key authentication required
                  userMessages:
                    - API key authentication required
            invalidApiKey:
              summary: >-
                Invalid API key (e.g. unknown key, or a Bearer token used
                instead of an API key)
              value:
                error:
                  code: AuthenticationError
                  message: Invalid API key
                  userMessages:
                    - Invalid API key
    Forbidden:
      description: Forbidden - Insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            insufficientPermissions:
              summary: Insufficient permissions
              value:
                error:
                  code: AuthorizationError
                  message: User is not authorized to perform the requested action
                  userMessages:
                    - User is not authorized to perform the requested action
            companyMismatch:
              summary: A valid API key naming another company in the URL
              value:
                error:
                  code: AuthorizationError
                  message: API key is not scoped to the requested company
                  userMessages:
                    - API key is not scoped to the requested company
    InternalServerError:
      description: Internal Server Error - Unexpected error occurred
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          examples:
            internalError:
              summary: Unexpected server error
              value:
                error:
                  code: UncaughtActionError
                  message: Uncaught error occurred in <actionName>
                  userMessages:
                    - An unexpected error occurred. Please try again later.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: >-
        API key authentication. Send your raw API key as the `Authorization`
        header value with NO scheme prefix — `Authorization: YOUR-API-KEY`. Do
        NOT prefix it with `Bearer ` or `ApiKey `, and do not use an `X-API-Key`
        header; those are not accepted.
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        User-principal OAuth 2.0 Bearer authentication. Send a user-scoped Auth0
        access token (audience = the app API audience) as `Authorization: Bearer
        <jwt>`. The request resolves to the user's identity and is authorized by
        their Role on the `{companyId}` in the path — the same role-based
        permissions the web app enforces. This is the path the MCP connector
        uses to act on a user's behalf; endpoints that accept it list both
        `BearerAuth` and `ApiKeyAuth`.

````