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

# List pages in a workspace

> Returns a paginated list of tracked pages in the workspace. Supports text search, category filtering, and sorting.



## OpenAPI

````yaml /api-reference/openapi.json get /v1/workspaces/{workspaceId}/pages
openapi: 3.0.3
info:
  description: >
    The Semji API lets you integrate Semji's AI-powered Content Marketing
    platform into your own tools and workflows. Scale your organic and AI
    visibility programmatically.


    ## Authentication


    All endpoints require a Bearer API key. Generate one from **Settings > API
    Keys** in the Semji app. Each key is scoped to a single user and
    organization.


    ```

    Authorization: Bearer sk_your_api_key_here

    ```


    ## Rate Limiting


    Requests are rate-limited per API key: **1,000 requests per hour**. Rate
    limit headers are included in every response:


    - `X-RateLimit-Limit` — Maximum requests per window

    - `X-RateLimit-Remaining` — Requests remaining

    - `X-RateLimit-Reset` — Seconds until the window resets


    ## Response Format


    All responses return JSON. Collections use a standard envelope:


    ```json

    {
      "data": [...],
      "pagination": { "total": 42, "page": 1, "limit": 25, "hasMore": true }
    }

    ```


    Errors follow a consistent format:


    ```json

    {
      "error": { "code": "not_found", "message": "The requested resource was not found." }
    }

    ```


    ## Core Concepts


    - **Workspace** — A single website you track. Contains pages, contents,
    keywords, and all related analysis data.

    - **Page** — A URL on your website that Semji monitors. Pages are the anchor
    for keywords and content drafts.

    - **Content** — An SEO-optimized article linked to a page. Drafts evolve
    through workflow statuses toward publication.

    - **Content Score** — A 0–100 score measuring how well your content follows
    Semji's SEO recommendations. Aim for 75+ before publishing.

    - **Keyword** — A search term tracked for a page. Analyzing a keyword
    produces SERP-based recommendations (topics, questions, search intents,
    links).

    - **Prompt** — A question users ask AI engines (ChatGPT, Google AI
    Overviews). Analyzing a prompt reveals how to optimize your content for AI
    citations.

    - **Atomic Content** — AI-powered content generation that produces a
    complete SEO-optimized article in one step.
  title: Semji API
  version: 1.0.0
servers: []
security:
  - apiKey: []
tags:
  - description: >-
      Retrieve the authenticated user and their organization, including
      remaining credit balances.
    name: Me
  - description: >-
      List members of the organization linked to the API key, with their roles
      (Admin or Member).
    name: Users
  - description: >-
      A workspace represents a single website you track in Semji. Each workspace
      has its own pages, contents, keywords, folders, and workflow statuses. Use
      these endpoints to list workspaces, view members, and access
      workspace-level configuration.
    name: Workspaces
  - description: >-
      Organize your content into a hierarchical folder structure within a
      workspace. Folders are returned as a flat list — reconstruct the tree
      client-side using `parentFolderId`.
    name: Folders
  - description: >-
      Pages are URLs on your website that Semji tracks for SEO performance.
      Import a URL to start monitoring it, trigger a crawl to fetch its
      metadata, and associate keywords for analysis. Each page can have content
      drafts attached.
    name: Pages
  - description: >-
      Contents are SEO-optimized articles managed through Semji. Create drafts,
      update them with the built-in editor or via the API, track their Content
      Score (0–100), and publish them to your CMS. Use Atomic Content to
      generate a complete optimized article with AI. The `version` field enables
      optimistic locking for concurrent editing.
    name: Contents
  - description: >-
      Track the progress of Atomic Content AI generations. After launching a
      generation via `POST /v1/contents/:id/atomic`, poll the status here. When
      status reaches `review`, confirm to apply the generated content to your
      draft, or cancel to discard it.
    name: Content Generations
  - description: >-
      View the credit consumption history for your organization. Credits are
      consumed by keyword analyses, AI content generation, and content idea
      searches. Each entry details what was consumed, by whom, and in which
      workspace.
    name: Credit Usages
  - description: >-
      Keywords are search terms associated with your pages. Analyzing a keyword
      triggers a SERP analysis that produces actionable SEO recommendations:
      topics to cover, questions to answer, search intents to address, and links
      to add. Use the report endpoint to score any content against these
      recommendations.
    name: Keywords
  - description: >-
      Prompts represent questions that users ask AI engines (ChatGPT, Google AI
      Overviews). Analyzing a prompt reveals which sources and brands are cited
      in AI responses, and produces GEO recommendations to improve your
      content's visibility in AI-generated answers.
    name: Prompts
  - description: >-
      Brand Voices encode your editorial identity for AI-generated content. When
      configured, Atomic Content and AI features automatically adopt your
      writing style, tone, and brand guidelines. Select a brand voice ID in the
      `settings` of `POST /v1/contents/:id/atomic`.
    name: Brand Voices
  - description: >-
      Knowledge Documents are reference materials (text, URLs, or files) that
      enrich AI content generation with your expertise. When knowledge sources
      are enabled in Atomic Content settings, the AI draws from these documents
      to produce more accurate, brand-aligned content.
    name: Knowledge Documents
paths:
  /v1/workspaces/{workspaceId}/pages:
    get:
      tags:
        - Pages
      summary: List pages in a workspace
      description: >-
        Returns a paginated list of tracked pages in the workspace. Supports
        text search, category filtering, and sorting.
      parameters:
        - schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 25
          in: query
          name: limit
          required: false
        - schema:
            type: integer
            minimum: 1
            default: 1
          in: query
          name: page
          required: false
        - schema:
            type: integer
          in: query
          name: contentScore
          required: false
          description: >-
            Content score equals. This score out of 100 measures the SEO quality
            of your online content.
        - schema:
            type: integer
          in: query
          name: contentScore[gte]
          required: false
          description: Content score >= (0-100).
        - schema:
            type: integer
          in: query
          name: contentScore[lte]
          required: false
          description: Content score <= (0-100).
        - schema:
            type: string
          in: query
          name: focusKeyword.keyword
          required: false
          description: >-
            Focus keyword equals. The Focus Keyword is the main keyword on which
            you want to rank your page in Google.
        - schema:
            type: string
          in: query
          name: focusKeyword.keyword[contains]
          required: false
          description: Focus keyword contains the given substring.
        - schema:
            type: integer
          in: query
          name: focusKeyword.position
          required: false
          description: >-
            Focus keyword average position equals. Average position of your page
            on its Focus Keyword over the last 30 days (Search Console).
        - schema:
            type: integer
          in: query
          name: focusKeyword.position[gte]
          required: false
          description: Focus keyword average position >=.
        - schema:
            type: integer
          in: query
          name: focusKeyword.position[lte]
          required: false
          description: Focus keyword average position <=.
        - schema:
            type: integer
          in: query
          name: focusKeyword.searchVolume
          required: false
          description: >-
            Focus keyword monthly search volume equals. Average number of
            monthly searches calculated on the last 12 months.
        - schema:
            type: integer
          in: query
          name: focusKeyword.searchVolume[gte]
          required: false
          description: Focus keyword monthly search volume >=.
        - schema:
            type: integer
          in: query
          name: focusKeyword.searchVolume[lte]
          required: false
          description: Focus keyword monthly search volume <=.
        - schema:
            type: string
          in: query
          name: importedAt
          required: false
          description: Imported on this date (ISO 8601).
        - schema:
            type: string
          in: query
          name: importedAt[after]
          required: false
          description: Imported on or after (ISO 8601).
        - schema:
            type: string
          in: query
          name: importedAt[before]
          required: false
          description: Imported on or before (ISO 8601).
        - schema:
            type: string
          in: query
          name: lastPublishedAt
          required: false
          description: Last published on this date (ISO 8601).
        - schema:
            type: string
          in: query
          name: lastPublishedAt[after]
          required: false
          description: Last published on or after (ISO 8601).
        - schema:
            type: string
          in: query
          name: lastPublishedAt[before]
          required: false
          description: Last published on or before (ISO 8601).
        - schema:
            type: integer
          in: query
          name: lastStatusCode
          required: false
          description: Filter by latest HTTP status code (e.g. 404).
        - schema:
            type: integer
          in: query
          name: monthlyClicks
          required: false
          description: >-
            Monthly clicks equals. Clicks generated by your Pages in the last 30
            days for all Countries (Search Console).
        - schema:
            type: integer
          in: query
          name: monthlyClicks[gte]
          required: false
          description: Monthly clicks >=.
        - schema:
            type: integer
          in: query
          name: monthlyClicks[lte]
          required: false
          description: Monthly clicks <=.
        - schema:
            type: integer
          in: query
          name: monthlyConversions
          required: false
          description: >-
            Monthly conversions equals. Conversions generated by your pages over
            the last 30 days.
        - schema:
            type: integer
          in: query
          name: monthlyConversions[gte]
          required: false
          description: Monthly conversions >=.
        - schema:
            type: integer
          in: query
          name: monthlyConversions[lte]
          required: false
          description: Monthly conversions <=.
        - schema:
            type: number
          in: query
          name: monthlyRevenue
          required: false
          description: >-
            Monthly revenue equals. Revenue generated by your pages over the
            last 30 days.
        - schema:
            type: number
          in: query
          name: monthlyRevenue[gte]
          required: false
          description: Monthly revenue >=.
        - schema:
            type: number
          in: query
          name: monthlyRevenue[lte]
          required: false
          description: Monthly revenue <=.
        - schema:
            type: integer
          in: query
          name: monthlyTransactions
          required: false
          description: >-
            Monthly transactions equals. Transactions generated by your pages in
            the last 30 days for all countries.
        - schema:
            type: integer
          in: query
          name: monthlyTransactions[gte]
          required: false
          description: Monthly transactions >=.
        - schema:
            type: integer
          in: query
          name: monthlyTransactions[lte]
          required: false
          description: Monthly transactions <=.
        - schema:
            type: string
          in: query
          name: q
          required: false
          description: Full-text search over title, url and focus keyword.
        - schema:
            type: string
            enum:
              - '-importedAt'
              - importedAt
              - '-contentScore'
              - contentScore
              - title
              - '-title'
              - '-lastPublishedAt'
              - lastPublishedAt
              - '-monthlyClicks'
              - monthlyClicks
              - '-monthlyConversions'
              - monthlyConversions
              - '-monthlyTransactions'
              - monthlyTransactions
              - '-monthlyRevenue'
              - monthlyRevenue
              - '-focusKeyword.keyword'
              - focusKeyword.keyword
              - '-focusKeyword.position'
              - focusKeyword.position
              - '-focusKeyword.searchVolume'
              - focusKeyword.searchVolume
            default: '-importedAt'
          in: query
          name: sort
          required: false
          description: Sort field. Prefix with - for descending.
        - schema:
            type: string
          in: query
          name: title
          required: false
          description: Title equals.
        - schema:
            type: string
          in: query
          name: title[contains]
          required: false
          description: Title contains the given substring.
        - schema:
            type: string
          in: query
          name: url
          required: false
          description: URL equals.
        - schema:
            type: string
          in: query
          name: url[contains]
          required: false
          description: URL contains the given substring.
        - schema:
            anyOf:
              - type: array
                items:
                  type: string
                  enum:
                    - misc
                    - forum
                    - article
                    - news
                    - article_category
                    - ecommerce_products_listing
                    - ecommerce_product_page
                    - landing_page
                    - tool
                    - homepage
                    - local
                    - video
              - type: string
                enum:
                  - misc
                  - forum
                  - article
                  - news
                  - article_category
                  - ecommerce_products_listing
                  - ecommerce_product_page
                  - landing_page
                  - tool
                  - homepage
                  - local
                  - video
          in: query
          name: urlCategory
          required: false
          description: 'Filter by URL category. Multiple: ?urlCategory[]=a&urlCategory[]=b.'
        - schema:
            type: string
          in: path
          name: workspaceId
          required: true
          description: Workspace ID.
      responses:
        '200':
          description: Default Response
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        contentRetrievedAt:
                          type: string
                          nullable: true
                          description: >-
                            ISO 8601 date of the last successful content
                            extraction.
                        contentScore:
                          type: integer
                          nullable: true
                          description: >-
                            This score out of 100 measures the SEO quality of
                            your online content.
                        extractedContentHtml:
                          type: string
                          nullable: true
                          description: >-
                            Cleaned HTML of the main content extracted from the
                            crawled page.
                        focusKeyword:
                          type: object
                          properties:
                            id:
                              type: string
                            keyword:
                              type: string
                              description: >-
                                The Focus Keyword is the main keyword on which
                                you want to rank your page in Google.
                            position:
                              type: integer
                              nullable: true
                              description: >-
                                Average position of your page on its Focus
                                Keyword over the last 30 days (Search Console).
                            searchVolume:
                              type: integer
                              nullable: true
                              description: >-
                                Average number of monthly searches for the Focus
                                Keyword calculated on the last 12 months.
                          required:
                            - id
                            - keyword
                            - position
                            - searchVolume
                          additionalProperties: false
                          nullable: true
                          description: Focus keyword linked to this page.
                        id:
                          type: string
                          description: Unique identifier of the page.
                        importedAt:
                          type: string
                          description: Import date of the page (ISO 8601).
                        lastPublishedAt:
                          type: string
                          nullable: true
                          description: Date of the last publication (ISO 8601).
                        lastStatusCode:
                          type: integer
                          nullable: true
                          description: HTTP status code of the latest crawl.
                        metaDescription:
                          type: string
                          nullable: true
                          description: Meta description.
                        monthlyClicks:
                          type: integer
                          nullable: true
                          description: >-
                            Monthly Clicks generated by your Pages in the last
                            30 days for all Countries (Search Console).
                        monthlyConversions:
                          type: integer
                          nullable: true
                          description: >-
                            Monthly conversions generated by your pages over the
                            last 30 days.
                        monthlyRevenue:
                          type: number
                          nullable: true
                          description: >-
                            Monthly revenue generated by your pages over the
                            last 30 days.
                        monthlyTransactions:
                          type: integer
                          nullable: true
                          description: >-
                            Monthly transactions generated by your pages in the
                            last 30 days for all countries.
                        title:
                          type: string
                          nullable: true
                          description: HTML title.
                        url:
                          type: string
                          description: Full URL.
                        urlCategory:
                          type: string
                          enum:
                            - misc
                            - forum
                            - article
                            - news
                            - article_category
                            - ecommerce_products_listing
                            - ecommerce_product_page
                            - landing_page
                            - tool
                            - homepage
                            - local
                            - video
                          nullable: true
                          description: >-
                            URL classification computed by the backend
                            (LLM-based).
                        wordsCount:
                          type: integer
                          nullable: true
                          description: Word count.
                      required:
                        - contentRetrievedAt
                        - contentScore
                        - extractedContentHtml
                        - focusKeyword
                        - id
                        - importedAt
                        - lastPublishedAt
                        - lastStatusCode
                        - metaDescription
                        - monthlyClicks
                        - monthlyConversions
                        - monthlyRevenue
                        - monthlyTransactions
                        - title
                        - url
                        - urlCategory
                        - wordsCount
                      additionalProperties: false
                  pagination:
                    type: object
                    properties:
                      hasMore:
                        type: boolean
                      limit:
                        type: integer
                      page:
                        type: integer
                      total:
                        type: integer
                    required:
                      - hasMore
                      - limit
                      - page
                      - total
                    additionalProperties: false
                required:
                  - data
                  - pagination
                additionalProperties: false
components:
  securitySchemes:
    apiKey:
      bearerFormat: API Key
      description: API key starting with `sk_`. Generate one in **Settings > API Keys**.
      scheme: bearer
      type: http

````