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

# Get All Projects

> Get all projects that have geo presence tracking enabled. ALWAYS call this
first — every other tool needs a `project_id`, and this is the only place to get one.

**Example:** "List my projects to get `project_id` values for other endpoints."

Only returns projects where a geo presence site has been configured. Projects without tracking setup are excluded.

**Filters:** optional `query` (substring on name/url). **Pagination:** `limit` (1-100, default 50) + `offset`; projects are sorted by creation date (newest first).

**Response:** `data` array (each item has `id`, `name`, `url`, `created_at`, `type`) plus `total` (matches before paging), `limit`, `offset`. If `total` > items returned, page with `offset` — or narrow with `query`.

**What `project_id` is and how to use it (read carefully):**
- The `id` field of a project IS its `project_id`. It is a UUID like
  `699aacd8-f75d-41b9-9fa8-7dde1bd82d02` — NOT the `name` or `url`.
- Steps: (1) find the project whose `name`/`url` matches the user's request,
  (2) take that project's `id` value verbatim, (3) pass it as the `project_id`
  argument on EVERY later tool call this conversation (reports, prompts,
  citations, sentiment, writes).
- Resolve it ONCE and REUSE the same `id` — do not re-list projects or change
  it unless the user switches projects.
- You already have the id from this response: NEVER stop to ask the user for
  the project id, and never treat a project's `name` or `url` as the id.
- If exactly one project is returned, use its `id` directly without asking.

**TIP:** when you only need one project's id (e.g. the user named a brand or
domain), pass the `query` argument (that brand/domain) — it returns just the
matching project(s), so the list stays short and the `id` is always visible.



## OpenAPI

````yaml https://api.writesonic.com/v1/oauth/openapi.json?client_secret=FgwCVph3cjZy0KPsvsuU post /v2/geo/business/projects
openapi: 3.1.0
info:
  title: Writesonic Docs
  description: >-
    This is the documentation for Writesonic's API. To be able to test the API,
    please register an account and request an api key at
    [Writesonic](https://writesonic.com). <br/> Please check out the tutorials
    section for more information<br/>   <ul> <li> [Find your API
    key](../docs/Find%20Api%20Key) </li> <li>  [Test an
    endpoint](../docs/Test%20An%20Endpoint)</li>  </ul> <p> Writesonic API has
    been upgraded to V2(beta) version. [Click here to read V2 docs
    (beta)](../api-docs/v2.html) <br/> Note - as all APIs are
    backwards-compatible, old endpoints will not be impacted by this change.
    </p> For any queries write us to at support@writesonic.com  
  contact:
    email: support@writesonic.com
  version: '1.0'
servers:
  - url: https://api.writesonic.com
    description: Production
security: []
tags:
  - name: Action Center
  - name: Brand Radar Reports
  - name: Citation Analytics
  - name: Generic
  - name: Per-Prompt Analytics
  - name: Project Configuration
  - name: Prompt Explorer
  - name: Prompts All
  - name: Prompts Overview
  - name: Reports
  - name: Research Page Tracker
  - name: Research Page Tracker Portfolio
  - name: Tags
  - name: GEO Presence Sentiment
paths:
  /v2/geo/business/projects:
    post:
      tags:
        - Geo Presence API V2
        - Generic
        - EXPOSE_TO_PUBLIC
      summary: Get All Projects
      description: >-
        Get all projects that have geo presence tracking enabled. ALWAYS call
        this

        first — every other tool needs a `project_id`, and this is the only
        place to get one.


        **Example:** "List my projects to get `project_id` values for other
        endpoints."


        Only returns projects where a geo presence site has been configured.
        Projects without tracking setup are excluded.


        **Filters:** optional `query` (substring on name/url). **Pagination:**
        `limit` (1-100, default 50) + `offset`; projects are sorted by creation
        date (newest first).


        **Response:** `data` array (each item has `id`, `name`, `url`,
        `created_at`, `type`) plus `total` (matches before paging), `limit`,
        `offset`. If `total` > items returned, page with `offset` — or narrow
        with `query`.


        **What `project_id` is and how to use it (read carefully):**

        - The `id` field of a project IS its `project_id`. It is a UUID like
          `699aacd8-f75d-41b9-9fa8-7dde1bd82d02` — NOT the `name` or `url`.
        - Steps: (1) find the project whose `name`/`url` matches the user's
        request,
          (2) take that project's `id` value verbatim, (3) pass it as the `project_id`
          argument on EVERY later tool call this conversation (reports, prompts,
          citations, sentiment, writes).
        - Resolve it ONCE and REUSE the same `id` — do not re-list projects or
        change
          it unless the user switches projects.
        - You already have the id from this response: NEVER stop to ask the user
        for
          the project id, and never treat a project's `name` or `url` as the id.
        - If exactly one project is returned, use its `id` directly without
        asking.


        **TIP:** when you only need one project's id (e.g. the user named a
        brand or

        domain), pass the `query` argument (that brand/domain) — it returns just
        the

        matching project(s), so the list stays short and the `id` is always
        visible.
      operationId: get_all_project_reports
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GetAllProjectsRequest'
              default:
                limit: 50
                offset: 0
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAllProjectsResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - APIKeyHeader: []
components:
  schemas:
    GetAllProjectsRequest:
      properties:
        query:
          type: string
          title: Query
          description: >-
            Case-insensitive substring matched against project `name` or `url`.
            Pass the brand/domain the user mentioned (e.g. 'writesonic') to get
            just the matching project(s) — recommended when you only need one
            project's id, as it keeps the response small.
        limit:
          type: integer
          maximum: 100
          minimum: 1
          title: Limit
          description: Max projects to return (1-100).
          default: 50
        offset:
          type: integer
          minimum: 0
          title: Offset
          description: Number of projects to skip, for paging.
          default: 0
      type: object
      title: GetAllProjectsRequest
      description: Request parameters for retrieving all projects. All optional.
    GetAllProjectsResponse:
      properties:
        data:
          items:
            $ref: '#/components/schemas/ProjectDataItem'
          type: array
          title: Data
          description: Array of project data items
        total:
          type: integer
          title: Total
          description: Total projects matching the query (before limit/offset).
          default: 0
        limit:
          type: integer
          title: Limit
          description: Applied page size.
          default: 50
        offset:
          type: integer
          title: Offset
          description: Applied offset.
          default: 0
      type: object
      required:
        - data
      title: GetAllProjectsResponse
      description: Response containing project data.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ProjectDataItem:
      properties:
        id:
          type: string
          format: uuid
          title: Id
          description: Unique identifier of the project
        name:
          type: string
          title: Name
          description: Display name of the project
        url:
          type: string
          title: Url
          description: Primary website URL associated with the project
        created_at:
          type: string
          format: date-time
          title: Created At
          description: Timestamp when the project was created
        type:
          $ref: '#/components/schemas/ProjectType'
          description: 'Project type: STANDARD or PITCH (agency Pitch workspace)'
          default: STANDARD
      type: object
      required:
        - id
        - name
        - url
        - created_at
      title: ProjectDataItem
      description: Data for a single project.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    ProjectType:
      type: string
      enum:
        - STANDARD
        - PITCH
      title: ProjectType
      description: >-
        Project type enumeration defining the nature of the project.


        - STANDARD: Regular project type

        - PITCH: Pitch-workspace project type (for GEO presence onboarding of
        Agencies)
  securitySchemes:
    APIKeyHeader:
      type: apiKey
      in: header
      name: X-API-KEY

````