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

# Fetch a page as text

> Fetches one public URL and returns its main content as markdown. That is the whole response: `{ "markdown": "# ..." }`. Two providers are tried in turn, so pages that block the first one (Reddit, most notably) still come back, and which one answered is not something the caller has to care about. Costs credits at a flat rate per fetch however many providers it took, charged whenever a page comes back. Use it to settle a specific question rather than to crawl: one page, one charge. Returns 402 when the workspace has none left.



## OpenAPI

````yaml https://api.rankspot.ai/docs-json post /v1/research/fetch
openapi: 3.0.0
info:
  title: RankSpot Public API
  description: >-
    The RankSpot Public API gives you programmatic access to your workspace data
    — keywords, backlinks, competitors, planned actions, articles, and more.


    ## Authentication


    All endpoints require a Bearer API key in the `Authorization` header:


    ```

    Authorization: Bearer <your-api-key>

    ```


    Generate API keys from **Settings → API Keys** in the RankSpot dashboard.
    Each key is scoped to a single workspace.


    ## Pagination


    List endpoints return a consistent envelope:


    ```json

    {
      "data": {
        "total": 120,
        "offset": 0,
        "limit": 20,
        "count": 20,
        "items": [...]
      }
    }

    ```


    Use `offset` and `limit` query parameters to paginate. Default limit is
    **20**, maximum is **100**.


    ## Status codes


    | Code | Meaning |

    |------|---------|

    | 200  | Success |

    | 201  | Created |

    | 204  | No content (delete / unarchive) |

    | 400  | Validation error or business rule violation |

    | 401  | Missing or invalid API key |

    | 404  | Resource not found or belongs to another workspace |
  version: '1.0'
  contact: {}
servers:
  - url: https://api.rankspot.ai
    description: Production
security: []
tags:
  - name: AI Visibility
    description: >-
      How AI answer engines see your brand. Track prompts, read the answers
      ChatGPT, Perplexity and Google gave, and work through the pages they
      cited. Prompts are run on a daily schedule by RankSpot, so answers appear
      after the next run rather than on demand.
  - name: Articles
    description: >-
      AI-generated blog articles. Articles are created automatically when a
      `write_article` action is sent to generation — they cannot be created
      directly via the API.
  - name: Backlinks
    description: >-
      Backlinks discovered for your domain and your competitors' domains.
      Backlinks are auto-synced on a background interval and cannot be created
      via the API.
  - name: Categories
    description: Categories for organising actions and articles within your workspace.
  - name: Competitors
    description: >-
      Competitor domains tracked in your workspace. Once added, keywords and
      backlinks for each competitor are fetched asynchronously on a background
      sync interval.
  - name: Forum Opportunities
    description: >-
      Forum threads and community posts surfaced as potential link-building or
      engagement opportunities.
  - name: Keywords
    description: >-
      SEO keywords tracked in your workspace, enriched with search volume,
      competition, and AI-generated relevance scores.
  - name: People Also Ask
    description: >-
      "People also ask" questions discovered from search results for your
      tracked keywords.
  - name: Actions
    description: >-
      The SEO work planned for your workspace. Each action carries a `type`
      saying what kind of work it is and which target it points at — see `POST
      /v1/actions` for the full list. Only `write_article` can be turned into an
      article; the rest are a person's job. Create actions yourself or let
      RankSpot generate them.
  - name: Research
    description: >-
      Live lookups against the open web: a Google search and a page fetch. The
      only endpoints here that spend credits per call. Neither response reports
      what it cost — the charge is real, and your remaining balance is visible
      in the RankSpot dashboard. Returns 402 when the workspace is out of
      credits.
  - name: Search Console
    description: >-
      Google Search Console performance data — clicks, impressions, CTR, and
      average position for your connected property. Requires GSC to be connected
      from the RankSpot dashboard.
  - name: Workspace
    description: >-
      Who the workspace is: brand, domain, what the business does and who it
      sells to. Read this first — the rest of the API returns opportunities that
      only mean something in the context of a particular business.
paths:
  /v1/research/fetch:
    post:
      tags:
        - Research
      summary: Fetch a page as text
      description: >-
        Fetches one public URL and returns its main content as markdown. That is
        the whole response: `{ "markdown": "# ..." }`. Two providers are tried
        in turn, so pages that block the first one (Reddit, most notably) still
        come back, and which one answered is not something the caller has to
        care about. Costs credits at a flat rate per fetch however many
        providers it took, charged whenever a page comes back. Use it to settle
        a specific question rather than to crawl: one page, one charge. Returns
        402 when the workspace has none left.
      operationId: ResearchController_fetch
      parameters: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/FetchPageDto'
      responses:
        '201':
          description: ''
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FetchPageResultDto'
        '402':
          description: >-
            `ai-credits-exhausted` — no AI credits left this billing period. The
            body carries `usage` with the counts behind that.
        '503':
          description: No provider could read the page. Nothing is charged for it.
      security:
        - bearer: []
components:
  schemas:
    FetchPageDto:
      type: object
      properties:
        url:
          type: string
          example: https://example.com/blog/post
          description: The page to fetch. Must be a public http(s) URL.
      required:
        - url
    FetchPageResultDto:
      type: object
      properties:
        markdown:
          type: string
          example: |-
            # Best screen recorders for Mac

            If you are looking for...
          description: >-
            The page as markdown, main content only. Never empty: a page that
            extracts to nothing is a 503, not a successful fetch of "".
      required:
        - markdown
  securitySchemes:
    bearer:
      scheme: bearer
      bearerFormat: JWT
      type: http

````