# 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

\n

The 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 `