Appearance
website-seo
74 endpoints.
GET /api/v1/settings/website/seo/websites
List Websites
200 — Successful Response
json
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array",
"title": "Response List Websites Api V1 Settings Website Seo Websites Get"
}POST /api/v1/settings/website/seo/websites
Create Website
Request body
json
{
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"title": "Name"
},
"url": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"title": "Url"
},
"status": {
"type": "integer",
"title": "Status",
"default": 1
}
},
"type": "object",
"required": [
"name",
"url"
],
"title": "WebsiteIn"
}201 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Create Website Api V1 Settings Website Seo Websites Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PATCH /api/v1/settings/website/seo/websites/{website_id}
Update Website
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | path | yes | string |
Request body
json
{
"properties": {
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"title": "Name"
},
"url": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"title": "Url"
},
"status": {
"type": "integer",
"title": "Status",
"default": 1
}
},
"type": "object",
"required": [
"name",
"url"
],
"title": "WebsiteIn"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Update Website Api V1 Settings Website Seo Websites Website Id Patch"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/settings/website/seo/websites/{website_id}
Delete Website
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | path | yes | string |
204 — Successful Response
422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/keywords
List Keywords
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response List Keywords Api V1 Settings Website Seo Keywords Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/keywords
Create Keyword
Request body
json
{
"properties": {
"website_id": {
"type": "string",
"title": "Website Id"
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"title": "Name"
},
"lang_code": {
"type": "string",
"title": "Lang Code",
"default": "en"
},
"country_code": {
"type": "string",
"title": "Country Code",
"default": "za"
},
"status": {
"type": "integer",
"title": "Status",
"default": 1
}
},
"type": "object",
"required": [
"website_id",
"name"
],
"title": "KeywordIn"
}201 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Create Keyword Api V1 Settings Website Seo Keywords Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/keywords/bulk
Create Keywords Bulk
Add many keywords to a website at once (one per line/comma in the UI).
Request body
json
{
"properties": {
"website_id": {
"type": "string",
"title": "Website Id"
},
"keywords": {
"items": {
"type": "string"
},
"type": "array",
"title": "Keywords"
},
"lang_code": {
"type": "string",
"title": "Lang Code",
"default": "en"
},
"country_code": {
"type": "string",
"title": "Country Code",
"default": "za"
}
},
"type": "object",
"required": [
"website_id",
"keywords"
],
"title": "KeywordsBulkIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Create Keywords Bulk Api V1 Settings Website Seo Keywords Bulk Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/settings/website/seo/keywords/{keyword_id}
Delete Keyword
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
keyword_id | path | yes | string |
204 — Successful Response
422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/engines
List Engines
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response List Engines Api V1 Settings Website Seo Engines Get"
}GET /api/v1/settings/website/seo/ranks
List Ranks
Latest rank per keyword (the cached last_rank), for the Rank Tracking tab.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response List Ranks Api V1 Settings Website Seo Ranks Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/keywords/{keyword_id}/history
Rank History
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
keyword_id | path | yes | string |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response Rank History Api V1 Settings Website Seo Keywords Keyword Id History Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/ranks/run
Run Rank
Check current rankings for the given keywords on an engine, now.
Request body
json
{
"properties": {
"keyword_ids": {
"items": {
"type": "string"
},
"type": "array",
"title": "Keyword Ids"
},
"engine_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Engine Id"
},
"mode": {
"type": "string",
"title": "Mode",
"default": "live"
}
},
"type": "object",
"required": [
"keyword_ids"
],
"title": "RankRunIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Run Rank Api V1 Settings Website Seo Ranks Run Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/ranks/collect
Collect Ranks
Collect any finished queued DataForSEO rank tasks now.
The daily scheduled pass does this too; the endpoint exists so a queued batch can be pulled in without waiting for tomorrow morning.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Collect Ranks Api V1 Settings Website Seo Ranks Collect Post"
}GET /api/v1/settings/website/seo/ranks/trends
Rank Trends
Current rank, rank days ago, and the movement between them.
The rank history table has been written since the feature shipped but was never read back — position alone cannot distinguish a keyword that climbed from 40 to 11 from one that has sat at 11 all month.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no | ||
days | query | no | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Rank Trends Api V1 Settings Website Seo Ranks Trends Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/listings
List Listings
200 — Successful Response
json
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array",
"title": "Response List Listings Api V1 Settings Website Seo Listings Get"
}POST /api/v1/settings/website/seo/listings
Create Listing
Request body
json
{
"properties": {
"business_name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"title": "Business Name"
},
"website_url": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"title": "Website Url"
}
},
"type": "object",
"required": [
"business_name",
"website_url"
],
"title": "ListingIn"
}201 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Create Listing Api V1 Settings Website Seo Listings Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/listings/{listing_id}
Get Listing
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Get Listing Api V1 Settings Website Seo Listings Listing Id Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/settings/website/seo/listings/{listing_id}
Delete Listing
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
204 — Successful Response
422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/listings/{listing_id}/check-metadata
Check Listing Metadata
Fetch the listing's website and score its listing-readiness (title/meta/OG/JSON-LD) — see app.services.google_listing_check. Caches the result on the row and auto-fills business_name/description the first time they're blank.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Check Listing Metadata Api V1 Settings Website Seo Listings Listing Id Check Metadata Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/listings/{listing_id}/advisory
Listing Advisory
The Advisory: prioritised fixes from the last metadata check, plus a ready-to-paste LocalBusiness JSON-LD snippet.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Listing Advisory Api V1 Settings Website Seo Listings Listing Id Advisory Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PUT /api/v1/settings/website/seo/listings/{listing_id}/profile
Update Profile
Save the listing's Profile tab — text fields + logo/cover/gallery uploads.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Update Profile Api V1 Settings Website Seo Listings Listing Id Profile Put"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/listings/{listing_id}/files/{file_id}/content
Listing File Content
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string | |
file_id | path | yes | string |
200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/listings/{listing_id}/reviews
List Reviews
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response List Reviews Api V1 Settings Website Seo Listings Listing Id Reviews Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/listings/{listing_id}/reviews
Create Review
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
Request body
json
{
"properties": {
"reviewer_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reviewer Name"
},
"rating": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"title": "Rating"
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Comment"
},
"review_time": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"title": "Review Time"
}
},
"type": "object",
"required": [
"rating"
],
"title": "ReviewIn"
}201 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Create Review Api V1 Settings Website Seo Listings Listing Id Reviews Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PATCH /api/v1/settings/website/seo/reviews/{review_id}
Update Review
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
review_id | path | yes | string |
Request body
json
{
"properties": {
"reviewer_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Reviewer Name"
},
"rating": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"title": "Rating"
},
"comment": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Comment"
},
"review_time": {
"anyOf": [
{
"type": "string",
"format": "date-time"
},
{
"type": "null"
}
],
"title": "Review Time"
}
},
"type": "object",
"required": [
"rating"
],
"title": "ReviewIn"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Update Review Api V1 Settings Website Seo Reviews Review Id Patch"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/settings/website/seo/reviews/{review_id}
Delete Review
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
review_id | path | yes | string |
204 — Successful Response
422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/reviews/{review_id}/draft-reply
Draft Reply
Draft a starter reply (heuristic templates, not an LLM).
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
review_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Draft Reply Api V1 Settings Website Seo Reviews Review Id Draft Reply Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/reviews/{review_id}/reply
Post Reply
Save a reply. Manually-logged reviews have no live Google review to post to — this saves it locally (offer to copy/paste onto the real listing). Reviews synced from Google (source="google_api") post live via gbp_client.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
review_id | path | yes | string |
Request body
json
{
"properties": {
"reply_text": {
"type": "string",
"title": "Reply Text"
}
},
"type": "object",
"required": [
"reply_text"
],
"title": "Body_post_reply_api_v1_settings_website_seo_reviews__review_id__reply_post"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Post Reply Api V1 Settings Website Seo Reviews Review Id Reply Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/listings/{listing_id}/reviews/sync
Sync Reviews
Pull reviews from Google (legacy v4 API) and upsert them locally.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Sync Reviews Api V1 Settings Website Seo Listings Listing Id Reviews Sync Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/listings/{listing_id}/push
Push Listing To Gbp
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Push Listing To Gbp Api V1 Settings Website Seo Listings Listing Id Push Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/gbp/status
Gbp Status
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Gbp Status Api V1 Settings Website Seo Gbp Status Get"
}POST /api/v1/settings/website/seo/gbp/credentials
Gbp Save Credentials
Request body
json
{
"properties": {
"client_id": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"title": "Client Id"
},
"client_secret": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Client Secret"
},
"redirect_uri": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Redirect Uri"
}
},
"type": "object",
"required": [
"client_id"
],
"title": "GbpCredentialsIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Gbp Save Credentials Api V1 Settings Website Seo Gbp Credentials Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/gbp/auth-url
Gbp Auth Url
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Gbp Auth Url Api V1 Settings Website Seo Gbp Auth Url Get"
}POST /api/v1/settings/website/seo/gbp/disconnect
Gbp Disconnect
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Gbp Disconnect Api V1 Settings Website Seo Gbp Disconnect Post"
}GET /api/v1/settings/website/seo/gbp/locations
Gbp Locations
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Gbp Locations Api V1 Settings Website Seo Gbp Locations Get"
}POST /api/v1/settings/website/seo/gbp/link
Gbp Link
Request body
json
{
"properties": {
"listing_id": {
"type": "string",
"title": "Listing Id"
},
"location_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Location Name"
},
"account_name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Account Name"
}
},
"type": "object",
"required": [
"listing_id"
],
"title": "GbpLinkIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Gbp Link Api V1 Settings Website Seo Gbp Link Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/settings
Google Seo Settings
Read every Google SEO setting plus the live sign-in state. No secrets — each is reported as a has_* flag.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Google Seo Settings Api V1 Settings Website Seo Settings Get"
}PUT /api/v1/settings/website/seo/settings
Save Google Seo Settings
Request body
json
{
"properties": {
"google": {
"anyOf": [
{
"properties": {
"client_id": {
"type": "string",
"title": "Client Id",
"default": ""
},
"client_secret": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Client Secret"
},
"redirect_uri": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Redirect Uri"
}
},
"type": "object",
"title": "GoogleSeoGoogleIn"
},
{
"type": "null"
}
]
},
"pagespeed": {
"anyOf": [
{
"properties": {
"api_key": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Api Key"
}
},
"type": "object",
"title": "GoogleSeoPageSpeedIn"
},
{
"type": "null"
}
]
},
"dataforseo": {
"anyOf": [
{
"properties": {
"login": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Login"
},
"password": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Password"
},
"location": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Location"
}
},
"type": "object",
"title": "GoogleSeoDataForSeoIn"
},
{
"type": "null"
}
]
},
"openserp": {
"anyOf": [
{
"properties": {
"url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Url"
}
},
"type": "object",
"title": "GoogleSeoOpenSerpIn"
},
{
"type": "null"
}
]
}
},
"type": "object",
"title": "GoogleSeoSettingsIn",
"description": "Every section optional: the page saves one card at a time, and an\nomitted section must not clear the credentials it holds."
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Save Google Seo Settings Api V1 Settings Website Seo Settings Put"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/search-console/status
Search Console Status
Whether Search Console is usable, and which properties are reachable.
Shares the Business Profile connection (one Google account, one consent), so "not connected" here and there are the same state.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Search Console Status Api V1 Settings Website Seo Search Console Status Get"
}POST /api/v1/settings/website/seo/search-console/sync
Search Console Sync
Pull Search Console data now (the daily job does this unattended).
Request body
json
{
"properties": {
"website_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Website Id"
},
"days": {
"type": "integer",
"maximum": 90,
"minimum": 1,
"title": "Days",
"default": 14
}
},
"type": "object",
"title": "GscSyncIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Search Console Sync Api V1 Settings Website Seo Search Console Sync Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/search-console/summary
Search Console Summary
Headline totals for the period, against the period before it.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no | ||
days | query | no | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Search Console Summary Api V1 Settings Website Seo Search Console Summary Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/search-console/daily
Search Console Daily
The per-day series behind the chart.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no | ||
days | query | no | integer |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response Search Console Daily Api V1 Settings Website Seo Search Console Daily Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/search-console/queries
Search Console Queries
Queries the site was shown for.
order=opportunity returns the ones sitting just off page 1 with real impressions — where Google already rates the site and a small push wins traffic. That view is the reason this data is worth ingesting.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no | ||
days | query | no | integer | |
order | query | no | string | |
limit | query | no | integer |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response Search Console Queries Api V1 Settings Website Seo Search Console Queries Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/search-console/promote
Promote Queries
Start tracking discovered queries as real keywords.
Discovered queries deliberately live in their own table — a busy site discloses thousands and folding them into tracked keywords would wreck both the Keywords page and the quota. Promotion is therefore an explicit choice, and it is charged against the keyword quota like any other addition.
Request body
json
{
"properties": {
"website_id": {
"type": "string",
"title": "Website Id"
},
"queries": {
"items": {
"type": "string"
},
"type": "array",
"title": "Queries"
}
},
"type": "object",
"required": [
"website_id",
"queries"
],
"title": "PromoteQueryIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Promote Queries Api V1 Settings Website Seo Search Console Promote Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/search-console/sitemaps
Search Console Sitemaps
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response Search Console Sitemaps Api V1 Settings Website Seo Search Console Sitemaps Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/audit/projects
List Audit Projects
200 — Successful Response
json
{
"items": {
"additionalProperties": true,
"type": "object"
},
"type": "array",
"title": "Response List Audit Projects Api V1 Settings Website Seo Audit Projects Get"
}POST /api/v1/settings/website/seo/audit/projects
Create Audit Project
Request body
json
{
"properties": {
"website_id": {
"type": "string",
"title": "Website Id"
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"title": "Name"
},
"max_pages": {
"type": "integer",
"maximum": 2000,
"minimum": 1,
"title": "Max Pages",
"default": 200
},
"exclude_paths": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Exclude Paths"
},
"exclude_extensions": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Exclude Extensions"
},
"sitemap_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sitemap Url"
},
"check_broken_links": {
"type": "boolean",
"title": "Check Broken Links",
"default": true
},
"store_page_links": {
"type": "boolean",
"title": "Store Page Links",
"default": true
},
"cron": {
"type": "boolean",
"title": "Cron",
"default": true
}
},
"type": "object",
"required": [
"website_id",
"name"
],
"title": "AuditProjectIn"
}201 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Create Audit Project Api V1 Settings Website Seo Audit Projects Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}PATCH /api/v1/settings/website/seo/audit/projects/{project_id}
Update Audit Project
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string |
Request body
json
{
"properties": {
"website_id": {
"type": "string",
"title": "Website Id"
},
"name": {
"type": "string",
"maxLength": 255,
"minLength": 1,
"title": "Name"
},
"max_pages": {
"type": "integer",
"maximum": 2000,
"minimum": 1,
"title": "Max Pages",
"default": 200
},
"exclude_paths": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Exclude Paths"
},
"exclude_extensions": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Exclude Extensions"
},
"sitemap_url": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Sitemap Url"
},
"check_broken_links": {
"type": "boolean",
"title": "Check Broken Links",
"default": true
},
"store_page_links": {
"type": "boolean",
"title": "Store Page Links",
"default": true
},
"cron": {
"type": "boolean",
"title": "Cron",
"default": true
}
},
"type": "object",
"required": [
"website_id",
"name"
],
"title": "AuditProjectIn"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Update Audit Project Api V1 Settings Website Seo Audit Projects Project Id Patch"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}DELETE /api/v1/settings/website/seo/audit/projects/{project_id}
Delete Audit Project
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string |
204 — Successful Response
422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/audit/projects/{project_id}/run
Run Audit Project
Start a crawl of the project's website. Returns as soon as it is running.
It used to run INLINE and return the finished summary, which worked only for a site small enough to crawl in two minutes. Past that, nginx's proxy_read_timeout 120 (conf.d/portal-lubb.conf) cut the POST and handed the browser a 504 — and the SPA treats 502/503/504 as ServerUnavailableError, so a slow audit did not merely fail, it threw the whole portal onto the "server is restarting" page (lib/api-client.ts + main.tsx). Longer still and Postgres killed the session's connection for idling in a transaction and the crawl's results were lost outright.
So the crawl is a background task now and this endpoint only starts it. The client polls GET /audit/projects: running says a crawl is in flight, and last_run_at/score/last_error carry the outcome.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string |
202 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Run Audit Project Api V1 Settings Website Seo Audit Projects Project Id Run Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/audit/projects/{project_id}/pages
List Audit Pages
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string | |
issue | query | no | ||
limit | query | no | integer |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response List Audit Pages Api V1 Settings Website Seo Audit Projects Project Id Pages Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/audit/projects/{project_id}/fix-preview
Audit Fix Preview
How many audited pages "Fix all" can actually edit, and how many it cannot.
Read by the button so it can say what it is about to do to a live public website before it does it, and so a site this install does not host says so up front (target_site null + a reason) instead of after a run that changed nothing.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Audit Fix Preview Api V1 Settings Website Seo Audit Projects Project Id Fix Preview Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/audit/projects/{project_id}/fix
Audit Fix All
Write corrected titles and meta descriptions to the live site.
Background, and returns as soon as it is running — same reason the crawl is (see :func:run_audit_project): the pass is dozens of language-model round trips plus dozens of cross-database writes, and nginx cuts the POST at 120 seconds with a 504 the SPA renders as "the server is restarting".
Only seo_title/seo_description override columns are written, never the visible copy those values are derived from; see app.apps.instances.services.website_seo_audit_fix's module docstring.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string |
202 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Audit Fix All Api V1 Settings Website Seo Audit Projects Project Id Fix Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/audit/fixes/{fix_id}/undo
Audit Fix Undo
Put one fixed field back to what was live before Fix all wrote it.
Synchronous — it is a single UPDATE of a single column, with the value already recorded — so the row can flip to "reverted" in the same click.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
fix_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Audit Fix Undo Api V1 Settings Website Seo Audit Fixes Fix Id Undo Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/audit/projects/{project_id}/duplicates
Audit Duplicates
Pages sharing a title or description — invisible one page at a time, and the most common finding on a template-built website.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Audit Duplicates Api V1 Settings Website Seo Audit Projects Project Id Duplicates Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/audit/projects/{project_id}/broken-links
Audit Broken Links
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
project_id | path | yes | string | |
limit | query | no | integer |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response Audit Broken Links Api V1 Settings Website Seo Audit Projects Project Id Broken Links Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/pagespeed
List Pagespeed
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
website_id | query | no | ||
days | query | no | integer |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response List Pagespeed Api V1 Settings Website Seo Pagespeed Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/pagespeed/run
Run Pagespeed
Request body
json
{
"properties": {
"website_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Website Id"
}
},
"type": "object",
"title": "PageSpeedRunIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Run Pagespeed Api V1 Settings Website Seo Pagespeed Run Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/alerts
List Alerts
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
unread_only | query | no | boolean | |
category | query | no | ||
limit | query | no | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response List Alerts Api V1 Settings Website Seo Alerts Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/alerts/generate
Generate Alerts
Evaluate the alert rules now (the daily pass does this unattended).
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Generate Alerts Api V1 Settings Website Seo Alerts Generate Post"
}POST /api/v1/settings/website/seo/alerts/read
Read Alerts
Request body
json
{
"properties": {
"alert_ids": {
"anyOf": [
{
"items": {
"type": "string"
},
"type": "array"
},
{
"type": "null"
}
],
"title": "Alert Ids"
}
},
"type": "object",
"title": "AlertReadIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Read Alerts Api V1 Settings Website Seo Alerts Read Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/reports/settings
Get Report Settings
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Get Report Settings Api V1 Settings Website Seo Reports Settings Get"
}PUT /api/v1/settings/website/seo/reports/settings
Save Report Settings
Request body
json
{
"properties": {
"enabled": {
"type": "boolean",
"title": "Enabled",
"default": false
},
"interval": {
"type": "string",
"pattern": "^(weekly|monthly)$",
"title": "Interval",
"default": "monthly"
},
"recipients": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Recipients"
}
},
"type": "object",
"title": "ReportSettingsIn"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Save Report Settings Api V1 Settings Website Seo Reports Settings Put"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/reports/preview
Preview Report
The report's data, so the page can render it before anything is emailed.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
days | query | no | integer |
200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Preview Report Api V1 Settings Website Seo Reports Preview Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/reports/preview.html
Preview Report Html
Exactly the HTML the email carries — the only honest way to check it.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
days | query | no | integer |
200 — Successful Response
422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/reports/send
Send Report Now
Request body
json
{
"anyOf": [
{
"properties": {
"recipients": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"title": "Recipients"
}
},
"type": "object",
"title": "SendReportIn",
"description": "Recipients for a one-off send, comma-separated.\n\nOptional: omitted (or blank) falls back to the saved row, which is what the\nscheduled send uses. It exists because \"Send one now\" sits next to an\neditable recipients box, and the page enabled that button off the box's\nLOCAL value while the server only ever read the SAVED one — so typing an\naddress and sending without pressing Save first failed with \"No recipients\nconfigured\" against a visibly non-empty field. Sending what is on screen is\nwhat the button claims to do."
},
{
"type": "null"
}
],
"title": "Body"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Send Report Now Api V1 Settings Website Seo Reports Send Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/listings/{listing_id}/reviews/fetch
Fetch Reviews Dfs
Queue a review pull that needs no Google consent.
The GBP path (/listings/{id}/reviews/sync) requires both customer OAuth and legacy v4 API access Google closed to new projects in 2020, so for most sites it returns nothing, ever. This reads the same public reviews from a URL or business name instead — which is why the Reviews tab can have content before anyone connects anything.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
listing_id | path | yes | string |
Request body
json
{
"properties": {
"platform": {
"type": "string",
"pattern": "^(google|trustpilot)$",
"title": "Platform",
"default": "google"
}
},
"type": "object",
"title": "ReviewFetchIn"
}200 — Successful Response
json
{
"type": "object",
"additionalProperties": true,
"title": "Response Fetch Reviews Dfs Api V1 Settings Website Seo Listings Listing Id Reviews Fetch Post"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}POST /api/v1/settings/website/seo/reviews/collect
Collect Reviews Dfs
Collect any finished review tasks now.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Collect Reviews Dfs Api V1 Settings Website Seo Reviews Collect Post"
}GET /api/v1/settings/website/seo/crawl-log
Get Crawl Log
Every outbound fetch made for this site.
The answer to "the check ran but found nothing" — a CAPTCHA'd scraper, an out-of-credit API and a genuinely unranked keyword used to be indistinguishable from the outside.
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
crawl_type | query | no | ||
only_failures | query | no | boolean | |
limit | query | no | integer |
200 — Successful Response
json
{
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"title": "Response Get Crawl Log Api V1 Settings Website Seo Crawl Log Get"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/quota
Get Quota
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Get Quota Api V1 Settings Website Seo Quota Get"
}PUT /api/v1/settings/website/seo/quota
Save Quota
Set this site's caps. A null field clears back to the default.
Request body
json
{
"properties": {
"max_websites": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Websites"
},
"max_keywords": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Keywords"
},
"max_audit_pages": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Audit Pages"
},
"max_monthly_serp_checks": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"title": "Max Monthly Serp Checks"
}
},
"type": "object",
"title": "Body_save_quota_api_v1_settings_website_seo_quota_put"
}200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Save Quota Api V1 Settings Website Seo Quota Put"
}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/settings/website/seo/providers/status
Providers Status
Health of everything this feature depends on, in one call.
DataForSEO is deliberately NOT reported here. It is the paid ALTERNATIVE to OpenSERP for rank checks, not a requirement, and no site on this instance uses it — so its "not configured" status rendered as a red error on a page whose whole job is to say what is broken. Its credit balance (seo_rank.account_balance) is still worth surfacing next to a paid run if the provider is ever adopted; it just is not a health signal until then.
200 — Successful Response
json
{
"additionalProperties": true,
"type": "object",
"title": "Response Providers Status Api V1 Settings Website Seo Providers Status Get"
}GET /api/v1/settings/website/seo/gbp/callback
Gbp Callback
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
code | query | no | string | |
state | query | no | string | |
error | query | no | string |
200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}GET /api/v1/google/gbp/callback
Gbp Callback
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
code | query | no | string | |
state | query | no | string | |
error | query | no | string |
200 — Successful Response
json
{}422 — Validation Error
json
{
"properties": {
"detail": {
"items": {
"properties": {
"loc": {
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "integer"
}
]
},
"type": "array",
"title": "Location"
},
"msg": {
"type": "string",
"title": "Message"
},
"type": {
"type": "string",
"title": "Error Type"
}
},
"type": "object",
"required": [
"loc",
"msg",
"type"
],
"title": "ValidationError"
},
"type": "array",
"title": "Detail"
}
},
"type": "object",
"title": "HTTPValidationError"
}