This service returns the design the customer configured in their account —colors, typography, logo, favicon, slides, calls to action, footer contact person and social networks— in a shape that is ready to consume.
The difference with settings-v2 is the shape: there the design arrives mixed with the rest of the configuration, as a flat list of name/value pairs using Mapaprop's internal naming; here it arrives grouped by section and, above all, images come already resolved, not as fragments you have to assemble. For the design, this is the recommended service.
| Resource information | |
|---|---|
| Authentication | Required (API Token, Bearer) |
| Scope | express-base |
| HTTP Method | GET |
| Response | JSON |
| Version | 1 |
Resource URL
https://mapaprop.app/api/action/express-v1/design
Example code
GET /api/action/express-v1/design HTTP/1.1
Host: mapaprop.app
Content-Type: application/x-www-form-urlencoded
Content-Length: 0
Authorization: Bearer {access_token}
The headline may span several lines: it arrives with line breaks (\n) exactly as the customer typed them, because their site design uses them to lay the headline out over two or three lines. If you render it as HTML, convert those breaks — ignoring them collapses the headline into a single line.
Response
A JSON document with six sections. All six always come, but inside each one only the fields the customer configured travel: empty ones are omitted. A customer who only filled in Instagram and Facebook receives a social with those two keys and nothing else.
So read every field with a default on your side (design.social.youtube ?? "") instead of assuming the key is there.
| Object | Field | Type | Required | Description |
|---|---|---|---|---|
| Response | colors | Colors | yes | The site palette |
| typography | Typography | yes | The chosen typography | |
| images | Images | yes | Logo, favicon and slides | |
| callToActions | Array of CallToAction | yes | The three call to action blocks | |
| footer | Footer | yes | Footer data | |
| social | Social | yes | The real estate agency's social networks | |
| Colors | primary | string | yes | Main color, in #rrggbb format |
| primaryText | string | yes | Color of the text over the main color | |
| secondary | string | yes | Secondary color | |
| secondaryText | string | yes | Color of the text over the secondary color | |
| Typography | fontFamily | string | yes | Name of the font family (for example Poppins) |
| Images | logo | string | no | Logo URL. Absent if the customer did not upload one |
| favicon | string | no | Favicon URL. Absent if the customer did not upload one | |
| slides | Array of Slide | yes | The three slides of the home page carousel | |
| Slide | image | string | no | URL of the slide image. Absent if no image was uploaded |
| url | string | no | Where the slide leads when clicked | |
| title | string | no | Headline shown over the photo. Absent if the customer did not write one | |
| subtitle | string | no | Secondary text, below the headline. Absent if none was written | |
| CallToAction | index | number | yes | Position of the block: 1, 2 or 3 |
| enabled | boolean | yes | Whether the customer activated this block | |
| title | string | no | Block title | |
| description | string | no | Block text | |
| buttonText | string | no | Button text | |
| buttonLink | string | no | Button destination | |
| Footer | responsible | string | no | Free text with the person responsible for the agency (owner, license number, company) |
| Social | string | no | Instagram profile URL | |
| string | no | Facebook profile URL | ||
| string | no | X (Twitter) profile URL | ||
| string | no | LinkedIn profile URL | ||
| tiktok | string | no | TikTok profile URL | |
| youtube | string | no | YouTube channel URL |
The rule is simple: empty texts do not travel, numbers and booleans do. A call to action block the customer did not configure arrives as {"index": 2, "enabled": false} —with its position and its state, without the texts—. A missing field means the customer did not fill it in, not that something went wrong: that is where your own default goes.
Images
logo, favicon and slides[].image come resolved: if the customer uploaded the image from their account, they arrive as an absolute, ready-to-use URL. Use it as it is, without prepending any domain or rebuilding the path.
When the customer replaces an image, that URL may arrive with a ?v= parameter at the end. That is intentional: it forces the browser to download the new image instead of keeping the previous one. Keep the complete URL, including that parameter.
There is one case where the value is not an absolute URL: if it starts with / (for example /styles/customers/1687/logo.png), it is an old image living inside the template of the Mapaprop-hosted site, and it will not resolve from your own domain. The fix is one click and the customer makes it: upload that image from Website > Design in their account. From then on it arrives as an absolute URL. If you want to cover the case anyway, check whether the value starts with http before using it.
The three blocks and the three slides always come
callToActions always brings three elements and slides always three, whether they are configured or not. The blocks carry enabled so you know which ones to show; slides without an image arrive with an empty image. That way you can walk the lists by position without worrying about their length.
How often to request it
The design changes rarely: it is configured once and adjusted from time to time. The response is cached for one hour, so there is no point in requesting it on every visit — request it when building the page or store it on your server side.
Example response
{
"colors": {
"primary": "#195fa9",
"primaryText": "#ffffff",
"secondary": "#4a7fe8",
"secondaryText": "#ffffff"
},
"typography": {
"fontFamily": "Poppins"
},
"images": {
"logo": "https://images.mapaprop.app/website-images/4069/963/logo.png?v=1786500000",
"favicon": "https://images.mapaprop.app/website-images/4069/963/favicon.png?v=1786500000",
"slides": [
{
"image": "https://images.mapaprop.app/website-images/4069/963/slide1.jpg",
"url": "/propiedades",
"title": "Find your next home",
"subtitle": "More than 400 listings"
},
{
"image": "https://images.mapaprop.app/website-images/4069/963/slide2.jpg",
"url": "/contacto"
},
{}
]
},
"callToActions": [
{
"index": 1,
"enabled": true,
"title": "Tasación sin cargo",
"description": "Conocé el valor de tu propiedad hoy.",
"buttonText": "Solicitar tasación",
"buttonLink": "/contacto"
},
{
"index": 2,
"enabled": false
},
{
"index": 3,
"enabled": false
}
],
"footer": {
"responsible": "Responsable: Omar Gazze — Matrícula 59"
},
"social": {
"instagram": "https://instagram.com/inmobiliaria",
"facebook": "https://facebook.com/inmobiliaria"
}
}