---
title: "Generate GEO personas"
method: POST
path: "/v1/projects/{projectId}/geo/personas/generate"
tags: ["GEO"]
---

# Generate GEO personas

`POST /v1/projects/{projectId}/geo/personas/generate`

## Request

- Base URL: `https://api.usenotra.com`
- URL: `https://api.usenotra.com/v1/projects/{projectId}/geo/personas/generate`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/usenotra/apis/notra-api/docs/v1/projects/:projectId/geo/personas/generate/post.ts> (a function with typed inputs; its response is checked against the schema)

Starts AI persona generation in the background and uses AI credits. With no body it creates a full set from the project's brand, prompts and competitors; `brief` adds one persona; `personaId` regenerates one in place (with `promptsOnly`, only its conversation prompts). Only one job runs per project: while one is running, this returns that job instead of starting another. Poll `GET /v1/projects/{projectId}/geo/personas/generation` until `status` is `completed` or `failed`, then list the personas.

## Path parameters

- `projectId` string, required

## Request body

- GenerateGeoPersonasRequest
  - `personaId` string: Regenerate this persona in place instead of creating a new set.
  - `brief` string: Describe one persona to add, such as 'a CFO at a 200-person logistics company'.
  - `promptsOnly` true: With personaId, only rewrite its conversation prompts and keep its details.

## Response `202`

Generation job queued or already running

- GeoPersonaGenerationResponse
  - `job` GeoPersonaGenerationJob, nullable, required: The project's latest generation job, or `null` when none ran recently.
    - `id` string, required
    - `status` 'queued' | 'running' | 'completed' | 'failed', required
    - `personaId` string, nullable, required
    - `startedAt` string, required
    - `error` string, nullable, required
  - `organization` object, required
    - `id` string, required
    - `slug` string, required
    - `name` string, required
    - `logo` string, nullable, required

## Other responses

- `400`: Invalid request
- `401`: Missing or invalid API key
- `402`: GEO plan or available AI credits required
- `403`: Forbidden
- `404`: Organization, project or resource not found
- `409`: Conflict
- `429`: Rate limit exceeded. This endpoint allows 5 requests per 10 minutes per organization.
- `500`: Internal server error
- `503`: Authentication or billing service unavailable

## Changes

- **2026-11-05** `200d2ac38976`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/usenotra/apis/notra-api/changes/v1/projects/:projectId/geo/personas/generate/post.md)

---

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