---
title: "Create a GEO analysis"
method: POST
path: "/v1/geo/analyses"
tags: ["GEO"]
---

# Create a GEO analysis

`POST /v1/geo/analyses`

## Request

- Base URL: `https://api.jasper.ai`
- URL: `https://api.jasper.ai/v1/geo/analyses`
- Auth: one of:
  - API key in header `X-API-Key`
  - OAuth 2
    - Authorization code: `https://api.jasper.ai/oauth2/authorize`
    - Token URL: `https://api.jasper.ai/oauth2/token` scopes: `user`

Returns `201` with the new analysis. `metadata.credits.cost` quotes the first run.

Queries bill on every run, per provider, so later re-runs of the same settings cost the same.

A network-level retry can otherwise create and bill a second analysis with no way to detect it. Send an `Idempotency-Key` to make retries safe.

## Headers

- `Idempotency-Key` string

## Request body

- CreateGeoAnalysisBodyDto
  - `competitors` CreateGeoCompetitorDto[], required
    - `name` string: Display name. Resolved from the website when omitted.
    - `url` string, uri, required
  - `providers` string[], required: AI providers to query.
  - `scopes` CreateGeoScopeDto[], required: What the analysis may cover. At least one must be `internal`; the analysis website is derived from them.
    - `kind` 'internal' | 'external', required
    - `url` string, uri, required
    - `match` 'page' | 'path_prefix' | 'hostname' | 'hostname_and_subdomains', required: How `url` is matched, as on the analysis `settings.scopes`. An `external` scope only accepts `page`.
  - `topicClusters` CreateGeoTopicClusterDto[], required
    - `topic` string, required
    - `prompts` CreateGeoPromptDto[], required
      - `prompt` string, required
      - `sources` CreateGeoPromptSourceDto[]: Pages you expect AI answers to cite for this prompt. Each must fall within `scopes`.
        - `url` string, uri, required
  - `label` string: Resolved from the website when omitted.
  - `timezone` string, required: IANA timezone.
  - `schedule` 'daily' | 'weekly' | 'monthly' | 'one-off', required: How often the analysis re-runs. `one-off` requires an entitlement.
  - `region` 'US' | 'GB' | 'AU' | 'CA' | 'NZ' | 'IE' | 'ZA' | 'HK' | 'AE', nullable: Country market provider web searches are localized to. Omit or `null` for provider defaults. Requires the `aeo-geo-region` entitlement.

## Response `201`

- GeoAnalysisCreatedResponseDto
  - `requestId` string, required
  - `resource` string, required
  - `data` GeoAnalysisCreatedDto, required
    - `configId` string, required
    - `label` string, required
    - `website` string, required
    - `timezone` string, required: IANA timezone the schedule and each run analysisDate are anchored to.
    - `region` 'US' | 'GB' | 'AU' | 'CA' | 'NZ' | 'IE' | 'ZA' | 'HK' | 'AE', nullable, required: Country market provider web searches are localized to. `null` means provider defaults.
    - `status` union: Schedule status. `null` when the analysis has never been scheduled.
      - GeoAnalysisActiveStatusDto
        - `type` 'active', required
      - GeoAnalysisPausedStatusDto
        - `type` 'paused', required
        - `reason` 'insufficient_credits' | 'user_requested', required: Why updates are paused. Only `user_requested` carries `pausedAt` and `pausedBy`.
        - `pausedAt` string: ISO 8601 timestamp. Present when reason is `user_requested`.
        - `pausedBy` string: ID of the user who paused. Present when reason is `user_requested`.
    - `latestRun` GeoRunSummaryDto
      - `runId` string, required
      - `configId` string: Present on the run history listing. Omitted from an analysis’s `latestRun`, which is already nested under it.
      - `runDate` string, required: Calendar date the run reports on, in the analysis timezone. Not an instant.
      - `createdAt` string, required: ISO 8601 timestamp
      - `updatedAt` string, required: ISO 8601 timestamp
    - `settings` GeoAnalysisSettingsDto
      - `pages` string[], required: Absolute URLs of the pages the run analysed.
      - `competitors` GeoCompetitorDto[], required
        - `name` string, required
        - `url` string, required
      - `providers` string[], required: AI providers the run queried.
      - `topicClusters` GeoTopicClusterSettingDto[]
        - `id` string, required
        - `name` string, required
      - `scopes` union[], required: What the analysis is permitted to cover. Distinct from `pages`, which is what it actually analysed.
        - union
          - GeoInternalScopeDto
            - `kind` 'internal', required
            - `url` string, uri, required
            - `match` 'page' | 'path_prefix' | 'hostname' | 'hostname_and_subdomains', required: How `url` is matched when deciding whether a page is in scope. - `page`: only the page `url` points at. - `path_prefix`: every page under `url`'s path. - `hostname`: every page on `url`'s hostname, excluding subdomains. - `hostname_and_subdomains`: every page on `url`'s hostname and any of its subdomains.
          - GeoExternalScopeDto
            - `kind` 'external', required
            - `url` string, uri, required
            - `match` 'page', required: Always `page`: an external scope covers only the page `url` points at.
    - `schedule` 'daily' | 'weekly' | 'monthly' | 'one-off', required
    - `nextScheduledAnalysisAt` string, nullable, required: ISO 8601 timestamp of the next scheduled run. `null` for a `one-off` analysis, or when unavailable.
    - `topicClusters` GeoCreatedTopicClusterDto[], required: The clusters and prompts as created, with their server-generated ids. This is the only place these ids are returned — keep them if you plan to reference these prompts or clusters again, e.g. on an update.
      - `id` string, uuid, required: Server-generated.
      - `topic` string, required
      - `prompts` GeoCreatedPromptDto[], required
        - `id` string, uuid, required: Server-generated.
        - `prompt` string, required
    - `metadata` GeoCreateMetadataDto
      - `credits` GeoCreditCostDto
        - `cost` number, required: Credits on your workspace plan.

## Other responses

- `402`: Not enough credits for the first run.
- `403`: Not permitted, or not entitled to the requested `schedule` or `region`.
- `409`: The `Idempotency-Key` was already used with a different request body.

## Changes

- **2026-11-03** `3d5be7408661`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/jasper/apis/jasper-api/changes/v1/geo/analyses/post.md)

---

[API](https://skmtc.dev/jasper/apis/jasper-api.md) - [All operations](https://skmtc.dev/jasper/apis/jasper-api/llms.txt) - [OpenAPI document](https://skmtc.dev/jasper/apis/jasper-api/revisions/3d5be7408661?raw)
