Content Pages, Area Pages & Home Page

Part of the Content API. Endpoints for the site’s pages: content pages, agent landing pages, area pages, the home page, page templates and revisions.

Content pages

GETPOST/api/v3/content/pages/
GETPUTPATCHDELETE/api/v3/content/pages/<id>/

Regular content pages. Scopes: pages:read / pages:write. Market report pages, coming soon pages and valuation pages are managed in the admin and are not visible here.

Field Type Notes
id, path, url, level, children_count Read-only.
slug string Required; letters, numbers, -, _, /.
parent int / null Id of the parent page; read as {"id", "slug", "path"}.
anchor_text string ≤256 Required; the page name used in navigation.
title, meta_description, meta_keywords string SEO fields.
content HTML Sanitized.
template string One of GET /api/v3/content/templates/; default Page with Search.
listing_header string Header above the property listings.
number_of_properties int One of 0, 3, 5, 6, 10, 12, 15, 20, 24, 25, 30, 40, 50, 60, 75, 100, 120; default 12.
property_display_location above / below Listings above or below the content; default below.
search_header string Header above the search form.
search_form_type default / typeahead Which search form the page shows.
search_field_defaults same as search Saved search whose criteria pre-fill the search form; null to clear.
sidebar int / null Id of a sidebar; read as {"id", "name"}.
search see below The saved search whose listings the page shows; null to detach.
extra_content object Template-specific areas, see below.
footer int / null Id of a footer; read as {"id", "name", "default"}.
landscape_image_override see below The big image/video at the top of the page.
landscape_image_override_alt_text string ≤100
landscape_image_override_content_type MIME Derived from the URL’s extension when omitted.
banner_id, capture_form_id, require_capture Read-only; managed in the admin.

landscape_image_override is null to use the site’s header image, "none" to hide the landscape section, or a file URL (image or .mp4 video; see Files). Area pages and the home page take the same fields.

The search field

search reads as {"id", "short_id", "description", "criteria"} where criteria is {field: [values]}. To set it, send a saved search’s short_id (the base36 id in the site’s search URLs), its numeric id, or a criteria object such as {"city": ["Jupiter"], "list_price_min": 1000000}. A criteria object is validated against the site’s search fields, unknown fields are rejected with a 422 naming them, and the resulting search is saved (or reused if identical). Area pages and the home page take the same sidebar, search and footer values.

Template areas (extra_content)

Some templates add fields, listed per template by GET /content/templates/. They read and write as an object keyed by the area name with spaces as underscores; on write, keys are merged into what is stored (send null to clear one), unknown keys are a 422, and changing template drops areas the new template lacks. Values by area type: text is a string, rich_text is sanitized HTML, file is a file URL, reorder_agents is a list of Agent Detail page ids.

  • Agent Detail Page: Agent_Name, Agent_Photo (file URL), Cell_Phone_Number, Fax_Number, Email, Company, Address, Testimonials (HTML). Create one with "template": "Agent Detail Page".
  • About Page: Testimonials (HTML) and Agent_Ordering (ids). An About page also carries a read-only agents list, the site’s Agent Detail pages in display order as {"id", "name", "path", "url", "photo_url"}; pages not in Agent_Ordering follow the ordered ones.

Validation, filters and limits

Validation mirrors the admin: the resulting URL must be unique across all pages, must not be a path Real Geeks reserves (search, market reports, the blog root, …), and a parent change must not create a loop.

List filters: slug, path (e.g. ?path=/resources/buyers/), parent (id or null), template, q (anchor text / title / slug contains), ordering (slug, level, id), include_content=false.

Pages nest at most 10 levels deep and a page URL is at most 200 characters. Deleting a page with children returns 409 conflict; pass ?orphan_children=true to delete it and make the children top-level pages.

Agent landing pages

GETPOST/api/v3/content/agent-pages/
GETPUTPATCHDELETE/api/v3/content/agent-pages/<id>/

Content pages tied to a CRM agent: leads from the page go to that agent instead of the site’s round robin. Same fields and rules as content pages plus agent_id (writable; an id from GET /content/agents/, or null) and read-only agent_name. These pages are separate from /content/pages/ (neither lists the other). Scopes: pages:*.

GET /content/agents/ returns the site’s CRM agents as {"results": [{"id", "name"}]}; 502 crm_unavailable if the CRM cannot be reached, and writing agent_id is refused with the same code until it can be checked.

Area pages

GETPOST/api/v3/content/area-pages/
GETPUTPATCHDELETE/api/v3/content/area-pages/<id>/

Same shape as content pages without template/extra_content, plus area_name (required) and featured (bool). Extra filter: featured=true|false. Scopes: area_pages:*.

Home page

GETPATCH/api/v3/content/home-page/

The site’s single home page. Scopes: home_page:*. Writable: title, meta_description, meta_keywords, content, sidebar, footer, tile_group (a Featured Pages group id or null, anna-modern), the landscape override fields, the property display options search, listing_header, number_of_properties, property_display_location, property_display_type (carousel, grid or null), and the search form options search_header, search_subheader, search_form_type, search_form_tabs (bool), search_field_defaults, search_image (file URL or null).

Some of these only render on some designs (for example property_display_type and search_form_tabs on anna-modern), matching the admin. A site without a home page returns 404 home_page_missing; create it in the admin.

Page templates

GET/api/v3/content/templates/

The page templates this site can use, with their extra content areas. Accepts any valid key.

{"results": [
  {"name": "About Page",
   "description": "...",
   "extra_content_areas": [
     {"name": "Testimonials",
      "type": "rich_text"}]}]}

Revisions and undo

GET.../revisions/
GET.../revisions/<rev>/
POST.../revisions/<rev>/revert/

Content pages, agent landing pages and the home page keep a revision for every save that changes a field the admin’s Versions page tracks (it is the same history): content, template, anchor_text, sidebar, footer, search, search_field_defaults, search_header, listing_header, number_of_properties, property_display_location and extra_content on pages, and the equivalent fields on the home page. Changes to other fields (slug, parent, title, meta_*, landscape image, search_form_type) are recorded in the site’s change log but cannot be undone here. Revisions are attributed to the API key that made them.

  • GET /content/pages/<id>/revisions/ (also /content/agent-pages/<id>/revisions/ and /content/home-page/revisions/) lists revisions newest first: {"id", "at", "by", "action": "created|changed|reverted", "changed_fields", "revertible"}, where by names the person the key belongs to and the key used. Admin edits have api_key: null.
  • GET .../revisions/<rev>/ adds preview: per changed field, the value now and the value a revert would restore.
  • POST .../revisions/<rev>/revert/ (write scope) undoes that revision and every later one, returning the page. The revert is itself a revision, so it can be undone the same way. The creation revision cannot be reverted; delete the page instead.

Other resources (posts, sidebars, navigation, footers, settings, files) do not have revisions yet; their changes are only recorded in the site’s change log.