# Content decay
Source: https://api-docs.hrizn.io/api-reference/analytics/content-decay
/openapi.yaml get /analytics/search/decay
# Create-brief from search analysis
Source: https://api-docs.hrizn.io/api-reference/analytics/create-brief-from-search-analysis
/openapi.yaml get /analytics/search/create-brief
# Four-scalar search pulse (REST only)
Source: https://api-docs.hrizn.io/api-reference/analytics/four-scalar-search-pulse-rest-only
/openapi.yaml get /analytics/search/pulse
# GA4 traffic pages
Source: https://api-docs.hrizn.io/api-reference/analytics/ga4-traffic-pages
/openapi.yaml get /analytics/traffic/pages
# GA4 traffic snapshot
Source: https://api-docs.hrizn.io/api-reference/analytics/ga4-traffic-snapshot
/openapi.yaml get /analytics/traffic/snapshot
# Interrogative and gen-AI exhaust queries
Source: https://api-docs.hrizn.io/api-reference/analytics/interrogative-and-gen-ai-exhaust-queries
/openapi.yaml get /analytics/search/questions
# List search pages
Source: https://api-docs.hrizn.io/api-reference/analytics/list-search-pages
/openapi.yaml get /analytics/search/pages
# List search queries
Source: https://api-docs.hrizn.io/api-reference/analytics/list-search-queries
/openapi.yaml get /analytics/search/queries
# Page performance plus live URL Inspection
Source: https://api-docs.hrizn.io/api-reference/analytics/page-performance-plus-live-url-inspection
/openapi.yaml get /analytics/pages/performance
# Search alerts
Source: https://api-docs.hrizn.io/api-reference/analytics/search-alerts
/openapi.yaml get /analytics/search/alerts
# Search gaps versus published titles
Source: https://api-docs.hrizn.io/api-reference/analytics/search-gaps-versus-published-titles
/openapi.yaml get /analytics/search/gaps
# Search opportunities
Source: https://api-docs.hrizn.io/api-reference/analytics/search-opportunities
/openapi.yaml get /analytics/search/opportunities
# Search period-over-period changes
Source: https://api-docs.hrizn.io/api-reference/analytics/search-period-over-period-changes
/openapi.yaml get /analytics/search/changes
# Search snapshot
Source: https://api-docs.hrizn.io/api-reference/analytics/search-snapshot
/openapi.yaml get /analytics/search/snapshot
# Vehicle demand insights
Source: https://api-docs.hrizn.io/api-reference/analytics/vehicle-demand-insights
/openapi.yaml get /analytics/demand/vehicles
# Apply compliance fixes
Source: https://api-docs.hrizn.io/api-reference/compliance/apply-compliance-fixes
/openapi.yaml post /compliance/apply-fixes
Apply selected compliance suggested replacements to copy. Optionally re-run a compliance check on the revised text.
# Apply compliance fixes
Source: https://api-docs.hrizn.io/api-reference/compliance/apply-fixes
POST /compliance/apply-fixes
Apply selected compliance suggested replacements to copy
Applies selected issue ids from a prior freeform check and/or explicit replacement pairs. Optionally re-runs compliance on the revised text.
This endpoint revises the text you supply and stores nothing. To fix or dismiss findings on stored Hrizn content — persisting the copy and the decision — use [Apply compliance decisions](/api-reference/compliance/apply-to-content).
**Scope required:** `compliance:write`
Also requires the dealership’s **Compliance Checking** plan feature (Pro+ / add-on).
## Body
Current copy to revise.
Issue ids from `POST /compliance/check`.
Explicit `{ problematic_text, suggested_replacement }` pairs.
When true, run another compliance check on `revised_text`.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"revised_text": "Featured vehicles this weekend.",
"applied_count": 1,
"skipped": [],
"status": "completed",
"report": {
"overall": "PASS",
"overall_score": 100,
"issues": []
}
}
}
```
# Apply compliance decisions
Source: https://api-docs.hrizn.io/api-reference/compliance/apply-to-content
POST /content/{id}/compliance/apply
Accept or ignore stored compliance findings by issue id
Acts on findings from the stored report for this content: **accepted** issue ids rewrite the stored body with the suggested replacement, **ignored** issue ids record a dismissal without touching the copy. Both are persisted atomically with the body write, and decisions are carried across re-checks — a fixed or dismissed finding does not come back as open.
**Scope required:** `compliance:write`
Also requires the dealership's **Compliance Checking** plan feature (Pro+ / add-on).
## Path parameters
UUID of the content.
## Body
Findings to fix. Each id comes from the stored report (`GET /content/{id}/compliance` → `report.issues[].id`); the suggested replacement is applied to the stored body.
Findings to dismiss. Recorded with the reason; the copy is untouched.
Why the ignored findings are acceptable (stored with the dismissal).
Must be `true` to rewrite content that is already published.
At least one of `issue_ids` or `ignore_issue_ids` is required. Send an `Idempotency-Key` header to make retries safe.
## Response
Whether any accepted fix changed the stored body.
Accepted findings that were rewritten, with the text replaced and how many occurrences changed.
Issue ids recorded as dismissed.
Requested findings that could not be applied, each with a `reason` (for example, the flagged wording is no longer present).
The body changed after the report was produced — re-run the check before trusting the remaining findings.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"article_id": "d4e5f6a7-b8c9-0123-def0-456789abcdef",
"body_format": "rich_text",
"body_updated": true,
"applied": [
{
"issue_id": "9f3d2a417c05b1e8",
"problematic_text": "guaranteed lowest price",
"suggested_replacement": "competitive pricing",
"replacement_count": 1
}
],
"ignored": ["4b8e1f60aa3c92d7"],
"skipped": [],
"content_changed_since_check": false,
"guidance": "Re-run trigger_content_compliance to confirm the new verdict. This is not legal advice."
}
}
```
A `409` with code `stale_content` means the article body changed between reading the report and applying it — nothing was written. Re-run the compliance check for a fresh report, then retry.
Published content is refused unless `allow_published: true` is passed — rewriting a live page is a deliberate choice.
# Check freeform compliance
Source: https://api-docs.hrizn.io/api-reference/compliance/check
POST /compliance/check
Run a sync OEM compliance check on pasted marketing copy
Analyzes arbitrary marketing copy against the dealership’s OEM advertising rules. Returns overall score, categories, and flat issues with `suggested_replacement` text.
**Scope required:** `compliance:write`
Also requires the dealership’s **Compliance Checking** plan feature (Pro+ / add-on). Automotive heuristics only — not legal advice.
## Body
Marketing copy to analyze (plain text or HTML).
Optional `plain` or `html` hint.
Optional label stamped onto the report (for example `social_ad`).
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"status": "completed",
"report": {
"overall": "FAIL",
"overall_score": 70,
"issues": [
{
"id": "a1b2c3d4e5f67890",
"severity": "HIGH",
"category": "msrpPricing",
"description": "Sale language below MSRP",
"problematic_text": "Huge sale",
"suggested_replacement": "Featured vehicles"
}
],
"disclaimer": "OEM advertising heuristics for dealership marketing copy — not legal advice."
},
"guidance": "Lead with HIGH severity issues..."
}
}
```
For interactive agent loops, call this tool, discuss HIGH issues, then [Apply compliance fixes](/api-reference/compliance/apply-fixes) with `recheck: true`.
# Check freeform copy
Source: https://api-docs.hrizn.io/api-reference/compliance/check-freeform-copy
/openapi.yaml post /compliance/check
Sync OEM advertising compliance check on arbitrary marketing copy. Requires compliance:write and the Compliance Checking plan feature. Heuristics only — not legal advice.
# Get compliance results
Source: https://api-docs.hrizn.io/api-reference/compliance/get
GET /content/{id}/compliance
Get compliance check results for content
Returns the latest compliance check results for content.
**Scope required:** `content:read`
## Path parameters
UUID of the content.
## Response
UUID of the article.
Compliance status: `not_checked`, `checking`, `completed`, or `failed`.
Latest report — overall verdict and score, per-category scores, and a flat `issues` array. `null` if compliance has not been run.
Stable finding id. Pass it to [Apply compliance decisions](/api-reference/compliance/apply-to-content) as `issue_ids` (fix) or `ignore_issue_ids` (dismiss). Ids survive re-checks of the same finding.
Decisions already recorded against findings (`state`: `accepted` or `ignored`, with who/when/why where known). Carried across re-checks, so a resolved finding does not come back as open.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"article_id": "4d42cdcf-e24f-4123-960e-6c15761fcfcf",
"status": "not_checked",
"report": null
}
}
```
When a compliance check has been completed:
```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"article_id": "4d42cdcf-e24f-4123-960e-6c15761fcfcf",
"status": "completed",
"report": {
"overall": "FAIL",
"overall_score": 91,
"summary": {
"total_issues": 1,
"high_severity_issues": 1,
"medium_severity_issues": 0,
"low_severity_issues": 0
},
"issues": [
{
"id": "9f3d2a417c05b1e8",
"severity": "high",
"category": "msrp_pricing",
"description": "Implies a guaranteed price without disclosure",
"problematic_text": "guaranteed lowest price",
"suggested_replacement": "competitive pricing"
}
],
"timestamp": "2026-08-25T15:10:40.588Z"
},
"dispositions": [
{
"issue_id": "4b8e1f60aa3c92d7",
"state": "ignored",
"at": "2026-08-24T18:02:11.000Z",
"reason": "OEM-approved seasonal wording"
}
]
}
}
```
Act on findings with [Apply compliance decisions](/api-reference/compliance/apply-to-content): `issue_ids` fixes the copy, `ignore_issue_ids` records a dismissal.
To trigger a compliance check, use [Trigger compliance](/api-reference/compliance/trigger). Content must be in `complete` status before a compliance check can be run.
# Get compliance report
Source: https://api-docs.hrizn.io/api-reference/compliance/get-compliance-report
/openapi.yaml get /content/{id}/compliance
# Trigger compliance check
Source: https://api-docs.hrizn.io/api-reference/compliance/trigger
POST /content/{id}/compliance
Run an OEM compliance check on content
Queues a compliance check against the site's OEM compliance rules. Results are attached to the content's components when finished.
**Scope required:** `compliance:write`
## Path parameters
UUID of the content to check.
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"article_id": "4d42cdcf-e24f-4123-960e-6c15761fcfcf",
"status": "checking",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Compliance checks are asynchronous and typically complete within a few minutes. Configure [webhooks](/webhooks) to receive real-time `compliance.completed` notifications instead of polling.
# Trigger compliance check
Source: https://api-docs.hrizn.io/api-reference/compliance/trigger-compliance-check
/openapi.yaml post /content/{id}/compliance
Starts an asynchronous OEM compliance check on content.
# Act on recommendation
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/act
POST /content-intelligence/{id}/act
Link a recommendation to the article or IdeaCloud created from it
Marks a recommendation as acted on, linking it to the article or IdeaCloud research graph that was created based on the recommendation. This closes the feedback loop, letting the content intelligence pipeline know that the gap has been addressed.
**Scope required:** `content_intelligence:write`
## Path parameters
UUID of the content intelligence recommendation.
## Request body
Provide exactly one target:
UUID of the article that was created from this recommendation.
UUID of the IdeaCloud research graph that was created from this recommendation.
## Workflow
The typical workflow for acting on a recommendation:
Call `GET /content-intelligence` to find actionable recommendations.
Use `GET /reference/content-intelligence-types` to determine which endpoint to call based on `suggestion_type`. For example, `missing_model_page` maps to `POST /model-landing-pages`.
Call the appropriate content or IdeaCloud creation endpoint. The response includes the new article or research graph `id`.
Call `POST /content-intelligence/{id}/act` with either `article_id` or `research_graph_id` to mark the recommendation as acted on.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "c3a1f8b2-7e4d-4a9c-b5e6-1234567890ab",
"status": "acted_on",
"acted_on_article_id": "a1b2c3d4-5e6f-7890-abcd-ef1234567890",
"acted_on_research_graph_id": null,
"updated_at": "2026-03-02T10:30:00.000Z"
}
}
```
Only active recommendations can be acted on. Attempting to act on a dismissed, expired, or already acted-on recommendation will return a 404 error.
# Act on recommendation
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/act-on-recommendation
/openapi.yaml post /content-intelligence/{id}/act
Marks a recommendation as acted on, linking it to the article or IdeaCloud research graph that was created from this recommendation.
# Bulk dismiss
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/bulk-dismiss
POST /content-intelligence/bulk-dismiss
Dismiss multiple content intelligence recommendations at once
Dismiss up to 50 content intelligence recommendations in a single request. Only active recommendations will be dismissed; any IDs that reference non-active or non-existent recommendations are silently skipped.
**Scope required:** `content_intelligence:write`
## Request body
Array of recommendation UUIDs to dismiss. Minimum 1, maximum 50.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"dismissed_count": 3,
"dismissed": [
{
"id": "c3a1f8b2-7e4d-4a9c-b5e6-1234567890ab",
"status": "dismissed",
"updated_at": "2026-03-02T10:30:00.000Z"
},
{
"id": "d4b2e9c3-8f5e-5b0d-c6f7-2345678901bc",
"status": "dismissed",
"updated_at": "2026-03-02T10:30:00.000Z"
},
{
"id": "e5c3f0d4-9a6b-6c1e-d8g9-3456789012cd",
"status": "dismissed",
"updated_at": "2026-03-02T10:30:00.000Z"
}
]
}
}
```
The `dismissed_count` may be less than the number of IDs provided if some recommendations were already dismissed, expired, or belonged to a different site.
# Dismiss recommendation
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/dismiss
PATCH /content-intelligence/{id}
Dismiss a content intelligence recommendation
Marks a recommendation as dismissed, removing it from the active list. This is useful for recommendations your team has reviewed and decided not to act on.
**Scope required:** `content_intelligence:read`
## Path parameters
UUID of the content intelligence recommendation.
## Request body
Must be `"dismissed"`.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "c3a1f8b2-7e4d-4a9c-b5e6-1234567890ab",
"status": "dismissed",
"updated_at": "2026-03-02T10:30:00.000Z"
}
}
```
Dismissed recommendations are not permanently deleted. They remain in the database and can be filtered by status. The nightly pipeline may generate new recommendations for the same gap in future runs.
# Dismiss recommendation
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/dismiss-recommendation
/openapi.yaml patch /content-intelligence/{id}
Marks a recommendation as dismissed, removing it from the active list.
# Get recommendation
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/get
GET /content-intelligence/{id}
Get details of a specific content intelligence recommendation
Returns a single content intelligence recommendation by ID.
**Scope required:** `content_intelligence:read`
## Path parameters
UUID of the content intelligence recommendation.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "c3a1f8b2-7e4d-4a9c-b5e6-1234567890ab",
"suggestion_type": "missing_model_page",
"comparison_subtype": null,
"title": "Create a 2026 Toyota Camry model page",
"description": "The 2026 Toyota Camry has 14 units in inventory but no dedicated model research page. Creating one could capture high-intent search traffic.",
"priority_score": 92,
"metadata": {
"make": "Toyota",
"model": "Camry",
"year": 2026,
"inventory_count": 14,
"estimated_monthly_searches": 8400
},
"suggested_article_type": "modellanding",
"status": "active",
"created_at": "2026-03-01T04:00:00.000Z",
"expires_at": "2026-03-31T04:00:00.000Z"
}
}
```
# Get recommendation
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/get-recommendation
/openapi.yaml get /content-intelligence/{id}
Returns a single content intelligence recommendation by ID.
# Get summary
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/get-summary
/openapi.yaml get /content-intelligence/summary
Returns aggregate counts of content intelligence recommendations by status, priority tier, and type.
# List recommendations
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/list
GET /content-intelligence
List AI-generated content intelligence recommendations for this site
Returns a paginated list of content intelligence recommendations generated by the nightly gap analysis pipeline. Recommendations identify content opportunities based on inventory, search data, seasonal trends, and competitive analysis.
**Scope required:** `content_intelligence:read`
## Query parameters
Results per page (1-100).
Pagination cursor from a previous response.
Filter by a single recommendation type. See [Content intelligence types](/api-reference/reference/content-intelligence-types) for all values.
Filter by multiple recommendation types (comma-separated). Example: `missing_model_page,comparison_opportunity`.
Minimum priority score (0-100). Only return recommendations with `priority_score >= priority_min`.
Filter by status: `active` (default), `dismissed`, `acted_on`, `expired`.
Filter by recommended content type: `basic`, `qa`, `expert`, `modellanding`, `comparison`, `salesevent`.
## Response
Type of recommendation (e.g. `missing_model_page`, `comparison_opportunity`). Determines which API endpoint to use for acting on the recommendation.
For `comparison_opportunity` type only: `cross_brand`, `trim`, or `cross_category`.
Priority from 0-100. Higher scores indicate more impactful content opportunities.
Type-specific data such as vehicle make/model/year, traffic estimates, competitor info. Shape varies by `suggestion_type`.
Recommended content type: `basic`, `modellanding`, `comparison`, `salesevent`, etc.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": [
{
"id": "c3a1f8b2-7e4d-4a9c-b5e6-1234567890ab",
"suggestion_type": "missing_model_page",
"comparison_subtype": null,
"title": "Create a 2026 Toyota Camry model page",
"description": "The 2026 Toyota Camry has 14 units in inventory but no dedicated model research page. Creating one could capture high-intent search traffic.",
"priority_score": 92,
"metadata": {
"make": "Toyota",
"model": "Camry",
"year": 2026,
"inventory_count": 14,
"estimated_monthly_searches": 8400
},
"suggested_article_type": "modellanding",
"status": "active",
"created_at": "2026-03-01T04:00:00.000Z",
"expires_at": "2026-03-31T04:00:00.000Z"
},
{
"id": "d4b2e9c3-8f5e-5b0d-c6f7-2345678901bc",
"suggestion_type": "comparison_opportunity",
"comparison_subtype": "cross_brand",
"title": "Toyota Camry vs Honda Accord comparison",
"description": "Cross-brand comparison opportunity: Toyota Camry and Honda Accord are frequently cross-shopped. A comparison article could capture competitive search traffic.",
"priority_score": 85,
"metadata": {
"vehicles": [
{ "make": "Toyota", "model": "Camry", "year": 2026 },
{ "make": "Honda", "model": "Accord", "year": 2026 }
],
"search_overlap_score": 0.78
},
"suggested_article_type": "comparison",
"status": "active",
"created_at": "2026-03-01T04:00:00.000Z",
"expires_at": "2026-03-31T04:00:00.000Z"
}
],
"pagination": {
"has_more": true,
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAy...",
"total_count": 47
}
}
```
Use the [content intelligence types reference](/api-reference/reference/content-intelligence-types) to understand each type and which API endpoint to call for acting on it.
# List recommendations
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/list-recommendations
/openapi.yaml get /content-intelligence
Returns a paginated list of content intelligence recommendations generated by the nightly gap analysis pipeline.
# Get summary
Source: https://api-docs.hrizn.io/api-reference/content-intelligence/summary
GET /content-intelligence/summary
Get aggregate counts of content intelligence recommendations
Returns a summary of content intelligence recommendations for the site, broken down by status, priority tier, and recommendation type. Useful for dashboards and monitoring.
**Scope required:** `content_intelligence:read`
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"total": {
"active": 47,
"dismissed": 12,
"acted_on": 23,
"expired": 156
},
"priority": {
"high": 8,
"medium": 21,
"low": 18
},
"by_type": {
"missing_model_page": 5,
"comparison_opportunity": 8,
"search_gap": 12,
"trending_topic": 4,
"content_refresh": 3,
"seasonal_content": 2,
"model_year_transition": 3,
"network_benchmark": 6,
"inventory_move": 4
}
}
}
```
Priority tiers are defined as: **High** (score >= 80), **Medium** (score 60-79), **Low** (score \< 60). The `by_type` counts only include active recommendations.
# Generate content tools
Source: https://api-docs.hrizn.io/api-reference/content-tools/generate
POST /content/{id}/content-tools
Generate SEO metadata, schemas, and social snippets for content
Triggers generation of SEO metadata (title, description, keywords), JSON-LD schema markup, and social media snippets (Open Graph, Twitter) for completed content.
**Scope required:** `content_tools:write`
## Path parameters
UUID of a completed article.
## Request body
Specific tools to generate. Defaults to all available tools.
Options: `seo-metadata`, `schemas`, `social-snippets`, `page-slugs`, `post-tags`, `search-intent`
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"article_id": "4d42cdcf-e24f-4123-960e-6c15761fcfcf",
"tools": [
"seoMetadata",
"combinedSchema",
"facebookSnip",
"instagramSnip",
"twitterSnip",
"googleBusinessSnip"
],
"status": "generating",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Content tool generation is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `content_tools.completed` notifications instead of polling.
Content tools results are available as content components. Use [Get content components](/api-reference/content/get-components) to retrieve them.
# Generate a single content tool
Source: https://api-docs.hrizn.io/api-reference/content-tools/generate-a-single-content-tool
/openapi.yaml post /content/{id}/content-tools/{tool}
# Generate content tools
Source: https://api-docs.hrizn.io/api-reference/content-tools/generate-content-tools
/openapi.yaml post /content/{id}/content-tools
Triggers generation for all or selected content tools on content.
# Compare trims
Source: https://api-docs.hrizn.io/api-reference/content-types/compare-trims
GET /catalog/compare-trims
Side-by-side trim comparison for one model year
Compares the trims of one model year from the Hrizn vehicle catalog: the trim list with MSRPs, plus per-category comparison tables (each with its own headers) and the features every trim shares.
**Scope required:** `inventory:read`
## Query parameters
Model year.
Make name.
Model name.
## Response
`available` (tables and trims), `trims_only` (trim list without tables), or `catalog_unavailable` (the model exists but holds no assembled facts yet).
Each trim's `name`, `msrp`, `description`, and display `position`.
One table per category with `headers`, per-feature `rows` (one value per trim), and `shared` features every trim has.
# Create vehicle comparison
Source: https://api-docs.hrizn.io/api-reference/content-types/create-comparison
POST /comparisons
Generate a side-by-side comparison from inventory VINs and/or validated catalog YMMT
Creates and generates a vehicle comparison for 2–5 vehicles. Each vehicle must declare an explicit **source**:
| `source` | Required fields |
| - | - |
| `inventory` | `vin` **or** `stock_number` (exactly one; must exist in this site's inventory) |
| `catalog` | `year`, `make`, `model` (`trim` optional) — labels from `/vehicle-ymmt/*` |
Free-text YMMT without cascade validation is rejected. Supports the same create options as Composer (tone/voice, depth, geo, Layouts, featured vehicle + bias). Generation is asynchronous; use `GET /content/{id}` to check status.
**Scope required:** `content:write`
## Request body
Array of 2-5 vehicles. Each item requires `source` plus either inventory (`vin` or `stock_number`) or catalog YMMT fields. Optional per-vehicle `selected_trims`.
Brand voice profile id (sets tone to `BrandVoice:{id}`).
Enum tone when not using a brand voice. Defaults to the site's first brand voice, otherwise `Informative`.
Language for generated content.
Custom title. Defaults to "Vehicle A vs Vehicle B vs ...".
Content depth preset. One of `concise`, `steady`, `balanced`, `substantial`, or `in-depth`.
Optional override. Defaults to `false` only when `content_depth` is `concise`.
Optional geo targeting: `[{ element_id, priority }]` from `GET /site/target-geography`.
`standard` (Rich Text) or `visual` (Layouts). Visual requires Layouts plan entitlement.
When visual: `custom` (AI Design), `user-template` (My Template), or `template`.
Required when `visual` + `user-template`. Use `GET /layouts?content_type=comparison`.
Zero-based index of the vehicle to favor (0–2). Defaults to `0`.
Bias intensity toward the featured vehicle (0–100). Defaults to `50`.
## Example
```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"vehicles": [
{ "source": "inventory", "stock_number": "26T5072" },
{
"source": "catalog",
"year": 2026,
"make": "Ford",
"model": "F-150",
"trim": "XLT"
}
]
}
```
# Create model landing page
Source: https://api-docs.hrizn.io/api-reference/content-types/create-model-landing
POST /model-landing-pages
Generate a model research / landing page from inventory VIN or validated catalog YMMT
Creates and generates a model landing page. You must choose an explicit **source**:
| `source` | Required fields | When to use |
| - | - | - |
| `inventory` | `vin` **or** `stock_number` (exactly one) | Content for a unit on this dealership's lot |
| `catalog` | `year`, `make`, `model` (`trim` optional) | Research/landing page from the selectable vehicle list |
Catalog YMMT must match labels from the parent-required cascade (`GET/POST /vehicle-ymmt/years` → `makes` → `models` → `trims`). Free-text invent is rejected. Generation is asynchronous; use `GET /content/{id}` to check status.
**Scope required:** `content:write`
## Request body
`inventory` or `catalog`.
Inventory path: vehicle VIN. Provide **exactly one** of `vin` or `stock_number` when `source` is `inventory`.
Inventory path: dealer stock number (case-insensitive). Provide **exactly one** of `vin` or `stock_number` when `source` is `inventory`.
Required when `source` is `catalog`. Model year from `/vehicle-ymmt/years`.
Required when `source` is `catalog`. Make **display label** from `/vehicle-ymmt/makes`.
Required when `source` is `catalog`. Model label from `/vehicle-ymmt/models`.
Optional catalog trim label from `/vehicle-ymmt/trims`.
ID of a brand voice profile to use for tone and style (sets `tone` to `BrandVoice:{id}`).
Enum tone when not using a brand voice: `Informative`, `Authoritative`, `Persuasive`, `Confident`, `Analytical`, `Empathetic`, `Witty`, `Enthusiastic`, `Inspiring`, `Motivating`, `Creative`. Defaults to the site's first brand voice, otherwise `Informative`.
Language for generated content. One of: `English`, `Spanish`, `Mandarin Chinese`, `Japanese`, `Korean`, `Arabic`, `Farsi`, `Hebrew`, `French`, `Tagalog`, `Vietnamese`, `Portuguese`, `Russian`.
Custom page title (max 500 characters). Defaults to "Year Make Model \[Trim]".
Content depth preset: `concise`, `steady`, `balanced`, `substantial`, or `in-depth`.
Optional override. Defaults to `false` only when `content_depth` is `concise`.
Optional multi-trim selection (from `/vehicle-ymmt/trims`). Omit when empty.
Optional geo targeting: `[{ element_id, priority }]` using ids from `GET /site/target-geography`.
`standard` (Rich Text) or `visual` (Layouts). Visual requires Layouts plan entitlement.
When `output_format=visual`: `custom` (AI Design, default), `user-template` (My Template), or `template` (system).
Required when `visual` + `user-template`. Use `GET /layouts?content_type=modellanding`.
**Deprecated.** Accepted for backward compatibility but has no effect. Use `content_depth`.
## Response
Returns `202 Accepted` when the model landing page starts generating:
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "38437cb5-7a1c-4a2c-bae3-23366ba53d4b",
"status": "generating",
"article_type": "modellanding",
"title": "2026 Chevrolet Corvette Stingray",
"source": "catalog",
"vehicle": {
"year": 2026,
"make": "Chevrolet",
"model": "Corvette",
"trim": "Stingray"
},
"created_at": "2026-03-15T12:00:00.000Z",
"message": "Generation started. Configure a webhook for content.completed or poll GET /content/{id}."
}
}
```
# Create sales event page
Source: https://api-docs.hrizn.io/api-reference/content-types/create-sales-event
POST /sales-events
Generate a promotional page for a dealership event
Creates and generates a promotional page for a dealership sales event. Supports multiple event categories and the same create options as Composer (tone/voice, depth, geo, Layouts). Generation is asynchronous; use `GET /content/{id}` to check status and retrieve the result.
**Scope required:** `content:write`
## Request body
Name of the event (max 500 characters).
Event start date/time in ISO 8601 format.
Event end date/time in ISO 8601 format. Must be on or after `start_date`.
Event location or address (max 500 characters).
Event category. One of: `Sales Event`, `New Model Launch`, `Owner Appreciation`, `Service Special`, `Community Event`, `Holiday Celebration`, `Test Drive Event`.
Additional context about the event for the AI to use during generation (max 2000 characters).
Brand voice profile id (sets tone to `BrandVoice:{id}`).
Enum tone when not using a brand voice. Defaults to the site's first brand voice, otherwise `Informative`.
Language for generated content. One of: `English`, `Spanish`, `Mandarin Chinese`, `Japanese`, `Korean`, `Arabic`, `Farsi`, `Hebrew`, `French`, `Tagalog`, `Vietnamese`, `Portuguese`, `Russian`.
Custom page title (max 500 characters). Defaults to `Sales Event - {event_name}`.
Content depth preset: `concise`, `steady`, `balanced`, `substantial`, or `in-depth`.
Optional override. Defaults to `false` only when `content_depth` is `concise`.
Optional geo targeting: `[{ element_id, priority }]` from `GET /site/target-geography`.
`standard` (Rich Text) or `visual` (Layouts). Visual requires Layouts plan entitlement.
When visual: `custom` (AI Design), `user-template` (My Template), or `template`.
Required when `visual` + `user-template`. Use `GET /layouts?content_type=salesevent`.
**Deprecated.** Accepted for backward compatibility but has no effect. Use `content_depth`.
## Response
Returns `202 Accepted` when the sales event page starts generating:
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "d97902b2-be6f-4f0e-8a80-e48a18df90cf",
"status": "generating",
"article_type": "salesevent",
"title": "Sales Event - Spring Clearance Sale",
"event": {
"name": "Spring Clearance Sale",
"location": "315 W Jericho Tpke, Huntington, NY 11743",
"category": "Sales Event",
"start_date": "2026-04-01T09:00:00Z",
"end_date": "2026-04-07T21:00:00Z",
"description": null
},
"created_at": "2026-02-28T11:43:57.502664+00:00",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Content generation is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `content.completed` and `content.failed` notifications instead of polling.
Use `GET /content/{id}` to poll for completion, then `GET /content/{id}/html` to retrieve the generated HTML.
# Vehicle selection options
Source: https://api-docs.hrizn.io/api-reference/content-types/vehicle-ymmt
List supported years, makes, models, and trims for catalog-based content
Use these endpoints to select a supported vehicle before creating a model landing page or comparison with `source=catalog`.
**Scope required:** `content:write`
Choose a year first, then use it to list makes. Continue with the selected make and model to retrieve the available trims.
## Endpoints
| Method | Path | Body | Returns |
| - | - | - | - |
| `GET` / `POST` | `/vehicle-ymmt/years` | `{}` (optional) | `{ years: number[] }` |
| `POST` | `/vehicle-ymmt/makes` | `{ year }` | `{ year, makes: [{ make }] }` |
| `POST` | `/vehicle-ymmt/models` | `{ year, make }` | `{ year, make, models: [{ model }] }` |
| `POST` | `/vehicle-ymmt/trims` | `{ year, make, model }` | `{ year, make, model, trims: [{ trim }] }` |
Subject to the same API key rate limits as other Public API routes.
# Create content
Source: https://api-docs.hrizn.io/api-reference/content/create
POST /content
Generate content from a completed IdeaCloud
Creates content from a completed IdeaCloud and starts generation immediately. Pass `selected_question_ids` to choose which questions to cover; otherwise the IdeaCloud's recommended questions are used.
**Scope required:** `content:write`
## Request body
UUID of a completed IdeaCloud.
One of: `basic`, `qa`, `expert`, `modellanding`, `comparison`, `salesevent`, `enhancedcontent`.
Array of question IDs to cover (UUIDs from [Get IdeaCloud questions](/api-reference/ideaclouds/get-questions), or legacy `q-{timestamp}-{index}` format). Defaults to the IdeaCloud's recommended questions.
Staff element UUIDs from [Get site staff](/api-reference/site/get-staff).
Required for `qa` and `expert` content unless staff was previously saved with
[Update IdeaCloud settings](/api-reference/ideaclouds/patch-settings). The
first UUID is used as the interview subject or expert.
UUID of a brand voice to use for generation.
Text generation tone. One of: `Informative`, `Authoritative`, `Persuasive`,
`Confident`, `Analytical`, `Empathetic`, `Witty`, `Enthusiastic`,
`Inspiring`, `Motivating`, `Creative`. Ignored when `brand_voice_id` is
provided.
Custom content title (max 500 characters). Defaults to the IdeaCloud's title.
Language for generated content. One of: `English`, `Spanish`, `Mandarin Chinese`, `Japanese`, `Korean`, `Arabic`, `Farsi`, `Hebrew`, `French`, `Tagalog`, `Vietnamese`, `Portuguese`, `Russian`.
Controls how dealer links are distributed in the generated content. `fixed_ops` prioritizes service and parts links inline, appending sales links as a cross-department CTA. `variable` prioritizes sales and financing links inline, appending service links as a CTA. `general` distributes all links evenly with no filtering. One of: `fixed_ops`, `variable`, `general`.
Automatically run a compliance check after generation.
Automatically generate SEO metadata, schemas, and social snippets.
Content depth preset that drives the article body. One of `concise`, `steady`, `balanced`, `substantial`, or `in-depth`. `concise` produces tight, direct prose; `balanced` (default) lets the topic and outline drive depth; `in-depth` produces thorough, exploratory prose. `steady` and `substantial` are intermediate stops between those extremes. Replaces `content_length`.
**Deprecated.** Article length is now driven by `content_depth`; this field is accepted for backward compatibility but has no effect on generated output. Remove from your integration when convenient.
One of `standard` or `visual`.
Visual design strategy when `output_format` is `visual`. One of `template`,
`custom`, or `user-template`.
Template UUID. Required when `visual_design_mode` is `user-template`.
Up to 50 target geography overrides. Each item contains an `element_id`
UUID and a non-negative integer `priority`.
For `qa` and `expert`, either include `selected_staff` in this request or
persist it first with `PATCH /ideaclouds/{id}/settings`. There is
no `PATCH /ideaclouds/{id}` endpoint without the `/settings`
suffix.
## Response
Returns `202 Accepted`:
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "b70db6bb-589e-42c9-a63a-5cdc2aee0b7e",
"status": "generating",
"article_type": "basic",
"title": "2026 Chevy Silverado 3500 DRW: Deep Dive",
"created_at": "2026-02-28T11:41:21.797772+00:00",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Content generation is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `content.completed` and `content.failed` notifications instead of polling.
# Create content (batch)
Source: https://api-docs.hrizn.io/api-reference/content/create-batch
POST /content/batch
Create up to 10 content items in a single request
Submit multiple content creation requests at once. Each item is processed independently — if one item fails validation, the others still succeed.
**Scope required:** `content:write`
## Request body
Array of content creation objects (max 10). Each item accepts the same fields as [Create content](/api-reference/content/create).
UUID of a completed IdeaCloud.
One of: `basic`, `qa`, `expert`, `modellanding`, `comparison`, `salesevent`.
Array of question IDs (format: `q-{timestamp}-{index}`). Retrieve available IDs from [Get IdeaCloud questions](/api-reference/ideaclouds/get-questions).
UUID of a brand voice.
Custom title (max 500 characters).
Language for generated content. One of: `English`, `Spanish`, `Mandarin Chinese`, `Japanese`, `Korean`, `Arabic`, `Farsi`, `Hebrew`, `French`, `Tagalog`, `Vietnamese`, `Portuguese`, `Russian`.
Link distribution strategy. One of: `fixed_ops`, `variable`, `general`.
Automatically run compliance after generation.
Automatically generate SEO metadata, schemas, and social snippets.
Content depth preset that drives the article body. One of `concise`, `steady`, `balanced`, `substantial`, or `in-depth`. Replaces `content_length`.
**Deprecated.** Article length is now driven by `content_depth`; this field is accepted for backward compatibility but has no effect.
## Example Request
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST https://api.app.hrizn.io/v1/public/content/batch \
-H "X-API-Key: hzk_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"ideacloud_id": "cec6a411-7632-498e-b2e8-afb1ea1857d7",
"article_type": "basic",
"language": "French",
"auto_compliance": true,
"auto_content_tools": true
},
{
"ideacloud_id": "1d1cf94d-803e-4459-89ca-6c246aa8a4a7",
"article_type": "qa",
"auto_compliance": true
},
{
"ideacloud_id": "30993ec0-907b-47a4-b5f1-9c1f6bd33194",
"article_type": "basic",
"title": "Custom Article Title"
}
]
}'
```
## Response
Returns `202 Accepted` with status for each item.
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"items": [
{
"id": "407d63a9-74b7-41a4-9468-09dfdb71b0da",
"status": "generating",
"article_type": "qa",
"title": "2026 Chevy Silverado 3500 DRW: Deep Dive",
"created_at": "2026-02-28T11:41:46.114731+00:00",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
},
{
"id": "2e06e64c-03a2-4ec5-854e-c0f385f1fecc",
"status": "generating",
"article_type": "expert",
"title": "2026 Chevy Silverado 3500 DRW: The Definitive Guide",
"created_at": "2026-02-28T11:41:46.073345+00:00",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
],
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Content generation is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `content.completed` and `content.failed` notifications instead of polling.
## Partial Failures
Each item in the batch is validated and processed independently. A single request may contain a mix of successful and failed items.
Check the `status` field on each item in the response:
| Status | Meaning |
| - | - |
| `generating` | Content creation started successfully |
| `failed` | Validation or processing failed — see `error` field |
The batch endpoint returns `202 Accepted` even if some items fail. Always check each item's `status` in the response.
## When to Use Batch vs. Single
| Scenario | Recommended |
| - | - |
| Creating a single article with custom question selection | [Create content](/api-reference/content/create) |
| Generating 3+ articles programmatically | **Create content (batch)** |
| Generating 50+ articles | Batch endpoint + throttling (see [Bulk Content Generation](/guides/bulk-content-generation)) |
Using batch reduces your request count by up to 10x, leaving more rate limit headroom for other API calls. For high-volume workflows, see the [Bulk Content Generation](/guides/bulk-content-generation) guide.
# Create content
Source: https://api-docs.hrizn.io/api-reference/content/create-content
/openapi.yaml post /content
Creates new content from a completed IdeaCloud and starts generation immediately.
# Create content in batch
Source: https://api-docs.hrizn.io/api-reference/content/create-content-in-batch
/openapi.yaml post /content/batch
Creates multiple content items in a single request (1-10 items).
# Create model landing page
Source: https://api-docs.hrizn.io/api-reference/content/create-model-landing-page
/openapi.yaml post /model-landing-pages
Creates a model research / landing page from either an inventory VIN
(`source=inventory`) or validated catalog YMMT (`source=catalog`).
Catalog labels must come from the `/vehicle-ymmt/*` cascade.
Supports the same create options used by Composer (tone/voice, depth, geo,
Layouts). The page is generated asynchronously. Use the returned `id`
with `GET /content/{id}` to check status and retrieve the result.
# Create sales event page
Source: https://api-docs.hrizn.io/api-reference/content/create-sales-event-page
/openapi.yaml post /sales-events
Creates a promotional page for a dealership sales event. Supports various
event categories including Sales Events, New Model Launches, Service Specials, and more.
The page is generated asynchronously. Use the returned `id` with
`GET /content/{id}` to check status and retrieve the result.
# Create vehicle comparison
Source: https://api-docs.hrizn.io/api-reference/content/create-vehicle-comparison
/openapi.yaml post /comparisons
Creates a vehicle comparison comparing 2-5 vehicles side-by-side.
Each vehicle must declare `source=inventory` (VIN) or `source=catalog`
(validated YMMT from `/vehicle-ymmt/*`). Free-text invent is rejected.
The comparison is generated asynchronously. Use the returned `id` with
`GET /content/{id}` to check status and retrieve the result.
# Regenerate content
Source: https://api-docs.hrizn.io/api-reference/content/generate
POST /content/{id}/generate
Re-trigger body generation for existing IdeaCloud-linked content
Re-triggers article body generation for content that is already linked to an IdeaCloud. Use this to refresh an existing article with updated options (title, brand voice, language, or content depth) without creating a new content record.
Question selection is fixed at creation time via [Create content](/api-reference/content/create). This endpoint does not accept `selected_question_ids`.
**Scope required:** `content:write`
## Path parameters
UUID of the content item to regenerate.
## Request body
All fields are optional. Omitted fields keep the values already stored on the content item.
UUID of a brand voice.
Custom content title.
Language for generated content. One of: `English`, `Spanish`, `Mandarin Chinese`, `Japanese`, `Korean`, `Arabic`, `Farsi`, `Hebrew`, `French`, `Tagalog`, `Vietnamese`, `Portuguese`, `Russian`.
Content depth preset that drives the article body. One of `concise`, `steady`, `balanced`, `substantial`, or `in-depth`.
**Deprecated.** Article length is now driven by `content_depth`; this field is accepted for backward compatibility but has no effect.
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "b50febaf-657a-4f6a-b951-2898aa079865",
"status": "generating",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Content generation is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `content.completed` and `content.failed` notifications instead of polling.
Returns `400` if the content item is not linked to an IdeaCloud. Content created via comparison, model landing, or sales event endpoints cannot be regenerated through this route.
# Get content
Source: https://api-docs.hrizn.io/api-reference/content/get
GET /content/{id}
Get details and component status of content
Returns content metadata and a summary of its components. **Scope required:** `content:read`
## Path parameters
UUID of the content.
## Response
Content status: `generating`, `complete`, or `failed`.
The category assigned to this content, containing `id` and `name`. Returns `null` if no category is assigned.
The IdeaCloud used to generate this content, containing `id` and `keyword`. Returns `null` if the content was not generated from an IdeaCloud (e.g. older content).
Flexible metadata object. For API-created content, includes `source` (`"public_api"`), `api_key_id`, and `api_creator_label` (formatted as "API - Name (email)"). May also contain generation parameters like `tone`, `language`, and `selected_question_ids`.
Publication state, separate from the top-level generation `status`:
* `canonical_url`: the existing CMS canonical URL, or null.
* `posted_url`: the latest externally reported URL, or null.
* `marked_posted_at`: the first posted-marker timestamp, or null; URL corrections preserve it.
* `publish_state`: `published`, `scheduled`, or `not_posted`, derived from Hrizn's manual, telemetry, and integrated publishing signals.
After [reporting an external publication](/api-reference/content/mark-posted), read this endpoint to confirm the saved URL and posted state. Reads are scoped to the authenticated API key's site. This does not change the integrated `/content/published` feed or imply Hrizn independently verified the page is live.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "4d42cdcf-e24f-4123-960e-6c15761fcfcf",
"title": "Unveiling the Power and Performance of the 2026 Chevy Silverado 3500 DRW",
"status": "complete",
"article_type": "basic",
"category": {
"id": "b24ad569-f7ce-47ad-be44-cec02c0fab70",
"name": "2026 Chevy Silverado 3500 DRW"
},
"ideacloud": null,
"metadata": {
"tone": "BrandVoice:profile-1751473166161",
"language": "English",
"maxTokens": 1600
},
"components": [
{ "type": "body", "status": "complete", "updated_at": "2026-02-27T21:42:56.625882+00:00" },
{ "type": "searchIntent", "status": "complete", "updated_at": "2026-02-27T21:42:57.458068+00:00" },
{ "type": "imagePrompt", "status": "complete", "updated_at": "2026-02-27T21:43:02.084779+00:00" },
{ "type": "seoMetadata", "status": "complete", "updated_at": "2026-02-27T21:46:57.094555+00:00" },
{ "type": "facebookSnip", "status": "complete", "updated_at": "2026-02-27T21:47:21.541289+00:00" }
],
"created_at": "2026-02-27T21:41:20.418301+00:00",
"updated_at": "2026-02-27T21:42:56.623718+00:00"
}
}
```
# Get a single component
Source: https://api-docs.hrizn.io/api-reference/content/get-a-single-component
/openapi.yaml get /content/{id}/components/{type}
# Get all components
Source: https://api-docs.hrizn.io/api-reference/content/get-all-components
/openapi.yaml get /content/{id}/components
# Get CMS-ready HTML
Source: https://api-docs.hrizn.io/api-reference/content/get-cms-ready-html
/openapi.yaml get /content/{id}/html
Returns CMS-ready HTML for the content body, matching the "Export to HTML" output in the dashboard. For standard (markdown-based) articles the output includes Bootstrap table classes for responsive styling. For AI Designed Layout articles the rendered layout HTML is returned. Every response ends with the Hrizn telemetry tag, exactly once: `
`. Paste it with the body so Hrizn can attribute the published page. Use `Accept: text/html` for raw HTML.
# Get content components
Source: https://api-docs.hrizn.io/api-reference/content/get-components
GET /content/{id}/components
Get all components or a specific component type
Returns content components (body, SEO metadata, schemas, social snippets, etc.). Optionally filter by component type.
**Scope required:** `content:read`
## Path parameters
UUID of the content.
## Optional path
Append `/{type}` to get a single component type. The type parameter is **case-insensitive** — `body`, `Body`, and `BODY` all work:
```
GET /content/{id}/components/seoMetadata
GET /content/{id}/components/SEOMETADATA
```
Available component types: `body`, `seoMetadata`, `pageSlugs`, `postTags`, `blogCategories`, `searchIntent`, `facebookSnip`, `twitterSnip`, `instagramSnip`, `googleBusinessSnip`, `videoScript`, `imagePrompt`, `articleSchema`, `authorSchema`, `organizationSchema`, `vehicleListingSchema`, `faqSchema`, `eventSchema`, `qaPageSchema`, `webPageSchema`, `webSiteSchema`, `breadcrumbSchema`, `layout_html`.
See [Component types](/api-reference/reference/component-types) for the full reference.
The `body` component is returned in its stored form. For rich-text articles that is Markdown. For AI Designed Layout articles it is rendered HTML and always ends with the Hrizn telemetry tag (``). For CMS-ready HTML of any article type, use [Get content HTML](/api-reference/content/get-html), which always includes the tag.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"components": [
{
"id": "89590820-899c-457a-8325-411011d65e92",
"type": "imagePrompt",
"content": "A commanding 2026 Chevy Silverado 3500 DRW pickup truck, gleaming metallic blue...",
"metadata": null,
"status": "complete",
"created_at": "2026-02-27T21:42:56.812584+00:00",
"updated_at": "2026-02-27T21:43:02.084779+00:00"
},
{
"id": "efa776ff-2ab4-4ac7-b591-9468e1c120f5",
"type": "body",
"content": "## Unveiling the Power and Performance of the 2026 Chevy Silverado 3500 DRW\n\nThe 2026 Chevy Silverado 3500 DRW is engineered to deliver...",
"metadata": null,
"status": "complete",
"created_at": "2026-02-27T21:41:23.938039+00:00",
"updated_at": "2026-02-27T21:42:56.625882+00:00"
},
{
"id": "e2d8a670-2f83-466c-b829-e21a9b70ab58",
"type": "searchIntent",
"content": "Commercial Intent",
"metadata": null,
"status": "complete",
"created_at": "2026-02-27T21:42:56.810587+00:00",
"updated_at": "2026-02-27T21:42:57.458068+00:00"
}
]
}
}
```
When requesting a single component type, the response returns the component object directly instead of the `components` array:
```json theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "efa776ff-2ab4-4ac7-b591-9468e1c120f5",
"type": "body",
"content": "## Unveiling the Power and Performance of the 2026 Chevy Silverado 3500 DRW\n\n...",
"metadata": null,
"status": "complete",
"created_at": "2026-02-27T21:41:23.938039+00:00",
"updated_at": "2026-02-27T21:42:56.625882+00:00"
}
}
```
# Get content details
Source: https://api-docs.hrizn.io/api-reference/content/get-content-details
/openapi.yaml get /content/{id}
Returns article metadata and components. When the article has a canonical URL and the API key includes the `analytics:read` scope, the response may include a `search` object with warehoused Search Console page-performance data. Keys with only `content:read` receive `search: null`.
# Get content HTML
Source: https://api-docs.hrizn.io/api-reference/content/get-html
GET /content/{id}/html
Get the CMS-ready HTML body of content
Returns the content's main body as **CMS-ready HTML**. The output is identical to what the "Export to HTML" button produces in the Hrizn dashboard and includes:
* **Bootstrap table classes** for responsive table styling
* **Hrizn telemetry tag** appended at the end of the content (see below)
* **Sanitized HTML** safe for direct CMS embedding
Send `Accept: text/html` to receive raw HTML instead of a JSON wrapper.
**Scope required:** `content:read`
## Hrizn telemetry tag
Every response ends with a Hrizn telemetry `div` that is unique to the article. It is guaranteed on every body returned by this endpoint (rich text and AI Designed Layout alike, including articles previously exported in-app) and appears exactly once. Paste it with the body — Hrizn uses it to attribute the published page.
```html theme={"theme":{"light":"github-light","dark":"github-dark"}}
```
| Attribute | Value |
| - | - |
| `data-site-id` | The dealership site UUID |
| `data-content-id` | The content UUID (same as the path `id`) |
| `data-content-title` | The article title, HTML-attribute escaped |
## Path parameters
UUID of the content.
## Response
Content UUID.
CMS-ready HTML string with Bootstrap table classes and the Hrizn telemetry tag.
Status of the body component (e.g. `complete`, `generating`).
ISO 8601 timestamp of last update.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "4d42cdcf-e24f-4123-960e-6c15761fcfcf",
"html": "Unveiling the Power and Performance of the 2026 Chevy Silverado 3500 DRW
\nThe 2026 Chevy Silverado 3500 DRW is engineered to deliver a true heavy-duty driving experience...
",
"component_status": "complete",
"updated_at": "2026-02-27T21:42:56.625882+00:00"
}
}
```
To get raw HTML directly (useful for embedding in a CMS), set the `Accept` header to `text/html`. The response body will be the HTML string without a JSON wrapper.
Tables in the HTML include Bootstrap classes (`table`, `table-striped`) for styling. If your CMS does not use Bootstrap, you may need to add equivalent CSS or strip these classes.
# Get publish data
Source: https://api-docs.hrizn.io/api-reference/content/get-publish-data
GET /content/{id}/publish-data
Get the complete publish payload for CMS integration
Returns a unified publish payload containing everything needed to push content to a CMS or website: article metadata, publishing status, taxonomy, images, social tags, rendered HTML body, SEO meta tags, and structured data (JSON-LD schema).
**Scope required:** `content:read`
Returns `404` if the content is not published or scheduled. Use [List published content](/api-reference/content/list-published) to discover available content first.
## Path parameters
UUID of the content.
## Response
The response is a single object with the following top-level sections:
Core article metadata: `id`, `title`, `article_type`, `created_at`, `updated_at`.
Publishing state: `status` (`published` or `scheduled`), `slug`, `canonical_url`, `date` (ISO 8601, UTC), `published_at` (ISO 8601, UTC).
All date and time fields — including scheduled post dates — are returned in **UTC** with a `+00:00` offset. Convert to the appropriate local timezone on your side before displaying to end users.
Content classification: `blog_tags` (string array), `blog_categories` (string array), `keywords` (string array).
Resolved image URLs: `featured`, `og`, `twitter`. Each is a fully-qualified URL or `null`.
Social sharing metadata: `og_title`, `og_description`, `twitter_title`, `twitter_description`.
The full rendered HTML body, ready for CMS embedding. For visual builder content this is the rendered layout HTML; for markdown content it includes Bootstrap table classes. Every non-null `body_html` ends with the Hrizn telemetry tag (``), exactly once — paste it with the body.
Rendered SEO meta tag HTML string (title, og, twitter meta tags) for injection into the page ``.
JSON-LD structured data (`@context`, `@graph` with `NewsArticle`, `Author`, `Organization`, etc.).
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"article": {
"id": "bccf2a98-55ad-437d-b0dc-d505d95c88cf",
"title": "Land Cruiser vs Bronco Face-Off: Rugged Luxury or Off-Road Fun?",
"article_type": "comparison",
"created_at": "2026-02-13T22:56:41.872443+00:00",
"updated_at": "2026-04-11T15:45:37.297587+00:00"
},
"publishing": {
"status": "published",
"slug": "land-cruiser-vs-bronco-rock-hill-comparison",
"canonical_url": "https://www.toyotarockhill.com/land-cruiser-vs-bronco-rock-hill-comparison",
"date": "2026-04-11T15:45:37.264+00:00",
"published_at": "2026-04-11T15:45:37.264+00:00"
},
"taxonomy": {
"blog_tags": ["Toyota Land Cruiser", "Ford Bronco", "SUV Comparison"],
"blog_categories": ["Vehicle Comparisons"],
"keywords": ["land cruiser vs bronco", "toyota suv comparison"]
},
"images": {
"featured": "https://assets.hrizn.io/public/media-library/9c894353.../featured.png",
"og": "https://assets.hrizn.io/public/media-library/9c894353.../og.png",
"twitter": "https://assets.hrizn.io/public/media-library/9c894353.../twitter.png"
},
"social": {
"og_title": "Challenge the Trails: Land Cruiser vs. Bronco Showdown!",
"og_description": "Dive into the ultimate showdown at Toyota of Rock Hill! Is the Land Cruiser's rugged luxury your style, or do you crave the Bronco's off-road thrills?",
"twitter_title": "Rugged Meets Refined: Land Cruiser or Bronco for Your Next Adventure?",
"twitter_description": "Who reigns supreme on the off-road trails? Compare the Toyota Land Cruiser and Ford Bronco at Toyota of Rock Hill."
},
"body_html": "Land Cruiser vs Bronco Face-Off
When it comes to choosing between these two iconic SUVs...
",
"seo_html": "\nToyota Land Cruiser vs Ford Bronco in Rock Hill SC | Toyota of Rock Hill\n",
"schema": {
"@context": "https://schema.org",
"@graph": [
{
"@type": "NewsArticle",
"@id": "#article",
"headline": "Land Cruiser vs Bronco Face-Off: Rugged Luxury or Off-Road Fun?",
"datePublished": "2026-02-13T22:56:41.872Z",
"dateModified": "2026-04-11T15:43:39.100Z"
}
]
}
}
}
```
Subscribe to the `content.published` webhook event to automatically trigger a CMS sync whenever content is published. Then call this endpoint to fetch the full payload.
# List content
Source: https://api-docs.hrizn.io/api-reference/content/list
GET /content
List all content for this site
Returns a paginated list of content. **Scope required:** `content:read`
## Query parameters
Results per page (1-100).
Pagination cursor.
Filter by article type (`basic`, `qa`, `expert`, `modellanding`, `comparison`, `salesevent`).
Filter by content intent (`fixed_ops`, `variable`, `general`).
Filter by target audience (`in_market_buyer`, `service_customer`, `owner`, `general_public`, `enthusiast`).
Filter by funnel stage (`awareness`, `consideration`, `decision`, `retention`).
Filter by content lifespan (`evergreen`, `seasonal`, `time_bound`).
Filter by search intent type (`informational`, `commercial`, `transactional`, `navigational`).
## Response
Content status: `generating`, `complete`, or `failed`.
The category assigned to this content, containing `id` and `name`. Returns `null` if no category is assigned.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": [
{
"id": "4d42cdcf-e24f-4123-960e-6c15761fcfcf",
"title": "Unveiling the Power and Performance of the 2026 Chevy Silverado 3500 DRW",
"article_type": "basic",
"status": "complete",
"category": {
"id": "b24ad569-f7ce-47ad-be44-cec02c0fab70",
"name": "2026 Chevy Silverado 3500 DRW"
},
"created_at": "2026-02-27T21:41:20.418301+00:00",
"updated_at": "2026-02-27T21:42:56.623718+00:00"
},
{
"id": "e3e864ce-06fc-477e-b032-8efd8c9e85cf",
"title": "2026 Chevrolet Trax for Sale in Huntington, NY",
"article_type": "modellanding",
"status": "complete",
"category": null,
"created_at": "2026-02-27T21:00:35.026534+00:00",
"updated_at": "2026-02-27T21:03:00.811516+00:00"
}
],
"pagination": {
"has_more": true,
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMi0yN1QyMTowMDozNS4wMjY1MzQrMDA6MDAiLCJpZCI6ImUzZTg2NGNlLTA2ZmMtNDc3ZS1iMDMyLThlZmQ4YzllODVjZiJ9",
"total_count": 487
}
}
```
# List content
Source: https://api-docs.hrizn.io/api-reference/content/list-content
/openapi.yaml get /content
# List Layouts templates
Source: https://api-docs.hrizn.io/api-reference/content/list-layouts-templates
/openapi.yaml get /layouts
Lists active web builder templates (Layouts) for model landing or
comparison create. Use `selected_template_id` from this list when
`output_format=visual` and `visual_design_mode=user-template`.
Requires `content:write`.
# List published content
Source: https://api-docs.hrizn.io/api-reference/content/list-published
GET /content/published
List content that is published or scheduled
Returns a paginated list of content with `posting_status` of `published` or `scheduled`. Use this endpoint to discover which content is ready for your CMS or website integration.
**Scope required:** `content:read`
## Query parameters
Results per page (1-100).
Pagination cursor from a previous response.
Filter by posting status: `published` or `scheduled`. Omit to return both.
## Response
Each item in the response includes publishing metadata alongside the standard content fields.
Posting status: `published` or `scheduled`.
URL slug for the published content.
ISO 8601 publish or scheduled date in UTC.
ISO 8601 timestamp in UTC when the content was first published. Null for scheduled content.
All date and time fields — including scheduled post dates — are returned in **UTC** with a `+00:00` offset. Convert to the appropriate local timezone on your side before displaying to end users.
Fully-resolved URL of the featured image.
Best available public URL for citing this article (posting canonical → published → posted).
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": [
{
"id": "bccf2a98-55ad-437d-b0dc-d505d95c88cf",
"title": "Land Cruiser vs Bronco Face-Off: Rugged Luxury or Off-Road Fun?",
"article_type": "comparison",
"status": "published",
"slug": "land-cruiser-vs-bronco-rock-hill-comparison",
"date": "2026-04-11T15:45:37.264+00:00",
"published_at": "2026-04-11T15:45:37.264+00:00",
"featured_image": "https://assets.hrizn.io/public/media-library/9c894353.../1771026288320.png",
"citation_url": "https://www.exampledealer.com/blog/land-cruiser-vs-bronco-rock-hill-comparison",
"created_at": "2026-02-13T22:56:41.872443+00:00",
"updated_at": "2026-04-11T15:45:37.297587+00:00"
},
{
"id": "e3e864ce-06fc-477e-b032-8efd8c9e85cf",
"title": "2026 Toyota Corolla Cross Hybrid Fuel Economy Guide",
"article_type": "basic",
"status": "scheduled",
"slug": "2026-corolla-cross-hybrid-fuel-economy",
"date": "2026-04-15T09:00:00.000+00:00",
"published_at": null,
"featured_image": null,
"citation_url": null,
"created_at": "2026-03-01T14:20:00.000+00:00",
"updated_at": "2026-04-10T18:30:00.000+00:00"
}
],
"pagination": {
"has_more": true,
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMy0wMVQxNDoyMDowMC4wMDArMDA6MDAiLCJpZCI6ImUzZTg2NGNlLTA2ZmMtNDc3ZS1iMDMyLThlZmQ4YzllODVjZiJ9",
"total_count": 42
}
}
```
Use the `status` query parameter to filter for only `published` content when building a CMS sync, or only `scheduled` content to preview upcoming publications.
To retrieve the full publish payload (HTML body, SEO metadata, social tags, schema) for a specific content item, use the [Get publish data](/api-reference/content/get-publish-data) endpoint.
# List published content
Source: https://api-docs.hrizn.io/api-reference/content/list-published-content
/openapi.yaml get /content/published
Returns a paginated list of content with posting_status of published or scheduled.
# List selectable makes for a year
Source: https://api-docs.hrizn.io/api-reference/content/list-selectable-makes-for-a-year
/openapi.yaml post /vehicle-ymmt/makes
Lists supported makes for a selected year. Requires `content:write`.
# List selectable models for year + make
Source: https://api-docs.hrizn.io/api-reference/content/list-selectable-models-for-year-+-make
/openapi.yaml post /vehicle-ymmt/models
Lists supported models for a selected year and make. Requires `content:write`.
# List selectable trims for year + make + model
Source: https://api-docs.hrizn.io/api-reference/content/list-selectable-trims-for-year-+-make-+-model
/openapi.yaml post /vehicle-ymmt/trims
Lists supported trims for a selected year, make, and model. Requires `content:write`.
# List selectable vehicle years
Source: https://api-docs.hrizn.io/api-reference/content/list-selectable-vehicle-years
/openapi.yaml get /vehicle-ymmt/years
Lists supported years for catalog-based content creation. Requires `content:write`.
# List selectable vehicle years
Source: https://api-docs.hrizn.io/api-reference/content/list-selectable-vehicle-years-1
/openapi.yaml post /vehicle-ymmt/years
Same as GET /vehicle-ymmt/years.
# Mark content as externally posted
Source: https://api-docs.hrizn.io/api-reference/content/mark-content-as-externally-posted
/openapi.yaml post /content/{id}/posted
Report where your integration already published a Hrizn content item.
Requires X-API-Key, content:write, and the API_ACCESS plan entitlement.
The key-associated site constrains both reads and conditional writes;
missing content and content belonging to another site return the same 404.
Only posted_url is accepted; site, customer, and actor IDs are never accepted.
This records the existing manual posted marker and URL, without crawling,
independently verifying, or publishing the page. Generation state, CMS
publishing state, and telemetry are unchanged. This callback does not add
content to /content/published or make /content/{id}/publish-data available.
marked_posted_at is the server-recorded first report time, not an external
publication date. Corrections preserve it. Retrying the current URL is a
no-op; a different URL replaces it. The last successfully applied update
wins. Serialize corrections per content ID and stop superseded retries;
there is no event version. On contention (409), retry only the latest payload.
X-Idempotency-Key response caching is not supported; authorization reruns
on every call. Backfill known content-ID/URL pairs one request at a time;
no scanning, batch, unpublish, or new MCP tool is provided.
# Mark content as externally posted
Source: https://api-docs.hrizn.io/api-reference/content/mark-posted
POST /content/{id}/posted
Report the live URL after your integration publishes Hrizn content
After your integration publishes content to an external content management system (CMS) or website, call `POST /v1/public/content/{id}/posted` to record its URL in Hrizn.
**Authentication required:** `X-API-Key`
**Scope required:** `content:write`
**Plan entitlement required:** API Access (`API_ACCESS`)
The API key's associated site constrains both the content lookup and the conditional write. Missing content and content belonging to another site return the same `404 not_found`. Authorization is checked again on every request, including retries.
## Verify the saved state
Call `GET /v1/public/content/{id}` with `content:read` on the same site's key. Its `publishing` object returns `posted_url`, `marked_posted_at`, and `publish_state`, alongside the unchanged `canonical_url`. The top-level `status` still describes generation. Hrizn's existing content UI reflects the saved marker and URL on normal refetch or reopening the content.
## Path parameters
The Hrizn content UUID returned when you created the content. Keep this ID alongside the external URL in your integration. An external CMS ID, job ID, or IdeaCloud ID is not a content ID.
## Request body
An absolute HTTP or HTTPS URL with no embedded credentials. Hrizn trims surrounding whitespace before validation; the trimmed URL must be at most 4096 characters.
The body accepts **only** `posted_url`. Unknown fields are rejected. Send no site, customer, actor, external publication timestamp, or event-version fields; tenant scope and attribution come from the authenticated request.
```bash theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl -X POST https://api.app.hrizn.io/v1/public/content/b50febaf-657a-4f6a-b951-2898aa079865/posted \
-H "X-API-Key: hzk_your_key_here" \
-H "Content-Type: application/json" \
-d '{"posted_url":"https://www.example.com/blog/hybrid-suv-guide"}'
```
## Response
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "b50febaf-657a-4f6a-b951-2898aa079865",
"posted_url": "https://www.example.com/blog/hybrid-suv-guide",
"marked_posted_at": "2026-09-11T15:00:00.000Z",
"publish_state": "published"
}
}
```
`marked_posted_at` is the time the server first recorded the report, not an independently verified publication date or a timestamp supplied by your CMS. URL corrections preserve this time. `publish_state: "published"` acknowledges the recorded external publication report.
## Retries and URL corrections
* A retry with the current URL is a no-op and preserves the first marked time.
* A different URL replaces the recorded URL and preserves the first marked time.
* The last successfully applied update wins. There is no event version or ordering based on the CMS publication date.
* Serialize URL corrections for each content ID and stop retrying superseded URLs. An old retry submitted after a correction can otherwise replace the correction.
* For `409 conflict` caused by concurrent update contention, retry only the latest intended payload.
This endpoint does not support response caching through `X-Idempotency-Key`. Its same-current-URL no-op behavior is separate from the [idempotency-key contract](/concepts/idempotency). Every call re-runs authorization.
## What this callback records
Hrizn reuses the existing `manual` posted marker and stores the reported URL. The callback does not crawl or independently verify the page, perform publishing, change generation state, change CMS publishing state, or modify telemetry.
Recording an external publication does not add the item to the integrated [published-content feed](/api-reference/content/list-published) or unlock [publish-data](/api-reference/content/get-publish-data). Those endpoints retain their existing CMS publishing requirements.
## Backfill existing publications
Use your integration's known Hrizn content-ID/URL pairs and send one request per pair. The server records when each report is received, rather than backdating it to the original publication. This callback provides no scanning, batch, or unpublish operation, and adds no MCP tools.
## Errors
* `400 validation_error`: invalid content UUID, invalid URL, or unknown body fields.
* `401`: missing or invalid API key.
* `403 forbidden`: the API key lacks `content:write`.
* `403 plan_upgrade_required`: the key-associated site lacks the `API_ACCESS` entitlement.
* `404 not_found`: missing content or content belonging to another site; the responses are indistinguishable.
* `409 conflict`: concurrent update contention; retry the latest intended payload.
* `429`: rate limit exceeded; follow the [rate-limit guidance](/rate-limiting).
* `503 service_unavailable`: publication recording is temporarily unavailable.
* `500`: unexpected internal server error.
Failures use the standard [error envelope](/concepts/errors). A reported URL is not proof that a page is live; keep publication verification in your integration.
# Regenerate content
Source: https://api-docs.hrizn.io/api-reference/content/regenerate-content
/openapi.yaml post /content/{id}/generate
Re-triggers article body generation for existing IdeaCloud-linked content. Question selection is fixed at creation time. Returns 400 if the content is not linked to an IdeaCloud.
# Health check
Source: https://api-docs.hrizn.io/api-reference/health/health-check
/openapi.yaml get /health
# Apply recommended selection
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/apply-recommended
POST /ideaclouds/{id}/selection/apply-recommended
Seed the basket from `recommended_question_ids` (capped at 15). Returns the full numbered basket.
**Scope required:** `ideaclouds:write`
# Create IdeaCloud
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/create
POST /ideaclouds
Start AI-powered keyword research on a topic
Creates a new IdeaCloud that researches a keyword or topic, gathers questions from the web, clusters them by intent, and identifies the best angles for content.
**Scope required:** `ideaclouds:write`
## Request body
The keyword or topic to research (1–500 characters). Optional when creating from a suggestion id.
Optional category UUID to associate with this IdeaCloud.
Id from [List create suggestions](/api-reference/ideaclouds/create-suggestions) (e.g. `content:…` or `fast_start:…`). Consumes the suggestion so it will not reappear in the app or API.
Clarity content suggestion UUID (act-on path).
One of `fast_start`, `se_ranking`, `gsc`, `ga4` — with `external_fingerprint`.
Stable fingerprint for external/Fast Start suppressions.
## Response
Returns `202 Accepted` with the IdeaCloud ID and initial status.
UUID of the created IdeaCloud.
Initial status: `researching`.
The keyword being researched.
ISO 8601 timestamp.
Informational message about async processing and webhook configuration.
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "bd72cd59-beda-4ce5-a9a1-20acf16c9a5d",
"status": "researching",
"keyword": "2026 Chevrolet Equinox EV range and features",
"created_at": "2026-02-28T11:39:55.287Z",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
IdeaCloud research is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `ideacloud.completed` and `ideacloud.failed` notifications instead of polling.
# Create IdeaClouds (batch)
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/create-batch
POST /ideaclouds/batch
Create up to 25 IdeaClouds in a single request
Submit multiple keywords for research in one request. Each item is processed independently.
**Scope required:** `ideaclouds:write`
## Request body
Array of IdeaCloud creation objects (max 25).
The keyword or topic to research.
Optional category UUID.
## Response
Returns `202 Accepted` with status for each item.
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"items": [
{
"id": "0b3252dd-d82c-4dab-9656-c6095163bb30",
"keyword": "best SUVs for families 2026",
"status": "researching"
},
{
"id": "edc2bcc6-88d5-46d2-94cb-009236562b7e",
"keyword": "Chevrolet Silverado towing capacity guide",
"status": "researching"
}
],
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
IdeaCloud research is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `ideacloud.completed` and `ideacloud.failed` notifications instead of polling.
# Create IdeaCloud
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/create-ideacloud
/openapi.yaml post /ideaclouds
Creates a new IdeaCloud and begins AI-powered keyword research.
# Create IdeaClouds in batch
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/create-ideaclouds-in-batch
/openapi.yaml post /ideaclouds/batch
Creates multiple IdeaClouds in a single request (1-25 items).
# List create suggestions
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/create-suggestions
GET /ideaclouds/create-suggestions
Compact create-dropdown suggestions (content + Fast Start) with the same act-on / external-suppression filters used by Composer. Requires ideaclouds:write.
Returns compact IdeaCloud create-dropdown suggestions (content + Fast Start) using the same act-on / external-suppression filters as Composer. Consumed suggestions do not reappear here or in the app.
**Scope required:** `ideaclouds:write`
# Get IdeaCloud
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get
GET /ideaclouds/{id}
Get details and status of a specific IdeaCloud
Returns the full details of an IdeaCloud including its status, title, synopsis, tags, and recommended questions with their text.
**Scope required:** `ideaclouds:read`
## Path parameters
UUID of the IdeaCloud.
## Response
The category assigned to this IdeaCloud, containing `id` and `name`. Returns `null` if no category is assigned.
Array of recommended question objects, each containing the question ID and its text. Only populated when the IdeaCloud status is `complete`.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "23a66cb1-f5d9-4c91-b9d2-06c8203bd251",
"keyword": "2026 Chevy Silverado 3500 DRW",
"title": "2026 Chevy Silverado 3500 DRW: Deep Dive",
"synopsis": "Comprehensive exploration of the 2026 Chevy Silverado 3500 DRW, covering specs, features, comparisons, and ownership considerations.",
"tags": [
"2026 Silverado 3500 DRW",
"Chevy dually",
"truck towing",
"diesel truck",
"heavy-duty truck"
],
"status": "complete",
"category": null,
"recommended_questions": [
{ "id": "q-1772225333602-60", "question": "What are the key specs for the 2026 Chevy Silverado 3500 DRW?" },
{ "id": "q-1772225333601-0", "question": "What is the maximum towing capacity of the 2026 Chevy Silverado 3500 DRW?" },
{ "id": "q-1772225333601-5", "question": "What are the engine options for the 2026 Silverado 3500 dually?" },
{ "id": "q-1772225333601-20", "question": "What is the starting price for a 2026 Chevy Silverado 3500 DRW?" },
{ "id": "q-1772225333602-30", "question": "How does the 2026 Silverado 3500 DRW compare to the Ford F-350 DRW?" }
],
"created_at": "2026-02-27T20:47:44.372053+00:00",
"updated_at": "2026-02-27T20:47:44.372053+00:00"
}
}
```
Question IDs use the format `q-{timestamp}-{index}` (e.g. `q-1772246824308-0`), not UUIDs. Use these IDs as-is when passing `selected_question_ids` to the content creation endpoints.
# Get IdeaCloud cluster
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-cluster
GET /ideaclouds/{id}/clusters/{clusterId}
Returns all questions in one research cluster for text-first curation.
**Scope required:** `ideaclouds:read`
# Get IdeaCloud cluster outline
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-ideacloud-cluster-outline
/openapi.yaml get /ideaclouds/{id}/outline
Text-first cluster summary (labels, counts, sample titles) for MCP curation. Prefer over dumping every question.
# Get IdeaCloud details
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-ideacloud-details
/openapi.yaml get /ideaclouds/{id}
# Get ordered question basket
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-ordered-question-basket
/openapi.yaml get /ideaclouds/{id}/selection
# Get IdeaCloud outline
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-outline
GET /ideaclouds/{id}/outline
Text-first cluster summary (labels, counts, sample titles) for MCP curation. Prefer over dumping every question.
Returns a text-first cluster outline (labels, counts, sample titles) for MCP curation. Prefer this over dumping every question.
**Scope required:** `ideaclouds:read`
# Get IdeaCloud questions
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-questions
GET /ideaclouds/{id}/questions
Get the researched questions and clusters from an IdeaCloud
Returns the questions discovered during research, organized into clusters by search intent. Only available after the IdeaCloud reaches `complete` status.
**Scope required:** `ideaclouds:read`
## Path parameters
UUID of the IdeaCloud.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"id": "23a66cb1-f5d9-4c91-b9d2-06c8203bd251",
"status": "complete",
"questions": [
{
"id": "q-1772225333601-0",
"question": "What is the maximum towing capacity of the 2026 Chevy Silverado 3500 DRW?",
"cluster_id": "cluster-0",
"source_url": "https://www.chevrolet.com/trucks/silverado/heavy-duty",
"source_title": null,
"is_recommended": true
},
{
"id": "q-1772225333601-1",
"question": "What is the maximum conventional towing capacity?",
"cluster_id": "cluster-0",
"source_url": "https://www.chevrolet.com/trucks/silverado/heavy-duty",
"source_title": null,
"is_recommended": false
},
{
"id": "q-1772225333601-2",
"question": "How much does the 6.6L gas engine tow in the 3500 DRW?",
"cluster_id": "cluster-0",
"source_url": "https://www.caranddriver.com/chevrolet/silverado-2500hd-3500hd",
"source_title": null,
"is_recommended": false
}
],
"clusters": [
{ "id": "cluster-0", "label": "Towing and Payload Capacity", "question_count": 29 },
{ "id": "cluster-1", "label": "Engine and Performance", "question_count": 15 }
],
"recommended_question_ids": [
"q-1772225333602-60",
"q-1772225333601-0",
"q-1772225333601-5"
]
}
}
```
Question IDs use the format `q-{timestamp}-{index}` (e.g. `q-1772246824308-0`), not UUIDs. Use these IDs as-is when passing `selected_question_ids` to the content creation and generation endpoints.
Cluster IDs use the format `cluster-{index}` (e.g. `cluster-0`). Each question's `cluster_id` references one of the cluster objects in the `clusters` array.
# Get questions and clusters
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-questions-and-clusters
/openapi.yaml get /ideaclouds/{id}/questions
Returns research questions and clusters. If research is in progress, arrays are empty.
# Get questions in one cluster
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-questions-in-one-cluster
/openapi.yaml get /ideaclouds/{id}/clusters/{clusterId}
# Get IdeaCloud selection
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/get-selection
GET /ideaclouds/{id}/selection
Returns the numbered priority basket (`draft_selected_question_ids`) with resolved question text and cluster labels.
**Scope required:** `ideaclouds:read`
# List IdeaClouds
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/list
GET /ideaclouds
List all IdeaClouds for this site
Returns a paginated list of IdeaClouds for the site associated with your API key.
**Scope required:** `ideaclouds:read`
## Query parameters
Results per page (1-100).
Pagination cursor from a previous response.
Filter by status. Possible values: `researching` (research in progress), `complete` (ready to use for content creation), `failed` (research encountered an error).
Search by keyword (case-insensitive partial match).
## Response
The category assigned to this IdeaCloud, containing `id` and `name`. Returns `null` if no category is assigned.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": [
{
"id": "23a66cb1-f5d9-4c91-b9d2-06c8203bd251",
"keyword": "2026 Chevy Silverado 3500 DRW",
"title": "2026 Chevy Silverado 3500 DRW: Deep Dive",
"synopsis": "Comprehensive exploration of the 2026 Chevy Silverado 3500 DRW, covering specs, features, comparisons, and ownership considerations.",
"status": "complete",
"category": null,
"created_at": "2026-02-27T20:47:44.372053+00:00",
"updated_at": "2026-02-27T20:47:44.372053+00:00"
},
{
"id": "c65aed07-891e-478a-a5c0-9c07c41171f1",
"keyword": "2026 Chevy Silverado 3500 DRW",
"title": "2026 Chevy Silverado 3500 DRW: The Definitive Guide",
"synopsis": "This research consolidates 92 frequently asked questions about the 2026 Chevy Silverado 3500 DRW (dually) to create a comprehensive resource.",
"status": "complete",
"category": null,
"created_at": "2026-02-27T20:47:29.94934+00:00",
"updated_at": "2026-02-27T20:47:29.94934+00:00"
}
],
"pagination": {
"has_more": true,
"next_cursor": "eyJjcmVhdGVkX2F0IjoiMjAyNi0wMi0yN1QyMDo0NzoyOS45NDkzNCswMDowMCIsImlkIjoiYzY1YWVkMDctODkxZS00NzhhLWE1YzAtOWMwN2M0MTE3MWYxIn0=",
"total_count": 77
}
}
```
# List IdeaCloud create suggestions
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/list-ideacloud-create-suggestions
/openapi.yaml get /ideaclouds/create-suggestions
Compact create-dropdown suggestions (content + Fast Start) with the same act-on / external-suppression filters used by Composer. Requires ideaclouds:write.
# List IdeaClouds
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/list-ideaclouds
/openapi.yaml get /ideaclouds
Returns a paginated list of IdeaClouds for your site.
# Update IdeaCloud settings
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/patch-settings
PATCH /ideaclouds/{id}/settings
Persist Composer accordion draft_settings (article type, tone, Layouts, geo, etc.).
Persist Composer accordion `draft_settings` (article type, staff for qa/expert, tone/voice, depth, geo, Layouts). Used by MCP before `POST /content`.
**Scope required:** `ideaclouds:write`
For `qa` and `expert`, pass `selected_staff` as an array of staff element UUIDs
from [Get site staff](/api-reference/site/get-staff). The first UUID is used as
the interview subject or expert. You can alternatively provide the same field
directly to `POST /content`.
The `/settings` suffix is required. `PATCH /ideaclouds/{id}` is not
an API endpoint.
# Set IdeaCloud selection
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/put-selection
PUT /ideaclouds/{id}/selection
Replace draft_selected_question_ids (0–15). Returns full numbered basket.
Replace the ordered question basket (0–15 ids that belong to the graph). Returns the full numbered basket.
**Scope required:** `ideaclouds:write`
# Replace ordered question basket
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/replace-ordered-question-basket
/openapi.yaml put /ideaclouds/{id}/selection
Replace draft_selected_question_ids (0–15). Returns full numbered basket.
# Seed basket from recommended questions
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/seed-basket-from-recommended-questions
/openapi.yaml post /ideaclouds/{id}/selection/apply-recommended
# Update IdeaCloud draft settings
Source: https://api-docs.hrizn.io/api-reference/ideaclouds/update-ideacloud-draft-settings
/openapi.yaml patch /ideaclouds/{id}/settings
Persist Composer accordion draft_settings (article type, tone, Layouts, geo, etc.).
# Generate image
Source: https://api-docs.hrizn.io/api-reference/images/generate
POST /images/generate
Start asynchronous AI image generation into the Media Library
Starts AI image generation into the site's Media Library and returns `202` with the `image_id` — the Media Library asset id — as soon as the job is queued. Poll [Get image](/api-reference/images/get-image) or subscribe to the `image.generation.completed` / `image.generation.failed` webhook events.
Pass `asset_id` to **regenerate** an existing generated image in place (same `image_id`, new render).
**Scope required:** `images:write`
Plan entitlement (`IMAGE_GENERATION`) is checked before anything is created. A site without access receives `403 plan_upgrade_required` with `required_plan` in the error details, and no asset or job is created.
## Request body
What to render — subject, setting, mood — in plain language (max 8,000 chars). Hrizn handles model prompting and the E-E-A-T disclaimer.
`"16:9"`, `"1:1"`, `"4:5"`, etc. Defaults to landscape.
Attach the image to a Hrizn content item as an article image.
Existing generated image to regenerate in place.
Up to 4 Media Library asset keys used as visual references.
Alternative to the `X-Idempotency-Key` header. Replays with the same key return the same `image_id` without a second render.
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"image_id": "2c9c5b1e-6d0d-4c74-9c8f-3b1e0a5d8f21",
"generation_id": "7a3f2e10-1b2c-4d5e-8f90-abcdef123456",
"status": "generating",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
```json 403 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"error": {
"code": "plan_upgrade_required",
"message": "Pro plan required for AI image generation.",
"details": {
"feature": "IMAGE_GENERATION",
"required_plan": "Pro",
"current_plan": "free"
}
}
}
```
Image generation usually finishes in under a minute. Configure [webhooks](/webhooks) for `image.generation.completed` (payload includes `asset_id` and `image_url`) rather than polling.
# Generate AI image
Source: https://api-docs.hrizn.io/api-reference/images/generate-ai-image
/openapi.yaml post /images/generate
Starts asynchronous AI image generation into the site Media Library and returns 202 with the image_id (the Media Library asset id). Poll GET /images/{imageId} or subscribe to image.generation.completed / image.generation.failed. Pass asset_id to regenerate an existing generated image in place. Entitlement (IMAGE_GENERATION) is checked before anything is created — a denied plan returns 403 plan_upgrade_required with no side effects. Generated images are representative renders carrying an E-E-A-T disclaimer.
# Get image
Source: https://api-docs.hrizn.io/api-reference/images/get-image
GET /images/{imageId}
Read one Media Library image, or poll an asynchronous image generation by image_id
Returns one Media Library image: its public URL, alt text, AI-written title / caption / description, tags, dimensions, the prompt that produced it, the E-E-A-T disclaimer, the content item it is attached to, and every social variant cut (preset, size, URL).
This is also the poll endpoint after [Generate image](/api-reference/images/generate). The first five fields — `image_id`, `generation_id`, `status`, `image_url`, `error` — are the poll contract: `status` is `generating` until the worker finishes, then `complete` (with `image_url`) or `error` (with `error`). Prefer the `image.generation.completed` / `image.generation.failed` [webhooks](/webhooks) over polling.
Assets that belong to a different site return `404`.
**Scope required:** `images:read` (keys holding only `images:write` may still poll)
## Path parameters
The Media Library asset UUID (the `image_id` returned by Generate image or List images).
## Response fields
| Field | Notes |
| - | - |
| `alt_text` | Accessibility text. AI images receive an AI-written value shortly after generation. |
| `title`, `caption`, `description` | AI-written once the alt-text pass completes; before that they echo the prompt. |
| `generation.prompt` | The creative prompt the caller supplied. |
| `generation.generation_prompt` | The expanded prompt Hrizn sent to the model. |
| `generation.disclaimer` | Representative-image disclaimer to show alongside the render. |
| `article_id` | Content item the image is attached to, if any. |
| `parent_image_id` | Set when this asset is itself a social variant of another image. |
| `variants[]` | Social cuts of this image: `preset_key`, `preset_label`, `width`, `height`, `aspect_ratio`, `image_url`. |
```json 200 (complete) theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"image_id": "2c9c5b1e-6d0d-4c74-9c8f-3b1e0a5d8f21",
"generation_id": "7a3f2e10-1b2c-4d5e-8f90-abcdef123456",
"status": "complete",
"image_url": "https://assets.app.hrizn.io/public/media-library/8f1c.../7a3f2e10.jpg",
"error": null,
"source": "ai",
"alt_text": "Red Toyota RAV4 Hybrid parked outside a dealership at sunset",
"title": "Red RAV4 Hybrid at Sunset",
"caption": "A red RAV4 Hybrid in front of a modern dealership at golden hour.",
"description": "Representative render of a red RAV4 Hybrid for a landing page hero.",
"tags": ["ai", "rav4"],
"width": 1376,
"height": 768,
"aspect_ratio": "16:9",
"created_at": "2026-09-06T14:28:00.000Z",
"updated_at": "2026-09-06T14:28:31.000Z",
"generated_at": "2026-09-06T14:28:27.609Z",
"generation": {
"prompt": "A red Toyota RAV4 hybrid parked in front of a modern dealership at golden hour",
"generation_prompt": "Photorealistic red Toyota RAV4 Hybrid, three-quarter front view, ...",
"disclaimer": "Representative image. Actual vehicle may vary."
},
"article_id": "9d2e1f30-4b5c-4d6e-8f70-1234567890ab",
"parent_image_id": null,
"variants": [
{
"image_id": "5e6f7a80-9b0c-4d1e-8f20-abcdef654321",
"preset_key": "igFeedSquare",
"preset_label": "Instagram / Facebook square (1:1)",
"width": 1080,
"height": 1080,
"aspect_ratio": "1:1",
"image_url": "https://assets.app.hrizn.io/public/media-library/8f1c.../5e6f7a80.jpg",
"status": "complete"
}
]
}
}
```
```json 200 (generating) theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"image_id": "2c9c5b1e-6d0d-4c74-9c8f-3b1e0a5d8f21",
"generation_id": "7a3f2e10-1b2c-4d5e-8f90-abcdef123456",
"status": "generating",
"image_url": null,
"error": null,
"source": "ai",
"alt_text": null,
"title": null,
"caption": null,
"description": null,
"tags": [],
"width": null,
"height": null,
"aspect_ratio": "16:9",
"created_at": "2026-09-06T14:28:00.000Z",
"updated_at": null,
"generated_at": null,
"generation": { "prompt": "A red Toyota RAV4 hybrid ...", "generation_prompt": null, "disclaimer": null },
"article_id": null,
"parent_image_id": null,
"variants": []
}
}
```
# List images
Source: https://api-docs.hrizn.io/api-reference/images/list
GET /images
List the site's Media Library images with alt text, AI metadata, and article links
Returns the site's Media Library images, newest first. This covers every source — AI-generated (`ai`), uploaded (`upload`), OEM stock (`oem`), reference images (`reference`), and social-platform cuts (`social_variant`).
Each row is a full [Image](/api-reference/images/get-image) minus `variants`; call **Get image** for a specific asset when you need its social variant sizes.
In-flight and failed AI generations are placeholder rows and are hidden by default. Pass `status=generating` or `status=error` to see them.
**Scope required:** `images:read`
## Query parameters
One of `ai`, `upload`, `oem`, `reference`, `social_variant`. Omit for all.
One of `generating`, `complete`, `error`. Omit for finished images only.
Only images attached to this content item (UUID).
Only images carrying this tag.
Substring match on alt text, title, and description.
Page size, 1–100.
Opaque cursor from a previous page's `pagination.next_cursor`.
## Example
```bash cURL theme={"theme":{"light":"github-light","dark":"github-dark"}}
curl "https://api.app.hrizn.io/v1/public/images?source=ai&tag=rav4&limit=10" \
-H "X-API-Key: hzk_your_key_here"
```
```typescript TypeScript theme={"theme":{"light":"github-light","dark":"github-dark"}}
const res = await fetch(
"https://api.app.hrizn.io/v1/public/images?source=ai&tag=rav4&limit=10",
{ headers: { "X-API-Key": "hzk_your_key_here" } },
);
const { data, pagination } = await res.json();
```
```python Python theme={"theme":{"light":"github-light","dark":"github-dark"}}
import requests
response = requests.get(
"https://api.app.hrizn.io/v1/public/images",
headers={"X-API-Key": "hzk_your_key_here"},
params={"source": "ai", "tag": "rav4", "limit": 10},
)
images = response.json()["data"]
```
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": [
{
"image_id": "2c9c5b1e-6d0d-4c74-9c8f-3b1e0a5d8f21",
"generation_id": "7a3f2e10-1b2c-4d5e-8f90-abcdef123456",
"status": "complete",
"image_url": "https://assets.app.hrizn.io/public/media-library/8f1c.../7a3f2e10.jpg",
"error": null,
"source": "ai",
"alt_text": "Red Toyota RAV4 Hybrid parked outside a dealership at sunset",
"title": "Red RAV4 Hybrid at Sunset",
"caption": "A red RAV4 Hybrid in front of a modern dealership at golden hour.",
"description": "Representative render of a red RAV4 Hybrid for a landing page hero.",
"tags": ["ai", "rav4"],
"width": 1376,
"height": 768,
"aspect_ratio": "16:9",
"created_at": "2026-09-06T14:28:00.000Z",
"updated_at": "2026-09-06T14:28:31.000Z",
"generated_at": "2026-09-06T14:28:27.609Z",
"generation": {
"prompt": "A red Toyota RAV4 hybrid parked in front of a modern dealership at golden hour",
"generation_prompt": "Photorealistic red Toyota RAV4 Hybrid, three-quarter front view, ...",
"disclaimer": "Representative image. Actual vehicle may vary."
},
"article_id": null,
"parent_image_id": null,
"variants": []
}
],
"pagination": {
"has_more": false,
"next_cursor": null,
"total_count": 1
}
}
```
# List images
Source: https://api-docs.hrizn.io/api-reference/images/list-images
/openapi.yaml get /images
List the site's Media Library images, newest first. Covers AI-generated, uploaded, OEM, reference, and social-variant assets. Each row is a full Image (alt text, AI metadata, prompts, dimensions, article link) but without variants — call GET /images/{imageId} for those. In-flight and failed AI generations are hidden unless status=generating or status=error is passed. Requires images:read.
# Generate AI description
Source: https://api-docs.hrizn.io/api-reference/inventory/generate-ai-description
/openapi.yaml post /inventory/{vin}/description
Triggers AI description generation for a single vehicle.
# Generate description
Source: https://api-docs.hrizn.io/api-reference/inventory/generate-description
POST /inventory/{vin}/description
Trigger AI description generation for a vehicle
Triggers AI description generation for a specific vehicle. This upserts a description component with `draft` status, which kicks off the asynchronous generation pipeline.
**Scope required:** `inventory:write`
## Path parameters
Vehicle Identification Number (11-17 characters).
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"vin": "1C4HJXEG5NW195712",
"status": "generating",
"component_id": "239e61d6-34d0-4741-9dd1-eed56edec1ab",
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Description generation is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `inventory.description.completed` notifications instead of polling.
# Generate descriptions (batch)
Source: https://api-docs.hrizn.io/api-reference/inventory/generate-description-batch
POST /inventory/descriptions/batch
Trigger description generation for up to 50 vehicles
Triggers AI description generation for multiple vehicles at once (1-50 VINs).
**Scope required:** `inventory:write`
## Request body
Array of VINs (11-17 characters each, max 50).
```json 202 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"items": [
{
"vin": "1G1FY6EV0VF102843",
"status": "generating",
"component_id": "06e57167-6840-49db-8153-585583e9a99b"
},
{
"vin": "1G1FY6EV3VF104666",
"status": "generating",
"component_id": "24d9a97a-b672-46d0-9eb3-eb215262e4d8"
}
],
"message": "Generation typically completes within a few minutes. Configure webhooks to receive real-time status notifications: https://api-docs.hrizn.io/webhooks"
}
}
```
Description generation is asynchronous and typically completes within a few minutes. Configure [webhooks](/webhooks) to receive real-time `inventory.description.batch_completed` notifications instead of polling.
# Generate descriptions in batch
Source: https://api-docs.hrizn.io/api-reference/inventory/generate-descriptions-in-batch
/openapi.yaml post /inventory/descriptions/batch
Triggers AI description generation for multiple vehicles (1-50 VINs).
# Get AI description
Source: https://api-docs.hrizn.io/api-reference/inventory/get-ai-description
/openapi.yaml get /inventory/{vin}/description
# Get vehicle description
Source: https://api-docs.hrizn.io/api-reference/inventory/get-description
GET /inventory/{vin}/description
Get the AI-generated description for a vehicle
Returns the AI-generated marketing description for a vehicle, if one exists.
**Scope required:** `inventory:read`
## Path parameters
Vehicle Identification Number (11-17 characters).
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"vin": "1C4HJXEG5NW195712",
"status": "complete",
"description": null,
"generated_at": "2026-01-29T00:06:16.020574+00:00"
}
}
```
If no description has been generated, `status` will be `"not_generated"` and `description` will be `null`.
# Get inventory feed
Source: https://api-docs.hrizn.io/api-reference/inventory/get-feed
GET /inventory/feed
Get the complete inventory feed in JSON or XML format
Returns the complete inventory feed with vehicle data and AI descriptions. Supports JSON and XML output formats.
**Scope required:** `inventory:read`
## Query parameters
Response format: `json` or `xml`.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"count": 254,
"vehicles": [
{
"vin": "1C4HJXEG5NW195712",
"year": 2022,
"make": "Jeep",
"model": "Wrangler Unlimited",
"trim": "Sahara 4x4",
"vehicle_type": "Used",
"price": 27759,
"mileage": 45225,
"exterior_color": "Bright White Clearcoat",
"interior_color": "Black",
"ai_description": null,
"image_url": "https://cdnrs.inventoryrsc.com/640x480/490008540_697aded63b109513bccc1573.jpg"
}
]
}
}
```
# Inventory health
Source: https://api-docs.hrizn.io/api-reference/inventory/get-health
GET /inventory/health
Lot health snapshot: aging, mix, heavy models, merchandising gaps
Returns a public-safe used-car desk snapshot of the lot: aging buckets (retail value only), new/used/CPO mix, heavy or overstocked model groups, and merchandising gaps (missing photos or Hrizn AI descriptions).
**Scope required:** `inventory:read`
Aging is computed from `instock_date` (days in stock). Analysis is capped (currently 2,000 units); `truncated` is true when the lot is larger.
Dealer **cost is never included**.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"total_units": 312,
"analyzed": 312,
"truncated": false,
"mix": { "new": 140, "used": 150, "cpo": 22 },
"pricing": {
"avg_price": 28450,
"median_price": 26990,
"value_tied_up_retail": 8876400
},
"aging": [
{ "label": "0-30 days", "count": 120, "value_tied_up_retail": 3200000 },
{ "label": "31-60 days", "count": 90, "value_tied_up_retail": 2500000 },
{ "label": "61-90 days", "count": 60, "value_tied_up_retail": 1800000 },
{ "label": "90+ days", "count": 42, "value_tied_up_retail": 1376400 }
],
"aged_units_90_plus": 42,
"heavy_models": [
{
"label": "Toyota Camry",
"count": 18,
"avg_days_on_lot": 47,
"avg_price": 27990,
"aged_units": 4
}
],
"merchandising": {
"missing_photos": 8,
"thin_photos": 21,
"missing_description": 54
}
}
}
```
# Get inventory feed
Source: https://api-docs.hrizn.io/api-reference/inventory/get-inventory-feed
/openapi.yaml get /inventory/feed
Returns the complete inventory feed in JSON or XML format.
# Get inventory health
Source: https://api-docs.hrizn.io/api-reference/inventory/get-inventory-health
/openapi.yaml get /inventory/health
Lot health snapshot covering aging, inventory mix, high-volume models, and merchandising gaps.
# Get inventory stats
Source: https://api-docs.hrizn.io/api-reference/inventory/get-inventory-stats
/openapi.yaml get /inventory/stats
# Get vehicle safety
Source: https://api-docs.hrizn.io/api-reference/inventory/get-safety
GET /inventory/{vin}/safety
Open NHTSA safety recalls for a stocked VIN
Returns open NHTSA safety recalls for a VIN in the dealership's inventory. The two findings that change what a dealer does today — **do not drive** and **park outside** — are surfaced as first-class flags.
**Scope required:** `inventory:read`
## Path parameters
VIN of a vehicle in this dealership's inventory.
## Response
Number of open recalls.
Any open recall carries a do-not-drive advisory.
Any open recall carries a park-outside advisory.
Each recall's `campaign_number`, `component`, `summary`, `consequence`, `remedy`, `report_date`, and the two advisory flags.
Catalog crash ratings only. `null` means not in the catalog — not unrated.
When recall data cannot be resolved for the VIN, `coverage` explains why rather than returning an empty list that would read as "no recalls".
# Get inventory stats
Source: https://api-docs.hrizn.io/api-reference/inventory/get-stats
GET /inventory/stats
Get aggregate inventory statistics
Returns aggregate statistics about the site's inventory, including vehicle counts and AI description coverage.
**Scope required:** `inventory:read`
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"total_vehicles": 254,
"with_ai_description": 254,
"without_ai_description": 0,
"new_vehicles": 163,
"used_vehicles": 91,
"description_coverage_pct": 100
}
}
```
# Get vehicle
Source: https://api-docs.hrizn.io/api-reference/inventory/get-vehicle
GET /inventory/{vin}
Get full details for a specific vehicle
Returns complete vehicle details including specs, pricing, photos, days on lot, and Hrizn AI description text (`ai_description`).
**Scope required:** `inventory:read`
## Path parameters
Vehicle Identification Number (11-17 characters).
Includes `instock_date`, `days_on_lot`, `certified`, `photo_count`, `has_description`, `ai_description`, and `description_status`.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": {
"vin": "1C4HJXEG5NW195712",
"year": 2022,
"make": "Jeep",
"model": "Wrangler Unlimited",
"trim": "Sahara 4x4",
"vehicle_type": "Used",
"price": 27759,
"mileage": 45225,
"exterior_color": "Bright White Clearcoat",
"interior_color": "Black",
"engine": "Pentastar 3.6L V-6 DOHC, variable valve control, regular unleaded, engine with 285HP",
"transmission": "Automatic",
"drivetrain": "Four Wheel Drive",
"fuel_type": "Regular unleaded",
"body_style": "Sport Utility",
"certified": false,
"instock_date": "2026-04-01T00:00:00+00:00",
"days_on_lot": 115,
"photo_count": 2,
"has_description": true,
"stock_number": "U17968I",
"image_url": "https://cdnrs.inventoryrsc.com/640x480/490008540_697aded63b109513bccc1573.jpg",
"images": [
"https://cdnrs.inventoryrsc.com/640x480/490008540_697aded63b109513bccc1573.jpg",
"https://cdnrs.inventoryrsc.com/640x480/490008540_697aded73b109513bccc1574.jpg"
],
"ai_description": "Discover this Bright White Jeep Wrangler Unlimited Sahara…",
"description_status": "complete",
"created_at": "2026-04-01T12:00:00+00:00",
"updated_at": "2026-02-28T09:02:26.966306+00:00"
}
}
```
# Get vehicle details
Source: https://api-docs.hrizn.io/api-reference/inventory/get-vehicle-details
/openapi.yaml get /inventory/{vin}
# List inventory
Source: https://api-docs.hrizn.io/api-reference/inventory/list
GET /inventory
List vehicles in this site's inventory
Returns a paginated list of vehicles from the dealership's current inventory.
**Scope required:** `inventory:read`
## Query parameters
Results per page (1-100).
Opaque pagination cursor (includes active `sort`). Reuse it with the same filters.
Filter by vehicle make (e.g., `Chevrolet`).
Filter by vehicle model (e.g., `Silverado`).
Filter by exact model year (wins over `min_year` / `max_year`).
Minimum model year.
Maximum model year.
Filter by vehicle type: `New` or `Used`.
Minimum list price.
Maximum list price.
Minimum mileage.
Maximum mileage.
Minimum days in stock (from `instock_date`).
Maximum days in stock.
Exact text match on make, model, stock number, or VIN (every word must match).
Natural-language shopper request (e.g. `roomy family SUV for road trips`). Recognized attributes (body style, color, drivetrain, fuel, equipment, price words) become filters; the remaining words rank vehicles by meaning. Required for `sort=relevance`.
Trim substring.
Body style: `SUV`, `Truck`, `Minivan`, `Van`, `Sedan`, `Coupe`, `Hatchback`, `Wagon`, or `Convertible`.
Drivetrain: `AWD`, `4WD`, `FWD`, or `RWD` (`4x4` and `all-wheel drive` are accepted).
Fuel type: `Gas`, `Hybrid`, `Electric`, or `Diesel`.
Transmission: `Automatic` or `Manual`.
Comma-separated features that must **all** be present (e.g. `sunroof,apple carplay,third row`).
Filter certified / CPO units (`true` / `false`).
Minimum photo count.
Filter units with (`true`) or without (`false`) a Hrizn AI description.
Filter by Hrizn color family (e.g. `white`, `blue`). Expands OEM paint names on this site (Ice Cap → white). Prefer this for semantic color search.
Filter by OEM exterior paint name (path-scoped substring, e.g. `Ocean Gem` or `ice`). Use `color_family` for generic colors.
Sort: `vin_asc`, `newest`, `oldest`, `aging`, `price_asc`, `price_desc`, `mileage_asc`, `mileage_desc`, or `relevance` (best semantic match; requires `semantic_query`).
Each list item includes browse fields from inventory metadata (`trim`, colors, `body_style`, drivetrain/transmission/fuel), derived `color_family`, age (`instock_date`, `days_on_lot`), `certified`, `photo_count`, and `has_description`. Full Hrizn AI copy is **not** included on list — use [Get vehicle](/api-reference/inventory/get-vehicle) for `ai_description`.
`pagination.total_count` is the full set matching every filter (not reduced by the cursor).
A filter value that names no known option (for example `body_style=spaceship` or an unknown `equipment` feature) returns an empty list rather than being ignored.
```json 200 theme={"theme":{"light":"github-light","dark":"github-dark"}}
{
"data": [
{
"id": "86b8c4e0-f57b-48c7-974d-4c45fbac2aed",
"vin": "1C4HJXEG5NW195712",
"year": 2022,
"make": "Jeep",
"model": "Wrangler Unlimited",
"trim": "Sport",
"vehicle_type": "Used",
"price": 27759,
"mileage": 45225,
"exterior_color": "Bright White Clearcoat",
"exterior_color_code": "PW7",
"color_family": "White",
"interior_color": "Black",
"body_style": "SUV",
"drivetrain": "4WD",
"transmission": "Automatic",
"fuel_type": "Gasoline",
"certified": false,
"instock_date": "2026-04-01T00:00:00+00:00",
"days_on_lot": 115,
"photo_count": 24,
"has_description": true,
"stock_number": "U17968I",
"status": null,
"photo_url": "https://cdnrs.inventoryrsc.com/640x480/490008540_697aded63b109513bccc1573.jpg",
"updated_at": "2026-02-28T09:02:26.966306+00:00"
}
],
"pagination": {
"has_more": true,
"next_cursor": "eyJzb3J0IjoidmluX2FzYyIsInZpbiI6IjFDNFJESkRHOVBDNjAzMTkxIn0=",
"total_count": 254
}
}
```
# List vehicles
Source: https://api-docs.hrizn.io/api-reference/inventory/list-vehicles
/openapi.yaml get /inventory
# Analyze inventory pricing
Source: https://api-docs.hrizn.io/api-reference/market/analyze-inventory-pricing
/openapi.yaml post /market/inventory-pricing
Compare the dealership's matching inventory to the live local market price distribution. Requires Unlimited plan entitlement.
# Analyze vehicle position
Source: https://api-docs.hrizn.io/api-reference/market/analyze-vehicle-position
/openapi.yaml get /market/vehicle-position
Price a single inventory VIN vs predicted market and market days supply. Requires Unlimited plan entitlement.
# Analyze vehicle position (POST body)
Source: https://api-docs.hrizn.io/api-reference/market/analyze-vehicle-position-post-body
/openapi.yaml post /market/vehicle-position
# Appraise a vehicle
Source: https://api-docs.hrizn.io/api-reference/market/appraise
POST /market/appraise
Appraise a year/make/model against the live local market without a VIN
Prices an arbitrary year/make/model (optional trim + mileage) against the live local market distribution. For units already in inventory, prefer [vehicle position](/api-reference/market/vehicle-position).
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
# Appraise a vehicle
Source: https://api-docs.hrizn.io/api-reference/market/appraise-a-vehicle
/openapi.yaml post /market/appraise
Appraise a year/make/model (optional trim + mileage) against the live local market without a VIN. Requires Unlimited plan entitlement.
# Competitive set
Source: https://api-docs.hrizn.io/api-reference/market/competitive-set
POST /market/competitive-set
Live dealer-level competitive set for a vehicle segment
Returns competing dealers near the dealership for a segment, with price, mileage, and days on market.
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
Also available as `GET /market/competitive-set`.
# Competitive set (POST body)
Source: https://api-docs.hrizn.io/api-reference/market/competitive-set-post-body
/openapi.yaml post /market/competitive-set
# Market days supply
Source: https://api-docs.hrizn.io/api-reference/market/days-supply
POST /market/days-supply
Live market days supply for a vehicle segment
Returns active supply, recent sell-through, implied daily sales rate, and market days supply for a segment (lower = faster turn).
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
Also available as `GET /market/days-supply`.
# Analyze inventory pricing
Source: https://api-docs.hrizn.io/api-reference/market/inventory-pricing
POST /market/inventory-pricing
Compare dealership inventory pricing to the live local market
Pulls matching units from the dealership's inventory and compares each to the local market price distribution (over / at / under market).
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
Mixed used, certified/CPO, and new fleets are analyzed independently. Responses
include per-segment medians, analyzed/unavailable/omitted coverage, and every
priced unit. `status: "partial"` means at least one segment lacked usable
market evidence; `market_median` is the unit-weighted median of the analyzed
segment medians, not a universal median for every unit.
# Local market listings
Source: https://api-docs.hrizn.io/api-reference/market/local-listings
POST /market/local-listings
Live local-market listings for a vehicle segment near the dealership
Returns comparable listing counts, price/mileage/days-on-market distribution, and sample listings for a segment near the dealership. Dealership ZIP is resolved automatically when `zip` / `state` are omitted.
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
Also available as `GET /market/local-listings` with the same fields as query parameters.
# Local market listings
Source: https://api-docs.hrizn.io/api-reference/market/local-market-listings
/openapi.yaml get /market/local-listings
Live local-market listings for a vehicle segment near the dealership. Dealership ZIP is resolved automatically when zip/state are omitted. Requires Unlimited plan entitlement.
# Local market listings (POST body)
Source: https://api-docs.hrizn.io/api-reference/market/local-market-listings-post-body
/openapi.yaml post /market/local-listings
Same as GET /market/local-listings with a JSON body.
# Market days supply
Source: https://api-docs.hrizn.io/api-reference/market/market-days-supply
/openapi.yaml get /market/days-supply
Active supply, recent sell-through, and implied market days supply for a segment. Requires Unlimited plan entitlement.
# Market days supply (POST body)
Source: https://api-docs.hrizn.io/api-reference/market/market-days-supply-post-body
/openapi.yaml post /market/days-supply
# Market price analysis
Source: https://api-docs.hrizn.io/api-reference/market/market-price-analysis
/openapi.yaml get /market/price-analysis
Predicted market price, MSRP, range, and comparable listings for a VIN. Requires Unlimited plan entitlement.
# Market price analysis (POST body)
Source: https://api-docs.hrizn.io/api-reference/market/market-price-analysis-post-body
/openapi.yaml post /market/price-analysis
# Vehicle options and packages
Source: https://api-docs.hrizn.io/api-reference/market/options-packages
GET /market/options-packages/{vin}
Factory options and packages for a VIN
Returns factory options and packages for a VIN, typically sorted by importance / MSRP. Use for package questions only — basic year/make/model/trim specs live on [Get vehicle](/api-reference/inventory/get-vehicle).
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
The path must contain a valid 17-character VIN. Partial or invalid VINs return
`status: "need_vin"` and do not call the options provider.
# Hrizn Market Maker overview
Source: https://api-docs.hrizn.io/api-reference/market/overview
Hrizn Market Maker endpoints (Unlimited + market_data:read)
**Hrizn Market Maker** powers local competitive listings, market days supply, fleet pricing checks, VIN predicted price, and related used-car desk workflows.
**Requirements**
* Scope: `market_data:read`
* Plan: **Unlimited**
* Geography: **US only**
* Hrizn uses the dealership location unless a different supported location is provided
## Usage guidance
Use focused make, model, year, and location filters for faster, more relevant results.
| Endpoint | Method | Purpose |
| - | - | - |
| `/market/local-listings` | GET, POST | Segment listings + price/DOM stats |
| `/market/days-supply` | GET, POST | Market days supply / sell-through |
| `/market/competitive-set` | GET, POST | Competing dealer listings |
| `/market/inventory-pricing` | POST | Fleet vs local market median |
| `/market/appraise` | POST | YMM appraisal without inventory VIN |
| `/market/price-cut-candidates` | POST | Aged + over-market units |
| `/market/stocking-opportunities` | POST | Stock / acquire by local velocity |
| `/market/vehicle-position` | GET, POST | One inventory VIN vs market (no cost) |
| `/market/price-analysis` | GET, POST | VIN predicted price + comps |
| `/market/options-packages/{vin}` | GET | Factory options/packages |
On plan denial, responses use HTTP **403** with error code `plan_upgrade_required`.
VIN workflows validate full 17-character VINs before provider calls. Price
analysis never defaults mileage, and vehicle-position analysis never broadens
an unresolved year/make/model/trim identity. Compatible prerequisite gaps are
returned as `need_vin`, `need_mileage`, or `identity_unresolved` statuses.
# Market price analysis
Source: https://api-docs.hrizn.io/api-reference/market/price-analysis
POST /market/price-analysis
Predicted market price, MSRP, range, and comps for a VIN
Returns predicted market price, MSRP, price range, and comparable active listings for a VIN. For units already in inventory, prefer [vehicle position](/api-reference/market/vehicle-position).
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
Also available as `GET /market/price-analysis?vin=…`.
Pass a valid 17-character VIN and the actual `miles` value. Compatible requests
that omit mileage return `status: "need_mileage"`; Hrizn never substitutes a
default mileage. Partial or invalid VINs return `status: "need_vin"`.
# Price-cut candidates
Source: https://api-docs.hrizn.io/api-reference/market/price-cut-candidates
POST /market/price-cut-candidates
Rank aged inventory units that are priced over the local market
Returns a ranked list of the dealership's aged + over-market units with a recommended move per unit.
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
# Stocking opportunities
Source: https://api-docs.hrizn.io/api-reference/market/stocking-opportunities
POST /market/stocking-opportunities
Recommend segments to stock or acquire based on local market velocity
Ranks the dealership's segments by local market days supply and flags where on-lot supply is thin.
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
# Vehicle options and packages
Source: https://api-docs.hrizn.io/api-reference/market/vehicle-options-and-packages
/openapi.yaml get /market/options-packages/{vin}
Factory options and packages for a VIN. Requires Unlimited plan entitlement.
# Analyze vehicle position
Source: https://api-docs.hrizn.io/api-reference/market/vehicle-position
POST /market/vehicle-position
Price a single inventory VIN vs predicted market and market days supply
Looks up the unit in inventory, gets its predicted market price and segment days supply, and returns a verdict (price vs market, days on lot vs market, recommended move). Predicted price is authoritative even with few local comparables.
**Scope required:** `market_data:read`\
**Plan required:** Unlimited
Also available as `GET /market/vehicle-position?vin=…`.
The VIN must be a valid 17-character VIN. The inventory unit must also have
actual mileage plus resolved year, make, model, and trim. Missing prerequisites
return `need_vin`, `need_mileage`, or `identity_unresolved`; the comparison is
never broadened to model-only market data.
# API reference
Source: https://api-docs.hrizn.io/api-reference/overview
Complete reference for all Hrizn Public API endpoints
## Base URL
| Environment | URL |
| - | - |
| Production | `https://api.app.hrizn.io/v1/public` |
## Authentication
All endpoints (except `/health`) require an API key in the `X-API-Key` header.
The `/health` endpoint is the only endpoint that does not require authentication. Use it to verify the API is operational.
## API Architecture
The API is organized into endpoint groups that work together to power the full content lifecycle:
```mermaid theme={"theme":{"light":"github-light","dark":"github-dark"}}
flowchart TD
subgraph research [Research]
IC["IdeaClouds"]
end
subgraph intelligence [Intelligence]
CI["Content Intelligence"]
end
subgraph content [Content Creation]
CT["Content"]
Types["Content Types"]
end
subgraph quality [Quality]
Comp["Compliance"]
Tools["Content Tools"]
end
subgraph data [Data]
Inv["Inventory"]
Site["Site Config"]
An["Analytics"]
end
subgraph infra [Infrastructure]
WH["Webhooks"]
Ref["Reference"]
end
IC -->|"feeds into"| CI
CI -->|"recommends"| CT
CT -->|"checked by"| Comp
CT -->|"enhanced by"| Tools
Inv -->|"enriches"| Types
Inv -->|"analyzed by"| CI
An -->|"feeds"| CI
WH -->|"notifies on"| CT
WH -->|"notifies on"| IC
```
## Endpoint groups
Create and manage AI-powered keyword research. Start here to build content.
AI-powered content gap analysis and recommendations. Identifies what to create next based on inventory, search data, and competitive analysis.
Generate content from IdeaClouds. Retrieve HTML, components, and metadata.
Create specialized content: comparisons, model landing pages, and sales events.
Run OEM-specific compliance checks on content.
Generate SEO metadata, JSON-LD schemas, and social snippets.
Access vehicle data, AI descriptions, and inventory feeds.
Warehoused Search Console and GA4. Diagnose a URL with page performance (the only live inspect).
Read dealership details, categories, brand voices, and elements.
Manage webhook subscriptions for real-time event delivery.
Look up content types, component types, webhook events, and scopes.
## Common headers
| Header | Required | Description |
| - | - | - |
| `X-API-Key` | Yes | Your API key |
| `Content-Type` | For POST/PATCH | `application/json` |
| `X-Idempotency-Key` | No | Prevent duplicate POST operations |
| `Accept` | No | `application/json` (default) or `text/html` for HTML endpoints |
Use the `X-Idempotency-Key` header on all write operations to safely retry failed requests without creating duplicates. See [Idempotency](/concepts/idempotency) for details.
# Component types
Source: https://api-docs.hrizn.io/api-reference/reference/component-types
GET /reference/component-types
List all article component types
Returns the types of components that can be attached to articles (body, SEO metadata, schemas, etc.).
When used as a path parameter in `GET /content/{id}/components/{type}`, the type is **case-insensitive**.
The reference endpoint returns PascalCase keys (e.g. `Body`, `SeoMetadata`), but component API responses (e.g. `GET /content/{id}/components`) use camelCase (e.g. `body`, `seoMetadata`). Both formats are accepted as path parameters due to case-insensitivity.
| Type (API response) | Type (reference key) | Description |
| - | - | - |
| `body` | `Body` | Main article content (markdown) |
| `seoMetadata` | `SeoMetadata` | SEO meta tags |
| `pageSlugs` | `PageSlugs` | URL slugs |
| `postTags` | `PostTags` | Content tags |
| `blogCategories` | `BlogCategories` | Category assignments |
| `searchIntent` | `SearchIntent` | Search intent analysis |
| `videoScript` | `VideoScript` | Video script |
| Type (API response) | Type (reference key) | Description |
| - | - | - |
| `layout_html` | `LayoutHtml` | Rendered page HTML with embedded CSS -- the full visual layout output from the page builder |
| Type (API response) | Type (reference key) | Description |
| - | - | - |
| `facebookSnip` | `FacebookSnip` | Facebook social snippet |
| `twitterSnip` | `TwitterSnip` | Twitter/X social snippet |
| `instagramSnip` | `InstagramSnip` | Instagram social snippet |
| `googleBusinessSnip` | `GoogleBusinessSnip` | Google Business snippet |
| Type (API response) | Type (reference key) | Description |
| - | - | - |
| `articleSchema` | `ArticleSchema` | Article JSON-LD schema |
| `authorSchema` | `AuthorSchema` | Author JSON-LD schema |
| `organizationSchema` | `OrganizationSchema` | Organization JSON-LD schema |
| `vehicleListingSchema` | `VehicleListingSchema` | Vehicle JSON-LD schema |
| `faqSchema` | `FaqSchema` | FAQ JSON-LD schema |
| `eventSchema` | `EventSchema` | Event JSON-LD schema |
| `qaPageSchema` | `QaPageSchema` | QA Page JSON-LD schema |
The `layout_html` component contains the complete, self-contained HTML document produced by the visual page builder. Unlike the `body` component which stores the design JSON and raw content, `layout_html` stores the rendered HTML output with all CSS in a `