---
title: "Generate content or update briefs (blog, LinkedIn, thread)"
method: POST
path: "/v1/generate-content"
tags: ["Content"]
---

# Generate content or update briefs (blog, LinkedIn, thread)

`POST /v1/generate-content`

## Request

- Base URL: `https://www.seoforgpt.io/api`
- URL: `https://www.seoforgpt.io/api/v1/generate-content`
- Auth: HTTP bearer

Generates content from project context. For expand-vs-new decisions, call /v1/projects/{projectId}/content-suggestions first and pass its metadata into this route. Direct generation does not decide whether an existing owned page should be expanded.

## Request body

- object
  - `projectId` string, uuid, required
  - `platform` 'blog' | 'linkedin' | 'thread', required
  - `topic` string, required
  - `metadata` object: Optional user-facing generation metadata. Unknown keys are ignored. For existing-page update briefs, include content_action=optimize_existing_url plus target_url and target_title from content-suggestions.
    - `audience` string
    - `type` string
    - `length` string
    - `content_action` 'new_article' | 'optimize_existing_url'
    - `contentAction` 'new_article' | 'optimize_existing_url'
    - `target_url` string, nullable
    - `targetUrl` string, nullable
    - `target_title` string, nullable
    - `targetTitle` string, nullable
    - `content_type` string, nullable
    - `contentType` string, nullable

## Response `200`

OK

- GenerateContentResponse
  - `data` object
    - `id` string, nullable
    - `status` string
    - `message` string
    - `report_url` string, nullable
    - `context_quality` 'full' | 'limited'
    - `context_message` string
  - `meta` BillingMeta: Plan and quota snapshot (shape may evolve)

## Other responses

- `400`: Invalid input
- `401`: Missing or invalid bearer token
- `402`: Billing or quota gate
- `429`: Rate limit exceeded. Responses include the current IETF `RateLimit` and `RateLimit-Policy` structured fields, compatibility `RateLimit-*` and `X-RateLimit-*` fields, and `Retry-After` on 429.
- `500`: Server error
- `default`: Any documented or unexpected 4xx or 5xx response uses the same typed error envelope.

---

[API](https://skmtc.dev/seoforgpt/apis/seoforgpt-public-api.md) · [All operations](https://skmtc.dev/seoforgpt/apis/seoforgpt-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/seoforgpt/apis/seoforgpt-public-api/revisions/d90da8f1ea73?raw)
