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

# Get Site Page Slugs

> Resolve persisted, stable page URL slugs for a site using page hierarchy data.

## Overview

The `/v2/orgs/{orgId}/sites/{siteId}/page-slug` endpoint resolves complete page URL paths from persisted site page records.

Use this endpoint when you need stable links for destination, guide, and area pages without reconstructing URLs from mutable names.

The API uses persisted page `slug` values and `parentId` relationships.

Returned `slug` and `segments` values are microsite-relative.
The resolver strips the site-root prefix (including reverse-proxy roots like `/local-guides`) so responses are not coupled to infrastructure paths.

## Request

```http theme={null}
GET /v2/orgs/{orgId}/sites/{siteId}/page-slug
```

### Required parameters

| Parameter | Type   | Description                            |
| --------- | ------ | -------------------------------------- |
| `orgId`   | string | Your organisation ID.                  |
| `siteId`  | string | The site ID to resolve page slugs for. |

### Optional filters

| Parameter       | Type   | Description                                       |
| --------------- | ------ | ------------------------------------------------- |
| `destinationId` | string | Limit results to pages linked to a destination.   |
| `guideId`       | string | Limit results to pages linked to a guide.         |
| `locationId`    | string | Limit results to pages linked to a location/area. |

When no filters are provided, the endpoint returns a full tree of site pages.

## Examples

### Get full site slug tree

```bash theme={null}
curl "https://api.obvlo.com/v2/orgs/YOUR_ORG_ID/sites/YOUR_SITE_ID/page-slug?key=YOUR_API_KEY"
```

### Get matches for a specific guide

```bash theme={null}
curl "https://api.obvlo.com/v2/orgs/YOUR_ORG_ID/sites/YOUR_SITE_ID/page-slug?key=YOUR_API_KEY&destinationId=DESTINATION_ID&guideId=GUIDE_ID"
```

### Example tree response

```json theme={null}
{
  "siteId": "site_123",
  "mode": "tree",
  "tree": [
    {
      "pageId": "root_page",
      "pageType": "Root",
      "slug": "/london/",
      "homepageSlug": "/",
      "segments": ["london"],
      "parentIds": [],
      "destinationId": "destination_123",
      "guideId": null,
      "locationId": null,
      "children": [
        {
          "pageId": "guide_page_1",
          "pageType": "Guide",
          "slug": "/london/food-guide/",
          "homepageSlug": null,
          "segments": ["london", "food-guide"],
          "parentIds": ["root_page"],
          "destinationId": "destination_123",
          "guideId": "guide_789",
          "locationId": null,
          "children": []
        }
      ]
    }
  ]
}
```

### Example filtered response

```json theme={null}
{
  "siteId": "site_123",
  "mode": "matches",
  "matches": [
    {
      "pageId": "guide_page_1",
      "pageType": "Guide",
      "slug": "/london/food-guide/",
      "homepageSlug": null,
      "segments": ["london", "food-guide"],
      "parentIds": ["root_page"],
      "destinationId": "destination_123",
      "guideId": "guide_789",
      "locationId": null
    }
  ]
}
```

## Response notes

* `mode` is `tree` when no filters are supplied.
* `mode` is `matches` when one or more filters are supplied.
* `slug` always includes a leading and trailing slash.
* `slug` and `segments` are returned relative to the microsite root, not the reverse-proxy prefix.
* Root pages include `homepageSlug: "/"`.
* The endpoint returns all matches. It does not pick a single page when multiple pages match.


## OpenAPI

````yaml GET /v2/orgs/{orgId}/sites/{siteId}/page-slug
openapi: 3.0.3
info:
  title: Obvlo Content Engine
  description: Obvlo Content Engine API
  version: 4.0.0
servers:
  - url: https://api.obvlo.com
security: []
paths:
  /v2/orgs/{orgId}/sites/{siteId}/page-slug:
    get:
      tags:
        - V2 Site Data
      description: >-
        Resolve complete persisted page slugs for a site. Without filters,
        returns a full tree. With destinationId, guideId, or locationId filters,
        returns matching page slug entries.
      operationId: v2GetSitePageSlug
      parameters:
        - name: orgId
          in: path
          required: true
          description: Organization Account Number
          schema:
            type: string
        - name: siteId
          in: path
          required: true
          description: Site identifier used to scope page slug resolution
          schema:
            type: string
        - name: destinationId
          in: query
          required: false
          description: >-
            Destination identifier used to resolve destination/root and
            destination-scoped page slugs
          schema:
            type: string
        - name: guideId
          in: query
          required: false
          description: Guide identifier used to fetch listings for a specific guide
          schema:
            type: string
        - name: locationId
          in: query
          required: false
          description: Location identifier used to resolve area page slugs
          schema:
            type: string
      responses:
        '200':
          description: Success
          content:
            application/json:
              schema:
                oneOf:
                  - $ref: '#/components/schemas/SitePageSlugMatchesResponse'
                  - $ref: '#/components/schemas/SitePageSlugTreeResponse'
        '400':
          description: No matches
      security:
        - api_key: []
components:
  schemas:
    SitePageSlugMatchesResponse:
      type: object
      properties:
        siteId:
          type: string
        mode:
          type: string
          enum:
            - matches
        matches:
          type: array
          items:
            $ref: '#/components/schemas/SitePageSlugEntry'
      required:
        - siteId
        - mode
        - matches
      additionalProperties: false
    SitePageSlugTreeResponse:
      type: object
      properties:
        siteId:
          type: string
        mode:
          type: string
          enum:
            - tree
        tree:
          type: array
          items:
            $ref: '#/components/schemas/SitePageSlugTreeEntry'
      required:
        - siteId
        - mode
        - tree
      additionalProperties: false
    SitePageSlugEntry:
      type: object
      properties:
        pageId:
          type: string
        pageType:
          type: string
          enum:
            - Root
            - Destination
            - Guide
            - Area
        slug:
          type: string
        homepageSlug:
          type: string
          nullable: true
        segments:
          type: array
          items:
            type: string
        parentIds:
          type: array
          items:
            type: string
        destinationId:
          type: string
          nullable: true
        guideId:
          type: string
          nullable: true
        locationId:
          type: string
          nullable: true
      required:
        - pageId
        - pageType
        - slug
        - homepageSlug
        - segments
        - parentIds
        - destinationId
        - guideId
        - locationId
      additionalProperties: false
    SitePageSlugTreeEntry:
      allOf:
        - $ref: '#/components/schemas/SitePageSlugEntry'
        - type: object
          properties:
            children:
              type: array
              items:
                $ref: '#/components/schemas/SitePageSlugEntry'
          required:
            - children
          additionalProperties: false
  securitySchemes:
    api_key:
      type: apiKey
      name: key
      in: query

````