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

# Track External URLs

> Register existing pages or third-party URLs as tracked Content Hub items so Athena attributes citations and mentions to them. Creates external content rows from bare URLs with no generation and no credit cost. Tracking starts immediately: the normalized URL becomes the citation/metric join key, so pages cited in the website's monitored AI responses accrue metrics with no publish step (use it for guest posts, partner placements, or any page Athena did not generate). Idempotent per URL: a URL already present on the website (any content type) is not duplicated; the response lists it under skipped with the existing content_id and type. Check that type before chaining destructive calls (a skip can resolve to first-party generated content that shares the URL). Rows are created without page text, which citation tracking does not need; the body can be filled from the app later. Duplicate URLs within one call (including tracking-param variants of the same page) collapse to one row, first occurrence wins. Optional sheet_id files rows under a Content Hub tab; view-type tabs resolve to the main pool (null), echoed per row.



## OpenAPI

````yaml /api-reference/openapi.json post /api/v1/content/track
openapi: 3.1.0
info:
  title: AthenaHQ API
  description: >-
    AthenaHQ API provides programmatic access to manage your websites and
    prompts for AI-powered content optimization.
  version: 1.0.0
  contact:
    email: support@athenahq.ai
servers:
  - url: https://api.athenahq.ai
    description: Production server
security:
  - apiKey: []
tags:
  - name: Basics
    description: Core API operations for managing websites and prompts
  - name: Metrics
    description: Metrics and analytics endpoints for tracking AI visibility
  - name: Billing
    description: Billing and credits endpoints for managing usage
  - name: Team Management
    description: Endpoints for managing team members and invitations
  - name: Groups
    description: Endpoints for managing groups of websites
  - name: Content
    description: >-
      Endpoints for accessing Content Hub data — tabs, tracked URLs, and per-URL
      prompt breakdowns.
  - name: Pitch Workspace
    description: >-
      Endpoints for accessing pitch workspace reports — org-scoped pitch runs
      with competitors, prompts, attributes, and aggregate metrics.
  - name: Knowledge Base
    description: >-
      Endpoints for reading the brand Knowledge Base — approved brand facts and
      the pillars that organize them.
paths:
  /api/v1/content/track:
    post:
      tags:
        - Content
      summary: Track External URLs
      description: >-
        Register existing pages or third-party URLs as tracked Content Hub items
        so Athena attributes citations and mentions to them. Creates external
        content rows from bare URLs with no generation and no credit cost.
        Tracking starts immediately: the normalized URL becomes the
        citation/metric join key, so pages cited in the website's monitored AI
        responses accrue metrics with no publish step (use it for guest posts,
        partner placements, or any page Athena did not generate). Idempotent per
        URL: a URL already present on the website (any content type) is not
        duplicated; the response lists it under skipped with the existing
        content_id and type. Check that type before chaining destructive calls
        (a skip can resolve to first-party generated content that shares the
        URL). Rows are created without page text, which citation tracking does
        not need; the body can be filled from the app later. Duplicate URLs
        within one call (including tracking-param variants of the same page)
        collapse to one row, first occurrence wins. Optional sheet_id files rows
        under a Content Hub tab; view-type tabs resolve to the main pool (null),
        echoed per row.
      operationId: content.track_urls
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                website_id:
                  type: string
                  description: The website to track the URLs on.
                urls:
                  type: array
                  minItems: 1
                  maxItems: 500
                  description: >-
                    Pages to track. A bare domain path like acme.com/blog/post
                    is fine; the protocol is stripped on store.
                  items:
                    type: object
                    properties:
                      url:
                        type: string
                        minLength: 1
                        maxLength: 2048
                      title:
                        type: string
                        minLength: 1
                        maxLength: 500
                        description: >-
                          Optional display title. Omitted: derived from the URL
                          slug.
                    required:
                      - url
                sheet_id:
                  type: string
                  nullable: true
                  description: >-
                    Content Hub tab to file the new rows under. View-type tabs
                    resolve to the main pool (null).
              required:
                - website_id
                - urls
      responses:
        '201':
          description: >-
            Created. Also returned when every URL was already tracked
            (idempotent success with created_count 0).
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                  created_count:
                    type: number
                  skipped_count:
                    type: number
                  created:
                    type: array
                    items:
                      type: object
                      properties:
                        content_id:
                          type: string
                        url:
                          type: string
                          description: The stored, protocol-less URL (display form).
                        sheet_id:
                          type: string
                          nullable: true
                      required:
                        - content_id
                        - url
                        - sheet_id
                  skipped:
                    type: array
                    items:
                      type: object
                      properties:
                        content_id:
                          type: string
                          description: The already-existing row this input URL resolved to.
                        url:
                          type: string
                          description: The cleaned input URL that was skipped.
                        type:
                          type: string
                          description: >-
                            The existing row's content type. external/imported
                            means the URL was already tracked; any other value
                            (draft, snipe, ...) means it collided with
                            first-party generated content sharing the join key -
                            check before chaining destructive calls.
                        sheet_id:
                          type: string
                          nullable: true
                      required:
                        - content_id
                        - url
                        - type
                        - sheet_id
                required:
                  - success
                  - created_count
                  - skipped_count
                  - created
                  - skipped
        '400':
          description: >-
            Bad Request: validation failed (invalid URL in the batch, or
            sheet_id not on this website; nothing is written)
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '401':
          description: Unauthenticated
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '404':
          description: Not Found
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '429':
          description: Rate Limited
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
        '500':
          description: Internal Error
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                required:
                  - error
      security:
        - ApiKeyAuth: []
components:
  securitySchemes:
    apiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API key for authentication. You can create one
        [here](https://app.athenahq.ai/organization?tab=api).

````