API Documentation
Portals ¶
Overview
A Portal represents a public-facing surface for a brand, optionally tied to a lead channel. A brand has at most one portal; portals are created explicitly via the create endpoint.
| Field | Type | Association | Description |
|---|---|---|---|
| id | uuid | Internal identifier of the portal | |
| brand | uuid | brands(id) | Brand to which this portal belongs |
| lead_channel | uuid | lead_channels(id) | Optional lead channel attached to this portal |
| token | uuid | Authentication token for this portal | |
| hostnames | string[] | Hostnames associated with this portal (default first) | |
| created_at | number | Timestamp of when this portal was created | |
| updated_at | number | Timestamp of when this portal was last updated | |
| deleted_at | number | Timestamp of when this portal was deleted (if applicable) |
Ensure a brand has a portal ¶
Ensure a brand has a portalPUT/brands/:brand/portal
Idempotent — returns the brand’s existing portal if there is one, otherwise
creates one and returns it. The new portal’s lead_channel defaults to the
brand’s default lead channel (which itself is created on demand if missing).
brand (uuid) ID of the brand
Example URI
- brand
string(required) Example: b9469b6b-ed1b-4f91-b299-7255f279a447- associations
string(required) Example: portal.brand
200Body
{
"code": "OK",
"data": {
"id": "630bff5b-1834-4b09-9168-f78569703236",
"brand": {
"id": "b9469b6b-ed1b-4f91-b299-7255f279a447",
"created_at": 1787792162.523722,
"updated_at": 1787792162.523722,
"palette": null,
"assets": null,
"messages": null,
"parent": null,
"name": "PortalTestBrand",
"deleted_at": null,
"training": false,
"brand_type": "Brokerage",
"parents": null,
"type": "brand",
"hostnames": null,
"member_count": 1,
"base_url": "https://irish.rechat.com"
},
"type": "portal",
"created_at": 1787792162.972147,
"updated_at": 1787792162.972147,
"deleted_at": null,
"hostnames": null
}
}Get the portal of a brand ¶
Get the portal of a brandGET/brands/:brand/portal
Read-only. Returns 404 if the brand has no portal yet — use PUT to create
one.
brand (uuid) ID of the brand
Example URI
- brand
string(required) Example: b9469b6b-ed1b-4f91-b299-7255f279a447- associations
string(required) Example: portal.brand
200Body
{
"code": "OK",
"data": {
"id": "630bff5b-1834-4b09-9168-f78569703236",
"brand": {
"id": "b9469b6b-ed1b-4f91-b299-7255f279a447",
"created_at": 1787792162.523722,
"updated_at": 1787792162.523722,
"palette": null,
"assets": null,
"messages": null,
"parent": null,
"name": "PortalTestBrand",
"deleted_at": null,
"training": false,
"brand_type": "Brokerage",
"parents": null,
"type": "brand",
"hostnames": null,
"member_count": 1,
"base_url": "https://irish.rechat.com"
},
"type": "portal",
"created_at": 1787792162.972147,
"updated_at": 1787792162.972147,
"deleted_at": null,
"hostnames": null
}
}Look up a portal by hostname ¶
Look up a portal by hostnameGET/portals/search{?hostname}
hostname (string) Hostname to look up; must be at least 5 characters
Example URI
- hostname
string(required) Example: portal-testhost
200Body
{
"code": "OK",
"data": {
"id": "630bff5b-1834-4b09-9168-f78569703236",
"type": "portal",
"created_at": 1787792162.972147,
"updated_at": 1787792162.972147,
"deleted_at": null,
"hostnames": [
"portal-testhost"
]
}
}Portal Hostnames ¶
Add a hostname to a brand's portal ¶
Add a hostname to a brand's portalPOST/brands/:brand/portal/hostnames
brand (uuid) ID of the brand whose portal to add the hostname to.
hostname (string) Hostname to attach
is_default (boolean) Whether this hostname should be the default for the portal
Example URI
- brand
string(required) Example: b9469b6b-ed1b-4f91-b299-7255f279a447
Body
{
"hostname": "portal-testhost",
"is_default": true
}200Body
{
"code": "OK",
"data": {
"id": "630bff5b-1834-4b09-9168-f78569703236",
"type": "portal",
"created_at": 1787792162.972147,
"updated_at": 1787792162.972147,
"deleted_at": null,
"hostnames": [
"portal-testhost"
]
}
}Remove a hostname from a brand's portal ¶
Remove a hostname from a brand's portalDELETE/brands/:brand/portal/hostnames{?hostname}
brand (uuid) ID of the brand whose portal to remove the hostname from.
hostname (string) Hostname to detach
Example URI
- brand
string(required) Example: b9469b6b-ed1b-4f91-b299-7255f279a447- hostname
string(required) Example: portal-testhost
200Body
{
"code": "OK",
"data": {
"id": "630bff5b-1834-4b09-9168-f78569703236",
"type": "portal",
"created_at": 1787792162.972147,
"updated_at": 1787792162.972147,
"deleted_at": null,
"hostnames": null
}
}Portal Agents ¶
Authenticated by the portal’s own token (X-RECHAT-PORTAL-TOKEN), like the
saved-search endpoints below.
Get the agents of a portal brand ¶
Get the agents of a portal brandGET/portals/:id/agents{?start,limit}
Returns the users who are agents of the portal’s brand (or any of its child brands), ordered by name.
id (uuid) ID of the portal
query (string) Only return agents whose name or email matches
start (number) Pagination offset
limit (number) Maximum number of agents to return
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- start
string(required) Example: 0- limit
string(required) Example: 10
200Body
{
"code": "OK",
"data": [
{
"type": "user",
"username": null,
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"phone_number": "+12347686701",
"created_at": 1787792162.421988,
"id": "405839a9-7555-4f07-a3be-a4d33ecc57cf",
"address_id": null,
"cover_image_url": null,
"profile_image_url": null,
"updated_at": 1787792162.422004,
"user_status": "Active",
"profile_image_thumbnail_url": null,
"cover_image_thumbnail_url": null,
"email_confirmed": false,
"timezone": "America/Chicago",
"user_type": "Agent",
"deleted_at": null,
"phone_confirmed": false,
"is_shadow": null,
"personal_room": "e4612de3-c0a5-48a4-8ea4-da0d9d32f625",
"brand": null,
"fake_email": null,
"features": null,
"last_seen_at": null,
"email_signature": "This is my signature.",
"daily_enabled": false,
"email_quota": 30000,
"website": null,
"instagram": null,
"twitter": null,
"linkedin": null,
"youtube": null,
"facebook": null,
"designation": null,
"tiktok": null,
"mfa_enabled": false,
"xpressdocs_user_id": null,
"bio": "This is my bio.",
"current_time": "7:56 PM - Wednesday Aug 26, 2026",
"push_allowed": true,
"agents": null,
"last_seen_type": null,
"active_brand": "b9469b6b-ed1b-4f91-b299-7255f279a447",
"display_name": "John Doe",
"abbreviated_display_name": "John",
"online_state": "Offline",
"has_password": true
}
],
"info": {
"count": 1,
"total": 0
}
}Get a single agent of a portal brand ¶
Get a single agent of a portal brandGET/portals/:id/agents/:user
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- user
string(required) Example: 405839a9-7555-4f07-a3be-a4d33ecc57cf
200Body
{
"code": "OK",
"data": {
"type": "user",
"username": null,
"first_name": "John",
"last_name": "Doe",
"email": "[email protected]",
"phone_number": "+12347686701",
"created_at": 1787792162.421988,
"id": "405839a9-7555-4f07-a3be-a4d33ecc57cf",
"address_id": null,
"cover_image_url": null,
"profile_image_url": null,
"updated_at": 1787792162.422004,
"user_status": "Active",
"profile_image_thumbnail_url": null,
"cover_image_thumbnail_url": null,
"email_confirmed": false,
"timezone": "America/Chicago",
"user_type": "Agent",
"deleted_at": null,
"phone_confirmed": false,
"is_shadow": null,
"personal_room": "e4612de3-c0a5-48a4-8ea4-da0d9d32f625",
"brand": null,
"fake_email": null,
"features": null,
"last_seen_at": null,
"email_signature": "This is my signature.",
"daily_enabled": false,
"email_quota": 30000,
"website": null,
"instagram": null,
"twitter": null,
"linkedin": null,
"youtube": null,
"facebook": null,
"designation": null,
"tiktok": null,
"mfa_enabled": false,
"xpressdocs_user_id": null,
"bio": "This is my bio.",
"current_time": "7:56 PM - Wednesday Aug 26, 2026",
"push_allowed": true,
"agents": null,
"last_seen_type": null,
"active_brand": "b9469b6b-ed1b-4f91-b299-7255f279a447",
"display_name": "John Doe",
"abbreviated_display_name": "John",
"online_state": "Offline",
"has_password": true
}
}Portal Testimonials ¶
Authenticated by the portal’s own token (X-RECHAT-PORTAL-TOKEN), like the
saved-search endpoints below.
Get the testimonials of a portal brand ¶
Get the testimonials of a portal brandGET/portals/:id/testimonials{?start,limit}
Returns the testimonials of the portal’s brand, newest first.
id (uuid) ID of the portal
user (uuid) Only return testimonials for this user
start (number) Pagination offset
limit (number) Maximum number of testimonials to return
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- start
string(required) Example: 0- limit
string(required) Example: 10
200Body
{
"code": "OK",
"data": [
{
"id": "2bca3436-833e-42e2-8fec-27fd1d1bc40e",
"brand": "b9469b6b-ed1b-4f91-b299-7255f279a447",
"content": "Great agent, highly recommended!",
"rating": 5,
"created_at": 1787792162.405418,
"updated_at": 1787792162.405418,
"deleted_at": null,
"created_by": "405839a9-7555-4f07-a3be-a4d33ecc57cf",
"updated_by": null,
"captured_at": 1787792162.405418,
"tags": [],
"source": "Manual",
"zillow_review": null,
"google_review": null,
"type": "testimonial"
}
],
"info": {
"count": 1,
"total": 0
}
}Portal Saved Searches ¶
These endpoints are authenticated by the portal’s own token rather than a
bearer credential. Pass the token in the X-RECHAT-PORTAL-TOKEN header. The
token is returned on portal creation and webhook payloads — it is not
exposed via subsequent reads (Portal.publicize strips it).
Get saved searches for a contact ¶
Get saved searches for a contactGET/portals/:id/saved-searches/:contact
id (uuid) ID of the portal
contact (uuid) ID of the contact whose saved searches to list. The contact
must belong to the portal’s brand; the SQL filters by saved_searches.brand
so cross-brand pairings return an empty list.
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- contact
string(required) Example: 46caac2b-cf7e-46cf-82ad-4943a6e8a3b2
200Body
{
"code": "OK",
"data": [
{
"type": "saved_search",
"id": "d9291e8e-2234-491e-857b-e232d733265e",
"title": "Portal Search",
"minimum_price": 200000,
"maximum_price": null,
"currency": "USD",
"minimum_square_meters": null,
"maximum_square_meters": null,
"minimum_lot_square_meters": null,
"maximum_lot_square_meters": null,
"minimum_bedrooms": null,
"maximum_bedrooms": null,
"minimum_bathrooms": null,
"maximum_bathrooms": null,
"minimum_year_built": null,
"maximum_year_built": null,
"minimum_parking_spaces": null,
"property_types": null,
"property_subtypes": null,
"listing_statuses": null,
"architectural_styles": null,
"points": [
{
"longitude": -179,
"latitude": -89,
"type": "location"
},
{
"longitude": 179,
"latitude": -89,
"type": "location"
},
{
"longitude": 179,
"latitude": 89,
"type": "location"
},
{
"longitude": -179,
"latitude": 89,
"type": "location"
},
{
"longitude": -179,
"latitude": -89,
"type": "location"
}
],
"mls_areas": null,
"counties": null,
"subdivisions": null,
"postal_codes": null,
"school_districts": null,
"primary_schools": null,
"middle_schools": null,
"elementary_schools": null,
"senior_high_schools": null,
"junior_high_schools": null,
"intermediate_schools": null,
"high_schools": null,
"list_agents": null,
"list_offices": null,
"selling_agents": null,
"selling_offices": null,
"agents": null,
"offices": null,
"pool": null,
"open_house": null,
"pets": null,
"number_of_pets_allowed": null,
"application_fee": null,
"appliances": null,
"furnished": null,
"fenced_yard": null,
"office_exclusive": null,
"master_bedroom_in_first_floor": false,
"minimum_sold_date": null,
"search": null,
"created_at": 1787792163.607301,
"updated_at": 1787792163.607301,
"deleted_at": null,
"proposed_title": ", $200K+, Any Beds"
}
],
"info": {
"count": 1,
"total": 0
}
}Create a saved search ¶
Create a saved searchPOST/portals/:id/saved-searches
id (uuid) ID of the portal
contacts (uuid[], required, non-empty) Contacts to link the saved search
to. Every contact must belong to the portal’s brand or the request fails.
frequency (enum, required) Delivery frequency, one of Instant, Daily,
Weekly, Monthly, Never.
The from user is derived from the first contact’s first assignee role,
falling back to contact.user. brand is hardcoded from the portal.
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236
Body
{
"title": "Portal Search",
"minimum_price": 200000,
"contacts": [
"46caac2b-cf7e-46cf-82ad-4943a6e8a3b2"
],
"frequency": "Daily",
"points": [
{
"latitude": -89,
"longitude": -179
},
{
"latitude": -89,
"longitude": 179
},
{
"latitude": 89,
"longitude": 179
},
{
"latitude": 89,
"longitude": -179
},
{
"latitude": -89,
"longitude": -179
}
]
}200Body
{
"code": "OK",
"data": {
"type": "saved_search",
"id": "d9291e8e-2234-491e-857b-e232d733265e",
"title": "Portal Search",
"minimum_price": 200000,
"maximum_price": null,
"currency": "USD",
"minimum_square_meters": null,
"maximum_square_meters": null,
"minimum_lot_square_meters": null,
"maximum_lot_square_meters": null,
"minimum_bedrooms": null,
"maximum_bedrooms": null,
"minimum_bathrooms": null,
"maximum_bathrooms": null,
"minimum_year_built": null,
"maximum_year_built": null,
"minimum_parking_spaces": null,
"property_types": null,
"property_subtypes": null,
"listing_statuses": null,
"architectural_styles": null,
"points": [
{
"longitude": -179,
"latitude": -89,
"type": "location"
},
{
"longitude": 179,
"latitude": -89,
"type": "location"
},
{
"longitude": 179,
"latitude": 89,
"type": "location"
},
{
"longitude": -179,
"latitude": 89,
"type": "location"
},
{
"longitude": -179,
"latitude": -89,
"type": "location"
}
],
"mls_areas": null,
"counties": null,
"subdivisions": null,
"postal_codes": null,
"school_districts": null,
"primary_schools": null,
"middle_schools": null,
"elementary_schools": null,
"senior_high_schools": null,
"junior_high_schools": null,
"intermediate_schools": null,
"high_schools": null,
"list_agents": null,
"list_offices": null,
"selling_agents": null,
"selling_offices": null,
"agents": null,
"offices": null,
"pool": null,
"open_house": null,
"pets": null,
"number_of_pets_allowed": null,
"application_fee": null,
"appliances": null,
"furnished": null,
"fenced_yard": null,
"office_exclusive": null,
"master_bedroom_in_first_floor": false,
"minimum_sold_date": null,
"search": null,
"created_at": 1787792163.607301,
"updated_at": 1787792163.607301,
"deleted_at": null,
"proposed_title": ", $200K+, Any Beds"
}
}Update a saved search ¶
Update a saved searchPUT/portals/:id/saved-searches/:saved_search
id (uuid) ID of the portal
saved_search (uuid) ID of the saved search
The saved search’s brand must match the portal’s brand or the request
fails. Body is a partial update of saved-search fields.
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- saved_search
string(required) Example: d9291e8e-2234-491e-857b-e232d733265e
Body
{
"title": "Portal Search (renamed)",
"maximum_price": 600000
}200Body
{
"code": "OK",
"data": {
"type": "saved_search",
"id": "d9291e8e-2234-491e-857b-e232d733265e",
"title": "Portal Search (renamed)",
"minimum_price": 200000,
"maximum_price": 600000,
"currency": "USD",
"minimum_square_meters": null,
"maximum_square_meters": null,
"minimum_lot_square_meters": null,
"maximum_lot_square_meters": null,
"minimum_bedrooms": null,
"maximum_bedrooms": null,
"minimum_bathrooms": null,
"maximum_bathrooms": null,
"minimum_year_built": null,
"maximum_year_built": null,
"minimum_parking_spaces": null,
"property_types": null,
"property_subtypes": null,
"listing_statuses": null,
"architectural_styles": null,
"points": [
{
"longitude": -179,
"latitude": -89,
"type": "location"
},
{
"longitude": 179,
"latitude": -89,
"type": "location"
},
{
"longitude": 179,
"latitude": 89,
"type": "location"
},
{
"longitude": -179,
"latitude": 89,
"type": "location"
},
{
"longitude": -179,
"latitude": -89,
"type": "location"
}
],
"mls_areas": null,
"counties": null,
"subdivisions": null,
"postal_codes": null,
"school_districts": null,
"primary_schools": null,
"middle_schools": null,
"elementary_schools": null,
"senior_high_schools": null,
"junior_high_schools": null,
"intermediate_schools": null,
"high_schools": null,
"list_agents": null,
"list_offices": null,
"selling_agents": null,
"selling_offices": null,
"agents": null,
"offices": null,
"pool": null,
"open_house": null,
"pets": null,
"number_of_pets_allowed": null,
"application_fee": null,
"appliances": null,
"furnished": null,
"fenced_yard": null,
"office_exclusive": null,
"master_bedroom_in_first_floor": false,
"minimum_sold_date": null,
"search": null,
"created_at": 1787792163.607301,
"updated_at": 1787792163.7029,
"deleted_at": null,
"proposed_title": ", $200K-$600K, Any Beds"
}
}Portal Listing Search ¶
Authenticated by the portal’s own token (X-RECHAT-PORTAL-TOKEN).
All endpoints accept the same listing-filter fields as POST /portals/:id/saved-searches (minimum_price, maximum_price,
property_types, property_subtypes, listing_statuses, points,
mls_areas, etc.) — contacts and frequency are not used. Search is
automatically scoped to the portal’s brand (its MLSes and agent network);
brand in the request body is ignored.
Filter compact listings ¶
Filter compact listingsPOST/portals/:id/listings/compact/filter
Stateless listing search returning matching listings in the
compact_listing shape (used by list/grid views). Mirrors the
agent-facing POST /valerts. Private addresses are stripped from the
results.
id (uuid) ID of the portal
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236
Body
{
"property_types": [
"Residential"
],
"listing_statuses": [
"Active"
],
"minimum_price": 0,
"maximum_price": 9223372036854776000
}200Body
{
"code": "OK",
"data": [],
"info": {
"count": 0,
"total": 0
}
}Filter micro listings ¶
Filter micro listingsPOST/portals/:id/listings/micro/filter
Stateless listing search returning matching listings in the
micro_listing shape (used by map clusters). Mirrors the agent-facing
POST /listings/micro/filter.
id (uuid) ID of the portal
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236
Body
{
"property_types": [
"Residential"
],
"listing_statuses": [
"Active"
],
"minimum_price": 0,
"maximum_price": 9223372036854776000
}200Body
{
"code": "OK",
"data": [],
"info": {
"count": 0,
"total": 0
}
}Count listings ¶
Count listingsPOST/portals/:id/listings/count
Stateless count of listings matching the criteria. Returns the total in
info.total; no listing rows are returned.
id (uuid) ID of the portal
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236
Body
{
"property_types": [
"Residential"
],
"listing_statuses": [
"Active"
],
"minimum_price": 0,
"maximum_price": 9223372036854776000
}200Body
{
"code": "OK",
"info": {
"total": 0
}
}Count listings for a saved search ¶
Count listings for a saved searchGET/portals/:id/saved-searches/:saved_search/listings/count
Returns the total number of listings currently matching a persisted
saved search. The saved search’s brand must match the portal’s brand.
id (uuid) ID of the portal
saved_search (uuid) ID of the saved search
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- saved_search
string(required) Example: d9291e8e-2234-491e-857b-e232d733265e
200Body
{
"code": "OK",
"info": {
"total": 0
}
}Portal Contact Attributes ¶
Authenticated by the portal’s own token (X-RECHAT-PORTAL-TOKEN), like the
saved-search endpoints above.
Add attributes to a contact ¶
Add attributes to a contactPOST/portals/:id/contacts/:contact/attributes
Adds one or more attributes (tag, phone_number, email, etc.) to a contact
owned by the portal’s brand. Mirrors POST /contacts/:id/attributes but is
scoped to a portal and does not require a bearer token. The request is
recorded with no user_id (the caller is the portal, not an agent).
id (uuid) ID of the portal
contact (uuid) ID of the contact. The contact’s brand must match the
portal’s brand or the request fails.
attributes (array, required) Attribute objects to add — same shape
consumed by POST /contacts/:id/attributes.
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- contact
string(required) Example: 46caac2b-cf7e-46cf-82ad-4943a6e8a3b2
Body
{
"attributes": [
{
"attribute_type": "tag",
"text": "PortalLead"
},
{
"attribute_type": "phone_number",
"text": "+15555550123",
"label": "Mobile"
}
]
}200Body
{
"code": "OK",
"data": [
{
"id": "e01b6f66-f87e-4f6b-992e-02cb280e08b5",
"contact": "46caac2b-cf7e-46cf-82ad-4943a6e8a3b2",
"created_at": 1787792163.752907,
"updated_at": 1787792163.752907,
"deleted_at": null,
"label": null,
"is_primary": false,
"is_partner": false,
"index": null,
"created_by": null,
"updated_by": null,
"attribute_type": "tag",
"text": "PortalLead",
"date": null,
"address": null,
"type": "contact_attribute"
},
{
"id": "3dec8ec7-ebeb-443f-9b8c-e2263e48fbaa",
"contact": "46caac2b-cf7e-46cf-82ad-4943a6e8a3b2",
"created_at": 1787792163.752997,
"updated_at": 1787792163.752997,
"deleted_at": null,
"label": "Mobile",
"is_primary": false,
"is_partner": false,
"index": null,
"created_by": null,
"updated_by": null,
"attribute_type": "phone_number",
"text": "+15555550123",
"date": null,
"address": null,
"type": "contact_attribute"
}
],
"info": {
"count": 2,
"total": 0
}
}Portal Contact Timeline ¶
Authenticated by the portal’s own token (X-RECHAT-PORTAL-TOKEN), like the
saved-search endpoints above.
Record a contact activity ¶
Record a contact activityPOST/portals/:id/contacts/:contact/timeline
Records a timeline activity against a contact owned by the portal’s brand.
Mirrors POST /leads/:id/timeline but is scoped to a portal and does not
require a bearer token.
id (uuid) ID of the portal
contact (uuid) ID of the contact. The contact’s brand must match the
portal’s brand or the request fails.
The body is the same shape consumed by the lead timeline endpoint —
action, plus optional listing / lead / object / search fields.
Payload normalization (object_class/object_sa branching, MLS-number and
listing-id resolution) is shared via Activity.preparePayload.
Example URI
- id
string(required) Example: 630bff5b-1834-4b09-9168-f78569703236- contact
string(required) Example: 46caac2b-cf7e-46cf-82ad-4943a6e8a3b2
Body
{
"action": "ContactLoggedIn",
"object_class": "contact_lead",
"object_sa": {}
}200Body
{
"code": "OK",
"data": {
"id": "d4d9c604-3573-4a87-88b2-1790d8e46b1b",
"reference": "46caac2b-cf7e-46cf-82ad-4943a6e8a3b2",
"reference_type": "Contact",
"created_at": 1787792164.223119,
"updated_at": 1787792164.223119,
"deleted_at": null,
"object": {},
"action": "ContactLoggedIn",
"is_visible": true,
"brand": null,
"created_by": null,
"description": null,
"type": "activity"
}
}