Interactive Brochures

Create and manage shareable interactive property brochures through the authenticated REST API or Fondaro MCP.

Fondaro brochures are interactive web pages containing one to 25 snapshotted property listings. A brochure can include a recipient name and note, live organization and agent branding, listing-specific corrections, optional public location presentation, maps, galleries, view statistics, and an expiry. Creating one returns a shareable HTTPS URL under /b/:slug; there is no separate brochure renderer or PDF payload in this API.

PDF window cards are a separate dashboard feature described in the Brochures dashboard guide. The obsolete POST /properties/:id/brochure PDF route is not part of the current API contract.

Choose an API surface

  • Use the REST routes on this page from the Fondaro dashboard or another client with a valid Clerk session JWT. The /brochures controller does not accept an fdr_mcp_ key.
  • Use the hosted Fondaro MCP server for API-key automation. It exposes the existing 13-operation brochure lifecycle through scoped, compact tools and returns the same public viewer URL. Duplication is a Clerk-session REST and dashboard action and is not an MCP tool.

Access and lifecycle rules

  • A member can list, read, and change only brochures they created. An organization admin can operate across the organization.
  • Every lookup is organization-scoped; a brochure in another organization is not exposed.
  • A brochure accepts at most 25 listings. Creation needs at least one.
  • Expiry defaults to 90 days and can be set from 1 to 365 days.
  • Revoking disables the public link without deleting data. Renewing clears revocation and restores the same URL. Permanent delete removes the brochure and its listing snapshots.
  • Non-admin branding changes still obey the organization's locked brochure preset.
  • showLocations is independent from the branding lock. Any caller allowed to edit a brochure may change it.
  • Create, add, refresh, and renew-with-refresh may continue image ingest and coordinate enrichment after the response. The public link itself is available immediately.

REST route catalogue

All authenticated management routes are under https://api.fondaro.com.

MethodRoutePurpose
GET/brochuresList visible brochures, optionally filtered by search text, creator, expired state, or revoked state
POST/brochuresCreate a brochure and snapshot 1–25 listings
GET/brochures/:idRead a brochure, listings, live branding, organization preset, and publicUrl
POST/brochures/:id/duplicateDuplicate a visible brochure with fresh identities, lifecycle, and public link
PATCH/brochures/:idUpdate title, recipient fields, theme, accent, or public location visibility
DELETE/brochures/:idPermanently delete a brochure
POST/brochures/:id/renewRestore the link, set a new expiry, and optionally refresh listings
POST/brochures/:id/revokeDisable the public link reversibly
POST/brochures/:id/listingsAdd one source listing, optionally at a zero-based position
DELETE/brochures/:id/listings/:listingIdRemove one brochure listing
POST/brochures/:id/listings/orderReplace the complete listing order
POST/brochures/:id/listings/:listingId/refreshRe-snapshot one listing while preserving brochure overrides
PATCH/brochures/:id/listings/:listingId/detailsSet or clear listing detail overrides and visibility flags
PATCH/brochures/:id/listings/:listingId/locationCorrect address and coordinate fields

listingId in the mutation routes is the brochure-listing UUID returned by create/get, not the source property's id. Reorder requires the exact, complete current set of brochure-listing UUIDs.

CRM lead connections

The Clerk-authenticated REST API can connect a brochure to zero to 25 unique purchased CRM leads without changing the free-text recipientName shown publicly.

  • Send optional leadIds: number[] when creating a brochure. Omit it or send [] to create without connections.
  • On PATCH /brochures/:id, omitting leadIds preserves the current set, leadIds: [] clears it, and a non-empty array atomically replaces the complete set.
  • Members may use only leads assigned to them. Organization admins may use any purchased CRM lead in the organization.
  • If any id is missing, outside the organization, no longer purchased, or unavailable to the caller, the API returns a generic unavailable-selection error and makes no brochure or connection change.
  • Authenticated list, detail, create, update, renew, and revoke responses include linkedLeads, containing only each visible lead's id, firstName, and lastName.
  • GET /brochures?leadId=123 returns connected brochures that the caller may also open. Members receive only brochures they created; admins receive all matching organization brochures.
  • The q list filter also matches recipientName and the names of connected leads still visible to the caller.

These fields are intentionally unavailable through managed or public MCP brochure tools. A brochure write scope does not imply CRM read access. The unauthenticated public viewer never receives leadIds, linkedLeads, or other CRM association metadata.

Create a brochure

POST /brochures
Authorization: Bearer CLERK_SESSION_JWT
Content-Type: application/json
{
  "title": "Estepona homes for Andrew",
  "recipientName": "Andrew",
  "recipientNote": "Five homes selected for your review.",
  "showLocations": false,
  "expiresInDays": 90,
  "agentId": "user_2abc123",
  "listings": [
    {
      "source": "internal_mls",
      "sourcePropertyId": "0d24495c-33ac-4b24-9b6b-48dcad68ef65"
    },
    {
      "source": "idealista",
      "sourcePropertyId": "105432100",
      "sourceCountry": "es"
    }
  ]
}
FieldTypeRequiredDescription
titlestringNoDisplay title, maximum 255 characters
recipientNamestringNoRecipient name shown on the cover
recipientNotestringNoPersonal note, maximum 4,096 characters
themeNamestringNoA theme returned by GET /properties/themes; preset locks still apply
accentColorOverridestringNoHex accent colour; preset locks still apply
showLocationsbooleanNoShow structured locations and maps publicly. Explicit values override the organization starting value; omitted input inherits it, with true as the compatibility fallback
agentIdstringNoAgent UUID or live Clerk user id in the current organization
expiresInDaysintegerNo1–365; defaults to 90
listingsarrayYes1–25 source identities in the desired display order

REST source identities use the persisted source spelling: internal_mls, resales_online, resales_viewer, or one of the 19 portal slugs (idealista, rightmove, immobiliare, immoscout, funda, zoopla, seloger, otodom, immowelt, realtor, homes, trulia, propertyfinder, dubizzle, centris, loopnet, zillow, redfin, bayut). A Property Viewer row is normally produced by the dashboard's viewer-link preview/import flow; do not invent its compound source id.

The response contains the brochure, its listing snapshots, and:

{
  "id": "9d48015b-c4df-40be-a9db-388d1a1fa3f1",
  "slug": "unguessable-random-slug",
  "showLocations": false,
  "publicUrl": "https://www.fondaro.com/b/unguessable-random-slug",
  "expiresAt": "2026-10-19T10:00:00.000Z"
}

Duplicate a brochure

POST /brochures/9d48015b-c4df-40be-a9db-388d1a1fa3f1/duplicate
Authorization: Bearer CLERK_SESSION_JWT

The route has no request body. A member may duplicate only a brochure they created; an organization admin may duplicate any brochure in the organization. The caller becomes the owner of the new copy.

Duplication copies the title, recipient fields, location visibility, ordered listing snapshots, brochure-specific corrections, and CRM lead connections still visible to the caller. It does not refresh or re-snapshot source listings. A locked organization branding preset remains authoritative for a non-admin caller.

The result has a new brochure UUID, slug, public URL, brochure-listing UUIDs, timestamps, and independently owned hosted image keys. It is active for a fresh 90 days with zero views and no last-viewed time, even when the source is expired or revoked. The source is unchanged.

The response uses the same complete detail shape as create and GET /brochures/:id, including listings, linkedLeads, live or intentionally frozen branding, organizationPreset, and publicUrl.

Update brochure settings

All fields are optional. An omitted field stays unchanged. null clears title, recipientName, recipientNote, or accentColorOverride; themeName must be a valid non-empty theme name. Send showLocations: false to hide structured locations publicly or showLocations: true to reveal the retained snapshot again.

PATCH /brochures/9d48015b-c4df-40be-a9db-388d1a1fa3f1
Authorization: Bearer CLERK_SESSION_JWT
Content-Type: application/json
{
  "recipientNote": "I moved our two favourites to the top.",
  "accentColorOverride": "#1A5F7A",
  "showLocations": true
}

Add, reorder, refresh, and remove listings

Add uses a source identity and an optional zero-based position:

{
  "source": "resales_online",
  "sourcePropertyId": "R5423149",
  "position": 1
}

Reorder sends every current brochure-listing UUID exactly once:

{
  "listingIds": [
    "7cb69216-21f2-42ee-9b34-5bd48488e161",
    "44a60158-4903-4da8-87b4-127af78ed33c"
  ]
}

Refresh reads the original source again but preserves every brochure-specific title, reference, description, property type, price/room override, location correction, and hide flag.

Correct listing details

Every field is optional. Omit a field to keep its current override; send null to clear an override and fall back to the source snapshot.

{
  "titleOverride": "Three-bedroom penthouse with sea views",
  "priceOverride": 850000,
  "priceToOverride": null,
  "bedroomsOverride": 3,
  "bedroomsToOverride": null,
  "priceHidden": false,
  "factsHidden": false
}

Supported override fields are titleOverride, referenceNumberOverride, descriptionOverride, propertyTypeOverride, priceOverride, priceToOverride, bedroomsOverride, bedroomsToOverride, bathroomsOverride, and bathroomsToOverride. priceHidden renders “Price on request”; factsHidden suppresses bed and bathroom facts.

Correct a listing location

Patch any combination of latitude, longitude, addressLine1, addressLine2, city, region, provinceState, postalCode, countryCode, and community. Omitted fields remain unchanged; null clears a field.

Revoke, renew, and delete

Revoke returns the brochure with revokedAt set. The public data endpoint and /b/:slug viewer respond with 410 Gone while a brochure is revoked or expired.

Renew clears revocation and extends expiry from the time of the request:

{
  "expiresInDays": 90,
  "refreshListings": true
}

The response contains failedRefreshes when individual source refreshes fail; the renewed brochure and unchanged public URL remain valid. Use DELETE /brochures/:id only when permanent removal is intended.

Public viewer data

The localized web viewer uses the unauthenticated GET /public/brochures/:slug endpoint. Resolving it records a view asynchronously and returns the rich public payload used by the page. GET /public/brochures/:slug/exists checks link availability without returning the brochure.

When brochure.showLocations is false, every public listing returns null for addressLine1, addressLine2, postalCode, city, provinceState, region, countryCode, community, latitude, and longitude. The authenticated GET /brochures/:id management response keeps those fields so corrections and a later visibility change remain possible. Free-text titles, descriptions, recipient notes, and image content are not rewritten.

Treat the slug and publicUrl as bearer-like secrets: anyone who has the link can see its recipient note and listings until expiry or revocation. Do not log the URL or place sensitive personal data in recipient fields.

Themes

GET /properties/themes remains the theme catalogue for interactive brochures and dashboard window cards. It returns the canonical picker order with each theme's machine name, display label, mood description, light/dark preview colours, and primary font family. Registry-only tenant themes and retired compatibility aliases are not returned. Theme selection does not generate a PDF and does not create a brochure by itself.