RealtyMX
Data API reference
Real estate data for buildings, listings, deals, contacts and tenants — and the endpoints that write back: create and update listings.
Base URL
All requests go to https://dataapi.realtymx.com over HTTPS. Requests over plain HTTP are not supported.
Conventions
Reads are GET and take their parameters in the query string. Responses are JSON, and field names come back uppercase.
Most list endpoints share the same paging and filtering vocabulary:
limitandpagefor paging, capped at 100 per page.sortandorderfor ordering.updated_sinceto fetch only what changed, which is how a sync should poll.expandto pull related records into the same response.
Field names differ between reading and writing. The update endpoint takes closingDate where GET /listings returns CLOSING_DATE, and lease_term_min where it returns MIN_LEASE_TERM. Do not assume a value round-trips under the same name.
curl -G "https://dataapi.realtymx.com/listings" \ -d "apiKey=$API_KEY" \ -d "limit=5"
{
"TOTAL_COUNT": 1284,
"LISTINGS": [
{
"ID": 482913,
"PRICE": 4200,
"STATUS": "For Rent",
"DATE_AVAILABLE": "2026-11-01"
}
]
}
Getting started
Authentication
How you authenticate depends on whether you are reading or writing.
Reading
Pass your API key as the apiKey query parameter on every request. That is all a GET needs.
Writing
Endpoints that modify data require an Authorization header using the HTTP Basic scheme, in addition to the key. Send your API key as the user name and your secret as the password.
Join the key and secret with a colon, Base64-encode the whole string, and prefix it with Basic . Most HTTP clients do this for you if you hand them a user name and password.
Credentials
Your API key and secret are provided by RealtyMX. If a request is rejected with a 403, contact us — write access is granted per key, and a key that reads perfectly well may still need enabling.
Rate limits
| Limit | Threshold | Applies to |
|---|---|---|
| Requests per second | 3 | All keys |
| Simultaneous requests | 5 | All keys |
| Requests per hour | 100 | Limited-access keys only |
curl -G "https://dataapi.realtymx.com/tenants" \ -d "apiKey=$API_KEY" \ -d "[email protected]"
curl -X PATCH \ "https://dataapi.realtymx.com/listings/482913" \ -u "$API_KEY:$API_SECRET" \ -H "Content-Type: application/json" \ -d '{"price": 4200}'
Getting started
Errors
Errors return JSON with a message naming what failed. On a write, nothing is stored unless the whole request validates.
| Code | Meaning |
|---|---|
| 200 | Success. |
| 201 | Created — a new listing was written. The response carries its listing_id. |
| 400 | A parameter failed validation. The message says which. |
| 401 | No API key, or no Authorization header on a write. |
| 403 | Key inactive, not authorized, or the secret does not match. Contact RealtyMX. |
| 404 | No record with that ID in your database. |
| 405 | Your IP is not on the key's allow-list. The API returns 405 here rather than 403. |
| 409 | A listing for that unit already exists. The body lists the conflicts. |
| 429 | Rate limit exceeded. |
| 500 | Server or database fault. A write is rolled back in full. |
Warnings
Some writes are allowed but worth flagging. The response is still 200 (or 201) and carries a warnings array; its presence never means the request failed.
{
"message": "status must be one of:
1,2,11,12,19,21,22,0,…",
"status": "Error"
}
Listings
The listing object
Fields returned by /listings. Names come back uppercase.
Attributes
TOTAL_COUNT
Total listing count returned from API
ID
Listing ID number
IDX
0 or 1, Indicate listing is IDX listing Field is only used for RLS listings
VOW
0 or 1, Indicate listing is VOW listing Field is only used for RLS listings
REBNY_LISTING_ID
Rebny assigned listing ID similar to MLS ID Field is only used for RLS listings
PARTICIPANTS_ONLY
0 or 1, Indicate listing is shared with RLS participants only. These are withheld unless the API key is entitled to them, and they carry RLS_ID but usually no REBNY_LISTING_ID. The field itself is always returned, like IDX and VOW. Field is only used for RLS listings
STREET_NUMBER
Listing Address Street Number
ADDRESS
Listing Address House Number + Street Name
NEIGHBORHOOD_ID
Listing neighborhood ID
LATITUDE
decimal
Listing Latitude
LONGITUDE
decimal
Listing Longitude
TYPE
Property/Building Type. Multiple types can be specified as a comma-separated list (e.g. "Condo,Apartment" or "Commercial,Retail") Commercial Building Types: • Commercial • Retail • Office • Building • Land • Investment • Mixed Use Residential Building Types: • Condo • Apartment • Coop • Townhouse • House
EXPAND
Comma-separated list of related data to include in the response. Available options: • listings - Includes all active listings associated with the building • contacts - Includes all contacts associated with the building Note: When using expand, the response will include additional arrays (LISTINGS and/or CONTACTS) containing the expanded data.
STATUS
Suspend : 0 • For Sale : 1 • In Contract : 11 • Offer In : 12 • Sold : 19 • For Rent : 2 • App. Pending : 21 • Rented : 22 • Sales Inactive : -1 • Rental Inactive : -11 • In Contract Inactive : -12 • Offer In Inactive : -19 • Sold Inactive : -2 • App. Pending Inactive : -21 • Rented Inactive : -22
OFF_MARKET_STATUS
Indicates off market status for inactive listings • Off Market (Withdrawn) • Temporary Off Market (30 days) Field is only used for RLS listings
LISTING_CATEGORY
OPEN :0 • Semi-Exclusive :1 • Exclusive :2 • Co-Broke :6 • Private :4
AGENT_ID
integer
Listing agent ID
AGENT_NAME
Listing agent name
AGENT_EMAIL
Listing agent email address
AGENT_PHONE
Listing agent office phone number
AGENT_MOBILE
Listing agent mobile phone number
AGENT_IMAGE
Listing main agent image URL
VEDNOR_AGENT_ID
Vendor Listing Agent ID Field is only used for RLS listings
REBNY_AGENT_ID
Rebny Listing Agent ID Field is only used for RLS listings
CO_AGENT_ID
integer
listing co-agent ID
CO_AGENT_NAME
Listing co-agent name
CO_AGENT_EMAIL
Listing co-agent email address
CO_AGENT_PHONE
Listing co-agent office phone number
CO_AGENT_MOBILE
Listing co-agent mobile phone number
CO_AGENT_IMAGE
Listing co-main agent image URL
OFFICE_ID
integer
Listing agent office ID
OFFICE_NAME
Listing agent office name, e.g. Brooklyn Office
OFFICE_EMAIL
Listing agent office email address
OFFICE_PHONE
Listing agent office phone number
OFFICE_FAX
Listing agent office fax number
OFFICE_ADDRESS
Listing agent office address
OFFICE_WEBSITE
Listing agent office website URL
MANAGEMENT_COMPANY_ID
ID of managment company assocaited with listing Only available for Open Listings DB (Listing Force)
MANAGEMENT_COMPANY
Managment company name Only available for Open Listings DB (Listing Force)
MANAGEMENT_COMPANY_URL
Managment company web site URL Only available for Open Listings DB (Listing Force)
MANAGEMENT_COMPANY_PHONE
Managment company phone number Only available for Open Listings DB (Listing Force)
BEDROOMS
decimal
Bedroom count
BATHROOMS
decimal
Bathroom count
TOTAL_ROOMS
decimal
Total room count
PRICE
Montly rent or Sales price
FEE
Total fee %
COBROKE_FEE
% fee paid to renter or buyer side broker or agent
OP
Description of the fees paid by Owner such as 1 Month fee (Rental Only)
SECURITYDEPOSIT
Description of the security deposit (Rental Only)
NETRENT
Net Effective Rent (Rental Only)
FREEMONTH
Number of free month(s) for rental (Rental Only)
MONTHSFREEREQMINLEASE
Required minimum free month term to qualify free rent indicated at FREEMONTH (Free Month) field (Rental Only)
MAINTENANCE
Monthly maintenance fee for Coop (Sales Only)
COMMON_CHARGES
Monthly common charges for Condo (Sales Only)
DOWN_PAYMENT
% of minimum down payment(Sales Only)
DEDUCTABLE
Tax Deduction Percent(Sales Only)
CLOSING_PRICE
Sold or Rented
CLOSING_DATE
Date the property is Sold or Rented
ZONE
Building Zoning
AGENTS_NOTE
Building Agents Note
HEATING_SYSTEM
Gas-Forced-Air • Radiator • Central • Gas • Other
SERVICE_LEVEL
N/A • Full Service • Doorman (w/g) • Doorman (f/t) • Doorman (p/t) • Attended Lobby • Unattended Lobby • Virtual Doorman Only • Elevator • Brownstone • Walkup • Video • Voice
PUBLIC_TRANSPORT
Public Transporation information such as subway lines and bus stops
FAMILIES
Number of families. Usually used for building type House or Townhouse
UNITS
Number of units in building
YEAR_BUILT
Year when building was built
AMENITIES
Comma-separated amenity names, for example Dishwasher,Doorman,Roof Deck, with a possible trailing comma. Any of the 136 names listed under Update a listing → Available amenities can appear, limited to the amenities the client's database has.
PETS_POLICY
Unknown • No Pets • Cats Only • Dogs Only • Small Pets • Pets OK • Case By Case
UTILITIESINCLUDED
Gas • Electricity • Heat • Water • Cable/Internet • A/C
PARKING
Indoor • Outdoor • Assigned Parking • Heated • Valet • Street • Easy Street No Permit • Street with Permit
CONDITION
New Mint • Excellent • Good • Fair • Wreck • Estate
PHOTOS
PHOTO_ID: integer. The photo's ID - target it with PUT/DELETE /listings/{listing_id}/photos/{photo_id} • PHOTO_TITLE: Photo title • PHOTO_URL: Photo URL • SORT_ORDER: integer. numeric value for photo ordering • WIDTH: integer. photo width in pixel • HEIGHT: integer. photo height in pixel
CONTACTS
Contacts included when includeContacts flag set to TRUE • CONTACT_ID: Contact ID# • CONTACT_COMPANY: Contact Company Name • CONTACT_EMAIL: Contact Email Address • CONTACT_OFFICE_PHONE: Contact Office Phone Number • CONTACT_CELL_PHONE: Contact Cell Phone Number • CONTACT_WEBSITE: Contact Company Web Site URL • CONTACT_TYPE: Type of Contact • Landlord • Management • Broker • Super • Tenant • Agent • Doorman • Lawyer • Mortgage • Appraiser • Seller • ListingManager • Developer • Onsite • Group • Contractor • Inspector • Guarantor • Board • Other
LABELS
Labels included when addLabels flag set to TRUE • ID: Label ID# • NAME: Label Name
ACRIS_ID
Acris ID Field is only used for Acris listings
ACRIS_URL
Link to ACRIS Document Field is only used for Acris listings
ACRIS
Acris data is only enabled for the authorized API users • RECORDED_DATE: Sold / Closing recorded date from ACRIS • RECORDED_PRICE: Sold / Closing recorded price from ACRIS
BUILDING_CLASS
Indoor • Outdoor • Assigned Parking • Heated • Valet • Street • Easy Street No Permit • Street with Permit
ComingSoon
Boolean (0 or 1). Indicates if the listing is in Coming Soon status. A Coming Soon status means the listing is under contract with a listing agent but not yet fully active in the MLS. This status is used when a property is being prepared for sale but is not ready for showings. This status aligns with RESO (Real Estate Standards Organization) StandardStatus lookups
{
"TOTAL_COUNT":1,
"LISTINGS":[
{
"MANAGEMENT_COMPANY_ID":104,
"CONTACTS":[
{
"CONTACT_CELL_PHONE":"",
"CONTACT_TYPE":"Landlord,Management,",
"CONTACT_EMAIL":"[email protected]",
"CONTACT_ID":104,
"CONTACT_OFFICE_PHONE":"(212) 727-3500",
"CONTACT_COMPANY":"TF Cornerstone",
"CONTACT_WEBSITE":"http:\/\/www.tfcornerstone.com\/"
}
],
"LABELS":[
{
"ID":8,
"NAME":"Check Status every Monday"
},
{
"ID":9,
"NAME":"Company Exclusive"
}
],
"ACRIS_ID": "2021110900322001",
"ACRIS_DOC_URL": "https://a836-acris.nyc.gov/DS/DocumentSearch/DocumentDetail?doc_id=…",
"ACRIS": [
{
"RECORDED_DATE": "2007-08-08 00:00:00",
"RECORDED_PRICE": 880000
},
{
"RECORDED_DATE": "2020-06-18 00:00:00",
"RECORDED_PRICE": 1200000
}
],
"MONTHSFREEREQMINLEASE":0,
"CLOSING_DATE":"",
"MANAGEMENT_COMPANY":"TF Cornerstone",
"OPEN_HOUSE_REMARK":"",
"STREET_NUMBER":"45",
"HEATING_SYSTEM":"",
"MANAGEMENT_COMPANY_URL":"http:\/\/www.tfcornerstone.com\/",
"TOTAL_ROOMS":2.0000,
"MANAGEMENT_COMPANY_PHONE":"(212) 727-3500",
"STATUS":"For Rent",
"AMENITIES":"Balcony,Patio,Laundry In Unit,Doorman,Elevator,Health Club,Garage,S…",
"ID":15264,
"IDX":0,
"NETRENT": 3201.92,
"COBROKE_FEE":"0%",
"PHOTOS":[
{
"PHOTO_TITLE":"floorplan",
"PHOTO_URL":"http:\/\/tfc.com\/sites\/default\/files\/floorplans\/45WAA1_1601.pdf",
"SORT_ORDER":0,
"WIDTH":"",
"HEIGHT":""
},
{
"PHOTO_TITLE":"Photo 2",
"PHOTO_URL":"https:\/\/images.realty.mx\/618441d41cce47dbcfd9bed6e5ff64e6\/image…",
"SORT_ORDER":0,
"WIDTH":768,
"HEIGHT":768
},
{
"PHOTO_TITLE":"Photo 3",
"PHOTO_URL":"https:\/\/images.realty.mx\/618441d41cce47dbcfd9bed6e5ff64e6\/image…",
"SORT_ORDER":0,
"WIDTH":768,
"HEIGHT":768
}
],
"NEIGHBORHOOD_ID":16,
"PRICE":3493,
"BATHROOMS":1.0000,
"UTILITIESINCLUDED":"",
"EXPOSURE_REMARK":"",
"NAME":"",
"MAINTENANCE":0,
"OPEN_HOUSE_START_3":"",
"PETS_POLICY":"Pets OK",
"OPEN_HOUSE_START_4":"",
"MAX_LEASE_TERM":0,
"OPEN_HOUSE_START_1":"",
"ADDRESS":"45 Wall Street, Unit 1601",
"OPEN_HOUSE_START_2":"",
"DATE_LISTED":"2018-12-08",
"LISTING_TITLE":"Wall Street",
"SQUARE_FOOTAGE":0,
"CONDITION":"",
"OPEN_HOUSE_END_4":"",
"MIN_LEASE_TERM":0,
"OPEN_HOUSE_END_2":"",
"LATITUDE":40.706177,
"OPEN_HOUSE_END_3":"",
"OPEN_HOUSE_END_1":"",
"VOW":0,
"DOWN_PAYMENT":"0%",
"FLOOR_NUMBER":"",
"NEIGHBORHOODS":"Financial District",
"NUM_IMAGES":28,
"ZIP_CODE":"10005",
"LONGITUDE":-74.00992,
"TAXES":0,
"STORIES":27,
"STATE":"NY",
"NO_SHARES":0,
"VTOUR":"",
"CYOF":0,
"COMMON_CHARGES":0,
"DESCRIPTION":"1 Full Month OP*. $1,000 Security Deposit - Exclusions Apply. Ince…",
"HIDEADDRESS":0,
"MANAGEMENT_COMPANY_EMAIL":"[email protected]",
"DEDUCTIBLE":"0%",
"BEDROOMS":0.0000,
"COOLING_SYSTEM":"",
"PROPERTY_TYPE":"Apartment",
"BUILDING_ID":1600,
"DATE_CREATE":"2008-07-25 07:40:00",
"OP":"1 Month(s)",
"SOURCEDB":"LD",
"OPEN_HOUSE_REMARK_2":"",
"ACCESS_NOTE":"Tel: 212.797.7000 • Fax: 212.797.7000 Mon.-Sun. 10:00-6:00",
"FEE":"0%",
"OPEN_HOUSE_REMARK_4":"",
"OPEN_HOUSE_REMARK_3":"",
"STREET":"Wall Street",
"CUSTOMFIELDS":"",
"CONCESSION":"1 Full Month OP.* $1,000 Security Deposit - Exclusions Apply. Ince…",
"DATE_AVAILABLE":"",
"CLOSING_PRICE":"",
"CROSS_STREET":"WILLIAM ST.",
"FREEMONTH":0.0,
"LISTING_CATEGORY":"OPEN",
"CITY":"New York",
"BROKER_NOTE":"",
"UNIT_NUMBER":"1601",
"DATE_UPDATE":"2019-02-01 10:00:00",
"DOC_URL":"http:\/\/www.listingforce.com\/admin\/docs\/content\/3A085D59-945F-…"
}
]
}
Listings
List all listings
Returns list of listings
Required
apiKey
string
required
API KEY
Optional
limit
numeric
optional
default 20
Provide number of properties per page (10 / 20 / 40)
page
numeric
optional
default 1
Provide page number (1 or higher)
sort
string
optional
default date
Provide sorting factor (price / size / date). Default sorting value is date update
order
string
optional
default desc
Provide sorting order (desc / asc)
id
string
optional
ID number of an individual listing,or a comma-delimited list of ID numbers.
status
string
optional
default 1,2
Provide specific status id(s) [CSV] (Sales : 1, Rentals : 2, In Contract : 11, Offer In : 12, App. Pending : 21, Sold : 19, Rented : 22, Suspended : 0, Sales Inactive : -1, Rentals Inactive : -2, In Contract Inactive : -11, Offer In Inactive : -12, App. Pending Inactive : -21, Sold Inactive : -19, Rented Inactive : -22)
updated_since
string
optional
Confine results to listings which have benn updated since this time. Format MM/DD/YYYYTHH:MM
type
string
optional
Listing Building Type
distribute
string
optional
default 0
Public listings only set to 0 or to include Internal Listings set to -2
internal
boolean
optional
default false
Set to true to filter only internal listings (distribute values: 0, 3, -3, -2)
neighborhood_id
string
optional
ID number of an indivisual category id (neighborhood id), or a comma-delimited list of ID numbers
priceMin
numeric
optional
default 0
Provide minimum price
priceMax
numeric
optional
default 0
Provide maximum price
bedsMin
numeric
optional
default -1
Provide minimum bedroom count
bedsMax
numeric
optional
default -1
Provide maximum bedroom count
bathMin
numeric
optional
default 0
Provide minimum bathroom count
bathMax
numeric
optional
default 0
Provide maximum bathroom count
shortTerm
boolean
optional
default 0
Brings only short term listings
sortByCompanyID
numeric
optional
default 0
Company internal CID to bring the company listing at first
includeCoAgent
boolean
optional
default false
True or False to include co-agent fileds or not
includeContacts
boolean
optional
default false
True or False to include contact records associated with listings. This option applies to company Databse only, no RLS DB nor MLS DB. Opne Listing DB (Listing Force) automtically includes contact records.
includeDoc
boolean
optional
default false
True or False to include document assigned on assocaited contact level
includeLastOffmarketDate
boolean
optional
default 0
include the last date when the listing becomes off market status
addLabels
boolean
optional
default false
Boolean value to include labels associated with each listing
label
string
optional
Provide label name to search for
rls_id
string
optional
Provide RLS ID
mls_no
string
optional
Provide MLS No to search
category
string
optional
Provide a category value or a list of the listing category values. (0: Open, 1: Semi-exclusive, 2: Exclusive, 4: Private 6: Co-Broke)
amenities
string
optional
Provide amenities limitation [CSV] (Fireplace,Private Deck,Balcony,Terrace,Outdoor Space,Garden,Patio,Dining Room,Multi Level,Duplex,Triplex,Loft,Furnished,Dishwasher,Washer,Hardwood,High Ceilings,Renovated,Marble Bath,Granite Kitchen,Light,NO FEE,Vacation Rental,Eat In Kitchen,Walk In Closet,Laundry In Unit,Doorman,Elevator,Brownstone,Health Club,Pool,Garage,Subway,New Construction,Diplomats OK,Laundry,Bicycle Room,Storage,Nursery,Lounge,Valet,Roof Deck,Wheelchair Access,WiFi,Common Outdoor Space,Virtual Doorman,Receiving Room,Business Center,Green Building,River View,Park View,City View,Open View,Lake View,Freight Elevator,Concierge,Senior Housing,Live Work,Original Details,Skyline View,High Speed Internet,Maid Service,Live In Super,Children Playroom,Courtyard,Driveway,,Microwave,Stainless Steel Appliances,Pied a Terre,Room For Rent,Laundry Services,Wall to Wall Carpeting,One Month Free,Recreational Room,Convertible,Wine Cooler,Open Kitchen)
address
string
optional
listing address to search for, API will return best matching results
expand
string
optional
The list of expanded resource types you want included in the returned data. Curretnly expand supports agents and contacts. Agents return array of all agents associated with the listings.
featured
boolean
optional
default false
true or false to bring featured listings
square_footage_min
numeric
optional
default 0
Minimum Square Footage
pets_policy
string
optional
List of pets option to search for (0: Unknown, 99: No Pets, 1: Cats Only,4: Dogs Only, 2: Small Pets, 3: Pets OK,98: Case By Case
agent_email
string
optional
Search by agent email
marketplace_name
string
optional
marketplace name from api_user table
DATE_AVAILABLE can come back null. Availability is stored as free text, and most listings hold words rather than dates — Immediately, ASAP, TBD. Null means “not a parseable date”, not “not set”.
PRICE is not always what was written. When a listing is quoted as net effective rent, PRICE is the computed gross and NETRENT is the stored figure. Writing back what you read will inflate the price.
curl -G "https://dataapi.realtymx.com/listings" \ -d "apiKey=$API_KEY"
Listing inserts
The create response object
Fields returned by /listings. Names come back lower-case.
Attributes
status
string
Success on 201; Error otherwise.
message
string
What happened, or what failed.
listing_id
integer
ID of the created listing.
listing_status
integer
The stored status - always exactly what was requested.
building_id
integer
The building the listing was attached to.
building_matched_by
string
How the building was found: building_id, address (canonical match, zip agrees), address_zip_mismatch (address matched, stored zip differs), or address_loose (matched a building stored without a street-type word).
building_candidates
array
Address path only. Every building that matched, best first. More than one means the address exists as duplicate building records.
normalized_address
string
Address path only. The canonical form of the submitted street name used for matching. Also returned on a 404 so you can see what was searched.
distribute
integer
The stored distribution (2 External by default).
description_modified
boolean
True when the client's content rules altered the description; the details are in warnings and in the listing history.
market_status
string
on_market when the new listing is active - its days-on-market clock started and a Listed history entry was written. Absent otherwise.
warnings
array
Non-fatal notices: values replaced by building overrides, unusual prices, content removed from the description. Presence never means failure.
conflicts
array
On 409 only. The existing listings for the same unit that blocked the insert: listing_id, status, agent_id, date_create.
listing_url
string
Link to the listing in the RealtyMX admin.
{
"status": "Success",
"message": "Listing created.",
"listing_id": 155282,
"listing_status": 2,
"building_id": 32780,
"building_matched_by": "address",
"building_candidates": [32780, 32777, 32781],
"normalized_address": "west 23 street",
"distribute": 2,
"description_modified": false,
"market_status": "on_market",
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=155282"
}
Listing inserts
Create a listing
Creates a listing. Requires HTTP Basic authentication - Authorization: Basic base64(api_key:secret_key) - in addition to the API key. Supply either building_id or the address fields (house, address, zip, city, state); the address is normalised and matched against existing buildings, so any common spelling finds the same building. The status is stored exactly as requested - the web app's new-listing approval audit is deliberately not applied. Returns 201 with the new listing id, the building it was attached to, and any warnings.
This endpoint modifies data and uses HTTP Basic authentication rather than the apiKey parameter. See authentication.
Required
apiKey
string
required
API KEY. May be supplied as the username half of the Authorization header instead of as a parameter.
status
any
required
Listing status: 1 (For Sale), 2 (For Rent), 11 (In Contract), 12 (Offer In), 21 (App. Pending), 19 (Sold), 22 (Rented), 0 (Suspend), or the negative of any of these for the off-market equivalent. Stored as supplied.
price
any
required
Asking price. Numeric and greater than zero. A sales listing (status 1, 11, 12, 19) below 10,000 is rejected; a rental at 100,000 or more is accepted with a warning.
type
any
required
Property type: Apartment, House, Townhouse, Condo, Coop, Condop, Building, Commercial, Office, Retail, Investment, Development, Land, Parking Spots, Mixed Use. When the listing is attached to an existing building the building's type is used and a differing value produces a warning.
agent_id
any
required
ID of the listing's primary agent. Must be an active agent in the client database. Also recorded as the creator and as the author of the listing history entries.
Optional
building_id
any
optional
ID of an existing building to attach the listing to. Required unless house, address, zip, city and state are supplied. Cannot be combined with them.
house
any
optional
House number, up to 10 characters (Queens-style 43-12 accepted). Required unless building_id is supplied.
address
any
optional
Street name. Any common spelling is accepted (W 23rd St, West 23 Street, W23RD ST.) - it is normalised before matching existing buildings. Required unless building_id is supplied.
zip
any
optional
Zip code. Part of the building match. Required unless building_id is supplied.
city
any
optional
City, up to 20 characters. Required unless building_id is supplied.
state
any
optional
State, up to 3 characters. Required unless building_id is supplied.
apt
any
optional
Unit number, up to 10 characters; letters, digits, *, - and / only. Required when type is Apartment, Condo, Coop or Condop. A value starting with * bypasses the duplicate-listing check, as it does in the web app.
neighborhood_id
any
optional
Area (cats.cat_id, see /neighborhoods). Normally taken from the matched building; required only when that building carries no valid area. A supplied value that differs from the building's produces a warning.
co_agent_id
any
optional
ID of the co-agent. Must exist and differ from agent_id.
category
any
optional
0 (Open, default), 1 (Semi-Exclusive), 2 (Exclusive), 4 (Private), 6 (Co-Broke). An Exclusive listing requires a description.
distribute
any
optional
Distribution: 2 (External - website and marketplaces, default), -2 (Internal only), 0 (both), 1 (website only).
description
any
optional
Listing description. Subject to the client's description rules: phone numbers and/or email addresses may be removed, banned words removed and a disclaimer appended; the response reports any change. Required when category is 2.
web_title
any
optional
Web title, up to 100 characters. Banned words are removed.
date_available
any
optional
Availability: a date as YYYY-MM-DD, or one of Immediately, ASAP, NOW!.
floor
any
optional
Floor, up to 10 characters.
size
any
optional
Interior size in square feet. Whole number, zero or greater.
beds
any
optional
Bedroom count. Zero or greater; fractions allowed.
bath
any
optional
Bathroom count. Zero or greater; fractions allowed.
rooms
any
optional
Total room count. Zero or greater; fractions allowed. A value below the bedroom count returns a warning.
remark
any
optional
Short remark about the space, up to 50 characters - for example '1 Bedroom'.
net_effective_rent
any
optional
Whether the price is quoted as net effective rent. true/false. Requires months_free and min_lease_required greater than zero. Rentals only.
months_free
any
optional
Number of free months offered. Numeric, zero or greater. Rentals only.
min_lease_required
any
optional
Minimum lease length in months required for the free months. Numeric, zero or greater. Rentals only.
owner_pays_amount
any
optional
OP (Owner Pays) amount. Numeric, zero or greater. Rentals only.
owner_pays_type
any
optional
Unit for owner_pays_amount: 0 (N/A), 1 (Months), 4 (Weeks), 2 (Percent), 3 (Dollars). Rentals only.
lease_term_min
any
optional
Minimum lease term in months. Whole number; zero stores no value. Rentals only.
lease_term_max
any
optional
Maximum lease term in months. Whole number; zero stores no value; must not be lower than lease_term_min. Rentals only.
concessions
any
optional
Free-text concessions description. Rentals only.
cyof
any
optional
Collect Your Own Fee. true/false. Rentals only.
rent_type
any
optional
Lease type: 0 (N/A), 1 (Stabilized), 2 (Controlled), 3 (Decontrolled), 4 (Preferential). Rentals only.
fee
any
optional
Fee amount. Numeric, zero or greater; cannot exceed 100 when fee_type is percent.
fee_type
any
optional
Unit for fee: 0 (N/A), 1 (%), 2 ($), 3 (Month).
cobroke_amount
any
optional
Co-broke amount. Numeric, zero or greater; cannot exceed fee when both are percentages.
cobroke_type
any
optional
Unit for cobroke_amount: 0 (N/A), 1 (% office fee), 2 ($ office fee), 3 (Month office fee).
pets
any
optional
Pets policy: 0 (Unknown), 99 (No Pets), 1 (Cats Only), 4 (Dogs Only), 2 (Small Pets), 3 (Pets OK), 98 (Case By Case).
hide_address
any
optional
Hide the address on the website. true/false.
furnished
any
optional
Furnished. true/false.
amenities
any
optional
Array of amenity names, for example ["Doorman", "Roof Deck"]. Names are matched case-insensitively ignoring spaces. Amenities set on the building are applied automatically. See available amenities.
expiration_date
any
optional
Exclusive expiration date as YYYY-MM-DD. Exclusive listings only; must not be earlier than exclusive_start_date, and not in the past for an active status.
exclusive_start_date
any
optional
Exclusive start date as YYYY-MM-DD. Exclusive listings only; 1999-01-01 or later.
closingDate
any
optional
Closing date as YYYY-MM-DD. Applies when status is 19 (Sold) or 22 (Rented); defaults to today.
closingPrice
any
optional
Closing price in whole currency units. Applies when status is 19 or 22; defaults to price.
virtual_tour_url
any
optional
Virtual tour URL, for example a Matterport link - returned as VTOUR by GET /listings. An absolute http(s) URL of up to 200 characters.
virtual_tour_url_2
any
optional
Second virtual tour URL - returned as VTOUR2 by GET /listings. Same rules as virtual_tour_url.
access_note
any
optional
Agent and access notes / showing instructions. Not shown on the web site. Same name as the ACCESS_NOTE field GET /listings returns.
access_info
any
optional
Deprecated alias of access_note, still accepted for existing integrations. Ignored when access_note is also sent.
broker_note
any
optional
Broker-to-broker note, up to 300 characters.
Attaching to a building
Every listing belongs to a building. Pass building_id when you know it; otherwise send the address fields and the API finds the building for you. The street name is reduced to a canonical form before matching, so any common spelling works: W 23rd St, West 23 Street, W23RD ST. and w 23 st all find the same building. Abbreviations, ordinal suffixes (23/23rd), ordinal words up to Fifteenth (First Avenue ≡ 1st Ave) and directions (W ≡ West) are all equivalent; the house number and zip are matched too.
Addresses often exist as several duplicate building records. The API picks the best one — preferring your type, then the record with the most listings — and reports every match in building_candidates plus how it matched in building_matched_by (building_id, address, address_zip_mismatch, address_loose). For full determinism, pass building_id.
The endpoint never creates a building. When nothing matches you get 404 with the normalized_address it searched for; create the building in RealtyMX first or look it up with GET /buildings?address=.
The matched building supplies the listing's address block, area, cross street, subway line and its amenities — and, where the building's override flags are set, its category, pets policy, heating/cooling and fee block. Each value of yours it replaces is reported as a warning.
The status is stored as requested
Unlike the RealtyMX interface — where an agent's new listing may be held deactivated until a manager approves it — the API applies no approval audit. Send 2, store 2. Nobody is notified of the new listing, so coordinate with clients that rely on their approval flow. The status vocabulary is the same as the update endpoint's, including the negative off-market codes.
An active status (positive, not Sold or Rented) starts the days-on-market clock and writes a Listed history entry. Sold (19) and Rented (22) auto-fill closingDate and closingPrice from today and the price when you omit them.
Duplicates
If the same unit — same building, apartment and property type — already has an active listing, the request is refused with 409 and a conflicts array naming the existing listings. Nothing is written.
This is stricter than the RealtyMX interface on purpose: a client may be configured to tolerate a number of duplicate listings, but the API refuses the first one. The status you are inserting is irrelevant — a suspended or closed listing for an already-listed unit is refused too, otherwise the rule could be sidestepped with a follow-up update. Sold, Rented and off-market listings do not count as duplicates (re-listing a unit that was rented last year is normal), unless the client is configured to forbid duplicates outright, in which case its whole history counts.
Two gaps worth knowing: an apt beginning with * bypasses the check entirely, as it does in the app, and PATCH has no duplicate check — an existing listing can still be activated into a duplicate.
The description may be edited
Client content rules run server-side: phone numbers and email addresses may be stripped, banned words removed from the description and web title, and a disclaimer appended. The response says so — description_modified: true plus a warning per change — and the change is recorded in the listing's history.
Amenities and virtual tours
Send amenities as an array of names (see available amenities); the building's amenities are added automatically. virtual_tour_url and virtual_tour_url_2 set the listing's tour links — typically a Matterport URL — returned as VTOUR and VTOUR2 on GET /listings. Each must be an absolute http or https URL of up to 200 characters; embed code is refused. All three can be changed later with PATCH /listings/{listing_id}.
{ "status": 2, "price": 3500, "type": "Apartment",
"agent_id": 4351, "building_id": 1530, "apt": "4B",
"description": "Bright one bedroom with river views.",
"amenities": ["Dishwasher", "Hardwood", "Pantry"],
"virtual_tour_url": "https://my.matterport.com/show/?m=AbCdEf12345" }
Reading it back
GET /listings will not show the new listing with default parameters. The read endpoint's distribute filter defaults to 0, while a created listing defaults to 2 (External). Read it back with distribute=2, or create with "distribute": 0.
Add photos with POST /listings/{listing_id}/photos. A listing without photos is excluded from some marketplace feeds.
curl -X POST \ "https://dataapi.realtymx.com/listings" \ -u "$API_KEY:$API_SECRET" \ -H "Content-Type: application/json" \ -d '{"status": 2, "price": 3500, "type": "Apartment", "agent_id": 4351, "house": "555", "address": "West 23rd Street", "zip": "10011", "city": "New York", "state": "NY", "apt": "4B"}'
{
"status": "Error",
"message": "Another active listing with the same address
and unit exists. Active duplicate rental
listings are not allowed in this system.",
"conflicts": [
{
"listing_id": 155280,
"status": 2,
"agent_id": 4351,
"date_create": "2026-09-01"
}
]
}
Listing updates
The update response object
Fields returned by /listings/{listing_id}. Names come back lower-case.
Attributes
LISTING_ID
ID of the listing that was updated.
STATUS
Success or Error.
MESSAGE
Human readable outcome. On an error response this states which field failed validation and why.
CHANGES
One entry per field whose value actually changed, each with a from and a to. amenities is the exception: added and removed lists of amenity names. A field supplied in the request that already held that value does not appear here, and writes no listing history.
WARNINGS
Present only when a change was allowed but is worth flagging - a rental priced at 100,000 or more, total rooms below the bedroom count, a bath count below 1, an inherit_building_access_note request that found no building notes to copy, a description the client's rules changed, or a cleared tour URL that GET /listings will fill with the listing's April video. Its presence never means the update failed.
MARKET_STATUS
on_market or off_market, present only when the status change moved the listing across that boundary.
DAYS_ON_MARKET
Days the listing spent on market, present when it has just gone off market. Reported even when it is zero.
CLOSING_VALUES_DEFAULTED
true when the listing was closed without closing values and they were filled in from the current price and today's date.
ACCESS_NOTE_INHERITED
true when inherit_building_access_note was sent and the listing's access notes were replaced with a copy of its building's.
DESCRIPTION_MODIFIED
Present when description was sent: true when the client's description rules removed phone numbers, email addresses or banned words, or appended the client's disclaimer. The stored text is in changes.description.to.
LISTING_URL
Link to the listing in the RealtyMX admin, where the change and its history are visible.
1
For Sale -1
2
For Rent -2
11
In Contract -11
12
Offer In -12
21
App. Pending -21
19
Sold -19
22
Rented -22
0
Suspend n/a
Price
A price change entry in the listing history, returned by /listingsHistory. A decrease also records the previous price and the reduction date, which is what drives price drop indicators. An increase does not, and leaves any earlier reduction on record.
Status
A status change entry in the listing history, carrying the old and new status.
Availability
A change log entry recording the old and new value.
Space (size, beds, bath, rooms, remark)
A change log entry for each field that moved.
Rental terms
A change log entry for each field that moved, except the two lease term fields, which the edit form does not log either.
Access notes
A change log entry recording the old and new notes.
Description
A change log entry recording the old and new description, flattened to one line.
Virtual tours
A change log entry per tour URL that moved, labelled Virtual Tour or Virtual Tour2.
Amenities
One change log entry per amenity added or removed.
Coming back on market
A Listed or Relisted entry, and the days on market clock restarts.
Every update
The listing's last updated time, which updated_since filters read on the GET endpoints, and the updating agent taken from agent_id when supplied.
400
No writable field supplied; price not positive; unrecognised status; malformed date; a sales listing priced under 10,000; rental terms on a sales listing; closing values on a listing that is not Sold or Rented; net effective rent without free months and a minimum lease; minimum lease term above the maximum; unknown agent_id; access_note that is not a string, or sent on an MLS feed database; inherit_building_access_note that is not true/false, or sent together with an access_note value; description that is not a string; amenities that is not an array, or names an unknown amenity or one the client has no column for; a tour URL that is not an absolute http(s) URL or is longer than 200 characters.
401
API key missing, or the Authorization header is absent.
403
Key not authorized to write; wrong secret; secret missing or still derived from the public key.
404
No listing with that ID exists in the database this key is bound to.
429
Rate limit exceeded.
{
"listing_id": 155236,
"status": "Success",
"message": "Listing updated.",
"changes": {
"price": { "from": 4500.00, "to": 4200 },
"beds": { "from": 1, "to": 2 },
"date_available": { "from": "Immediately", "to": "2026-10-01" }
},
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=155236"
}
Listing updates
Update a listing
Updates the essential fields on a single listing: price, status and availability date, plus the closing fields for a sale or rental marked Sold or Rented, space, rental terms, the listing's access notes, description, amenities and virtual tour URLs. Updates are partial - only the fields present in the request body are changed and everything omitted is left as it is. PATCH is the documented verb; PUT is accepted as an alias and behaves identically (it does not clear omitted fields). Requires HTTP Basic authentication - Authorization: Basic base64(api_key:secret_key) - in addition to the API key. The endpoint reproduces what the RealtyMX web app does on save: price and status history, the days-on-market lifecycle, and closing-field auto-fill, so an API change is indistinguishable from an agent's and is returned by /listingsHistory
This endpoint modifies data and uses HTTP Basic authentication rather than the apiKey parameter. See authentication.
Required
apiKey
string
required
API KEY. May be supplied as the username half of the Authorization header instead of as a parameter.
listing_id
string
required
ID number of the listing to update. Taken from the URL path.
Optional
price
any
optional
New asking price. Numeric and greater than zero. Optional, but at least one of price, status or date_available must be supplied.
status
any
optional
New listing status. One of 1 (For Sale), 2 (For Rent), 11 (In Contract), 12 (Offer In), 21 (App. Pending), 19 (Sold), 22 (Rented), 0 (Suspend), or the negative of any of these for the off-market equivalent. Optional, but at least one of price, status or date_available must be supplied.
date_available
any
optional
New availability date as YYYY-MM-DD. ISO dates only - any other text is rejected. Optional, but at least one of price, status or date_available must be supplied.
closingDate
any
optional
Closing date as YYYY-MM-DD. Applies when status is 19 (Sold) or 22 (Rented); ignored otherwise. If omitted when closing a listing, it defaults to today, as the web app does.
closingPrice
any
optional
Closing price in whole currency units - the column is an integer and cannot hold cents. Applies when status is 19 (Sold) or 22 (Rented); ignored otherwise. If omitted when closing a listing, it defaults to the listing's current price, as the web app does.
agent_id
any
optional
ID of the agent the change is attributed to. Must exist in the client database. If omitted the change is recorded against the system account and shows no author in the listing history.
size
any
optional
Interior size in square feet. Whole number, zero or greater.
beds
any
optional
Bedroom count. Zero or greater; fractions allowed.
bath
any
optional
Bathroom count. Zero or greater; fractions allowed, so 1.5 is valid.
rooms
any
optional
Total room count. Zero or greater; fractions allowed. A value below the bedroom count is applied but returns a warning.
remark
any
optional
Short remark about the space, shown beside the room counts - for example '1 Bedroom' or 'Loft Style Studio'. Up to 50 characters. Send an empty string to clear it. Appears in the listing history as Space Type.
net_effective_rent
any
optional
Whether the price is quoted as net effective rent. true/false or 1/0. Setting this on requires months_free and min_lease_required to both be greater than zero, either in this request or already on the listing.
months_free
any
optional
Number of free months offered. Numeric, zero or greater; fractions allowed.
min_lease_required
any
optional
Minimum lease length in months required to qualify for the free months. Numeric, zero or greater.
owner_pays_amount
any
optional
OP (Owner Pays) amount. Numeric, zero or greater. Interpreted according to owner_pays_type.
owner_pays_type
any
optional
Unit for owner_pays_amount: 0 (N/A), 1 (Months), 4 (Weeks), 2 (Percent), 3 (Dollars).
lease_term_min
any
optional
Minimum lease term in months. Whole number, zero or greater; zero clears the value rather than storing 0, matching the web app.
lease_term_max
any
optional
Maximum lease term in months. Whole number, zero or greater; zero clears the value rather than storing 0. Must not be lower than lease_term_min.
concessions
any
optional
Free-text concessions description shown with the listing. Send an empty string to clear it.
cyof
any
optional
Collect Your Own Fee. true/false or 1/0.
rent_type
any
optional
Lease type: 0 (N/A), 1 (Stabilized), 2 (Controlled), 3 (Decontrolled), 4 (Preferential).
access_note
any
optional
Agent and access notes / showing instructions for this listing. Not shown on the web site. Send text to set the listing's own notes, or null or an empty string to clear them. To use the building's access notes instead, send inherit_building_access_note. Refused on MLS feed databases, where this column carries the listing agent's contact details.
inherit_building_access_note
any
optional
default false
Optional. true/false or 1/0, default false. When true, the building's access notes are copied onto the listing as its access_note. The copy is taken now; later edits to the building do not follow. Cannot be combined with an access_note value; access_note may be omitted or sent as null. If the listing has no building, or the building has no notes, the listing's notes are cleared and a warning is returned.
description
any
optional
Listing description, replacing the current one. Send null or an empty string to clear it. Subject to the client's description rules, as in the web app: phone numbers and/or email addresses may be removed, banned words removed and a disclaimer appended; the response reports any change in description_modified and warnings.
amenities
any
optional
The listing's complete amenity list as an array of names, for example ["Dishwasher", "Doorman"] - the names GET /listings returns in AMENITIES. Replaces the whole list: every amenity not named is removed, building amenities such as Doorman included. Send an empty array or null to clear every amenity. Names are matched case-insensitively ignoring spaces. See available amenities.
virtual_tour_url
any
optional
Virtual tour URL, for example a Matterport link - returned as VTOUR by GET /listings. An absolute http(s) URL of up to 200 characters. Send null or an empty string to clear it.
virtual_tour_url_2
any
optional
Second virtual tour URL - returned as VTOUR2 by GET /listings. Same rules as virtual_tour_url.
Updates are partial
Only the fields you send are changed; anything omitted keeps its current value. A field counts as absent if you omit it, send null, or send an empty string — except concessions and remark, where an empty string clears the text; access_note, description, virtual_tour_url and virtual_tour_url_2, where null or an empty string clears it; and amenities, which always replaces the whole list.
PUT is an alias for PATCH and behaves identically. It does not clear the fields you leave out.
Access notes
Send access_note as text to set the listing's own agent and access notes, or null / "" to clear them. To use the building's access notes instead, send the optional inherit_building_access_note: true (not together with an access_note value); the response then carries access_note_inherited: true.
Inheriting copies the building's notes once; it is not a live link. RealtyMX keeps the listing's and the building's access notes as separate fields, with no inherit flag. A later edit to the building does not reach the listing — send the flag again to pick the change up. If the listing has no building, or the building has no notes, the listing's notes are cleared and a warning says so.
Refused with 400 on the MLS feed databases (ROLEX, MLSNI, globalMLS), where the field holds the listing agent's contact details that GET /listings reads agent_name and agent_email from. Read the value back as ACCESS_NOTE on GET /listings.
Description, amenities and virtual tours
description replaces the listing description. It goes through the client's description rules, as in the RealtyMX interface: phone numbers or email addresses may be removed, banned words removed and the client's disclaimer appended. When that happens the response carries description_modified: true and a warning per rule, and changes.description.to is the text that was stored.
amenities is the listing's complete amenity list — send every amenity the listing should have, using the names GET /listings returns in AMENITIES. Anything not named is removed, and [] clears them all. changes.amenities lists what was added and removed.
Available amenities (136)
Send these names exactly, or in any case and with or without spaces. A name is refused if the client's database has no column for it.
- Balcony
- Basketball Court
- BBQ Grills
- Bicycle Room
- Breakfast Bar
- Brownstone
- Built In Shelving
- Business Center
- Catering Kitchen
- Chefs Kitchen
- Children Playroom
- Citibike Station
- City View
- Climate Controls
- Co Working Space
- Cold Storage
- Common Outdoor Space
- Concierge
- Corner Unit
- Courtyard
- Crown Molding
- Custom Closets
- Dining Alcove
- Dining Room
- Diplomats OK
- Dishwasher
- Dog Run
- Doorman
- Driveway
- Dry Cleaners
- Dual Vanities
- Duplex
- Eat In Kitchen
- Electric Car Charging Station
- Elevator
- En Suite Bathroom
- Entrance Foyer
- Exposed Brick
- Fire Pit
- Fireplace
- Floor To Ceiling Windows
- Free Rent
- Freight Elevator
- French Doors
- Furnished
- Game Room
- Garage
- Garden
- Golf Simulator
- Granite Kitchen
- Green Building
- Grocery Store On Site
- Hardwood
- Health Club
- Heated Floors
- High Ceilings
- High Speed Internet
- Home Office
- Keyless Entry
- Lake View
- Landmarked Building
- Laundry
- Laundry In Unit
- Laundry Services
- LEED Certification
- Library
- Light
- Live In Super
- Live Work
- Loft
- Lounge
- Maid Service
- Marble Bath
- Microwave
- Multi Level
- Music Practice Rooms
- New Construction
- New Development
- NO FEE
- Nursery
- One Month Free
- Open Kitchen
- Open View
- Original Details
- Outdoor Space
- Pantry
- Park View
- Patio
- Penthouse
- Pet Spa
- Pied a Terre
- Podcast Recording Studio
- Pool
- Private Deck
- Private Entry
- Receiving Room
- Recreational Room
- Renovated
- Resident Garden
- River View
- Roof Deck
- Room For Rent
- Sauna
- Security Cameras
- Senior Housing
- Shares OK
- Shuttle Service
- Skylight
- Skyline View
- Sleep Alcove
- Sliding Glass Doors
- Smart Home Technology
- Smoke Free
- Soaking Tub
- Sound Proof Windows
- Spa
- Sponsor Unit
- Stainless Steel Appliances
- Steam Shower
- Storage
- Subway
- Terrace
- Theatre
- Triplex
- Vacation Rental
- Valet
- Virtual Doorman
- Walk In Closet
- Wall to Wall Carpeting
- Walls OK
- Washer
- Washer Dryer Allowed
- Wheelchair Access
- WiFi
- Wine Cooler
- Yoga Studio
virtual_tour_url and virtual_tour_url_2 set the two tour links — typically a Matterport URL — returned as VTOUR and VTOUR2 on GET /listings. Each must be an absolute http or https URL of up to 200 characters; embed code is refused.
Sending values that already match
Not an error. You get 200, an empty changes object, and nothing is written — so the endpoint is safe to retry after a timeout.
Validation
These are the rules the RealtyMX edit form enforces, so the API cannot produce a listing the interface would have refused. Each is checked against the values as they will stand, so a partial update cannot slip past them.
| Rule | Result |
|---|---|
| Sales listing priced under 10,000 | 400 |
| Rental priced at 100,000 or more | 200 with a warning |
| Net effective rent on, without free months and a minimum lease | 400 |
| Minimum lease term above the maximum | 400 |
| Landlord pays the fee, but no OP amount and no CYOF | 400 |
| Rental terms on a sales listing | 400 |
| Closing values on a listing that is not Sold or Rented | 400 |
| Total rooms below the bedroom count, or a bath count below 1 | 200 with a warning |
Status values
Every status has a negative counterpart meaning the same thing, off market. Send -2 to take a rental off market while keeping it a rental.
| Value | Status | Off market | On market? |
|---|---|---|---|
| 1 | For Sale | -1 | Yes |
| 2 | For Rent | -2 | Yes |
| 11 | In Contract | -11 | Yes |
| 12 | Offer In | -12 | Yes |
| 21 | App. Pending | -21 | Yes |
| 19 | Sold | -19 | No |
| 22 | Rented | -22 | No |
| 0 | Suspend | — | No |
Statuses 1, 11, 12 and 19 are sales; 2, 21 and 22 are rentals. Rental terms are rejected on a sales listing.
What an update records
Changes are written to the listing's history, visible through /listingsHistory and in the RealtyMX interface. An API change is indistinguishable from an agent's. Everything from one call shares a single timestamp and commits together.
| Change | Recorded as |
|---|---|
| Price | A price-change entry with the old and new price and the percentage |
| Status | A status-change entry with the old and new status |
| Availability, space, rental terms, access notes | A change-log entry each, except the two lease term fields |
| Coming back on market | A Listed or Relisted entry |
| Auto-filled closing values | A change-log entry for each |
Some columns are maintained for you: the listing's last-updated time, the updating agent, and — on a price decrease only — the previous price and reduction date that drive price-drop indicators.
Days on market
Changing a status can move a listing on or off market, which starts or stops its days-on-market clock. A listing is on market when its status is positive and it is not Sold or Rented; an exclusive held temporarily off market still counts, so reactivating it does not restart the clock.
| Transition | Effect |
|---|---|
| On market → off | Elapsed days recorded; response includes days_on_market |
| Off market → on | The clock restarts and a Relisted entry is written |
| Within the same side | Nothing. For Rent → App. Pending is still on market |
days_on_market is returned whenever a listing goes off market, including when it is zero. Read the field being absent as “no market transition happened”, never as “zero days”.
curl -X PATCH \ "https://dataapi.realtymx.com/listings/482913" \ -u "$API_KEY:$API_SECRET" \ -H "Content-Type: application/json" \ -d '{"price": 4200}'
{
"listing_id": 155236,
"status": "Success",
"message": "Listing updated.",
"changes": {
"status": { "from": 2, "to": 22 },
"closingDate": { "from": "", "to": "2026-08-19" },
"closingPrice": { "from": "", "to": 4500 }
},
"market_status": "off_market",
"days_on_market": 1071,
"closing_values_defaulted": true,
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=155236"
}
{
"listing_id": 155236,
"status": "Success",
"message": "Listing updated.",
"warnings": [
"Total rooms (2) is below the bedroom count (3). The change was applied,
but StreetEasy rejects listings in this state."
],
"changes": {
"rooms": { "from": 5, "to": 2 }
},
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=155236"
}
{
"listing_id": 155236,
"status": "Success",
"message": "Listing updated.",
"changes": {
"access_note": { "from": "Call Jane Doe at 212-555-0100", "to": "Doorman on site 8am-8pm." }
},
"access_note_inherited": true,
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=155236"
}
{
"listing_id": 155236,
"status": "Success",
"message": "Listing updated.",
"warnings": [
"description: removed phone number(s)"
],
"changes": {
"description": { "from": "", "to": "Sunny one bedroom with river views. Call for a showing." },
"virtual_tour_url": { "from": "", "to": "https://my.matterport.com/show/?m=AbCdEf12345" },
"amenities": { "added": ["Dishwasher", "Laundry In Unit"], "removed": ["Elevator"] }
},
"description_modified": true,
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=155236"
}
{
"listing_id": 155236,
"status": "Success",
"message": "No changes applied; the listing already holds these values.",
"changes": {},
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=155236"
}
Listing history
The listing history object
Fields returned by /listingsHistory. Names come back uppercase.
Attributes
TOTAL_LISTING_COUNT
integer
Total listing count returned from API
LISTING_ID
integer
Listing ID number
ID
integer
Notes ID number
LOG_DATE
Date and Time field in YYYY-MM-DD HH:MM:SS format
NOTE_TYPE
Text. • History Log • Price Change • Status Change • User Comments • Change Log • Listed Date
COMMENT
Text. Listing History Note
COMPANY
Text. Company assocaited with the listing
TYPE
Integer, History Notes Type • 0 = History Log • 1 = Price Change • 2 = Status Change • 4 = User Comments • 6 = Change Log • 8 = Listed Date
OLD_STATUS
Text. Old Status before the Status change. Available when NOTE_TYPE = "Status Change" or TYPE = "2" • Suspend • For Sale • In Contract • Offer In • Sold • For Rent • App. Pending • Rented • Sales Inactive • Rental Inactive • In Contract Inactive • Offer In Inactive • Sold Inactive • App. Pending Inactive • Rented Inactive
NEW_STATUS
Text. New Status after the Status change. Available when NOTE_TYPE = "Status Change" or TYPE = "2" • Suspend • For Sale • In Contract • Offer In • Sold • For Rent • App. Pending • Rented • Sales Inactive • Rental Inactive • In Contract Inactive • Offer In Inactive • Sold Inactive • App. Pending Inactive • Rented Inactive
OLD_PRICE
integer
Old property price before the price change. Available when NOTE_TYPE = "Price Change" or TYPE = "1"
NEW_PRICE
integer
New property price after the price change. Available when NOTE_TYPE = "Price Change" or TYPE = "1"
PRICE_PRECENTAGE_CHANGE
decimal
Price percentage change Available when NOTE_TYPE = "Price Change" or TYPE = "1"
{
"TOTAL_LISTING_COUNT": 1,
"LISTING_HISTORY": [
{
"HISTORY_NOTES": [
{
"LOG_DATE": "2019-03-16 10:10:10",
"AGENT_ID": 1,
"NOTE_TYPE": "Listed Date",
"PRICE_PRECENTAGE_CHANGE": "",
"LISTING_ID": 850072,
"COMMENT": "Listed",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "",
"NEW_STATUS": "",
"OLD_PRICE": "",
"NEW_PRICE": "",
"ID": 6093764,
"TYPE": 8,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2019-03-16 10:10:10",
"AGENT_ID": 1,
"NOTE_TYPE": "Status Change",
"PRICE_PRECENTAGE_CHANGE": "",
"LISTING_ID": 850072,
"COMMENT": "Initial Status: For Sale",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "",
"NEW_STATUS": "For Sale",
"OLD_PRICE": "",
"NEW_PRICE": "",
"ID": 6093766,
"TYPE": 2,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2019-03-16 10:10:10",
"AGENT_ID": 1,
"NOTE_TYPE": "History Log",
"PRICE_PRECENTAGE_CHANGE": "",
"LISTING_ID": 850072,
"COMMENT": "Original Price: $548,000",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "",
"NEW_STATUS": "",
"OLD_PRICE": "",
"NEW_PRICE": "",
"ID": 6093765,
"TYPE": 0,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2019-04-29 18:39:15",
"AGENT_ID": 1,
"NOTE_TYPE": "Price Change",
"PRICE_PRECENTAGE_CHANGE": -5.47,
"LISTING_ID": 850072,
"COMMENT": "Price Change: $548,000 to $518,000 (- 5.47%)",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "",
"NEW_STATUS": "",
"OLD_PRICE": 548000,
"NEW_PRICE": 518000,
"ID": 6164544,
"TYPE": 1,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2019-06-05 12:56:39",
"AGENT_ID": 1,
"NOTE_TYPE": "Price Change",
"PRICE_PRECENTAGE_CHANGE": -3.86,
"LISTING_ID": 850072,
"COMMENT": "Price Change: $518,000 to $498,000 (- 3.86%)",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "",
"NEW_STATUS": "",
"OLD_PRICE": 518000,
"NEW_PRICE": 498000,
"ID": 6228633,
"TYPE": 1,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2019-09-03 11:51:53",
"AGENT_ID": 1,
"NOTE_TYPE": "Price Change",
"PRICE_PRECENTAGE_CHANGE": -10.04,
"LISTING_ID": 850072,
"COMMENT": "Price Change: $498,000 to $448,000 (- 10.04%)",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "",
"NEW_STATUS": "",
"OLD_PRICE": 498000,
"NEW_PRICE": 448000,
"ID": 6375831,
"TYPE": 1,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2019-09-23 17:53:41",
"AGENT_ID": 1,
"NOTE_TYPE": "Status Change",
"PRICE_PRECENTAGE_CHANGE": "",
"LISTING_ID": 850072,
"COMMENT": "Status Change: For Sale to In Contract",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "For Sale",
"NEW_STATUS": "In Contract",
"OLD_PRICE": "",
"NEW_PRICE": "",
"ID": 6412976,
"TYPE": 2,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2019-09-23 18:54:04",
"AGENT_ID": 1,
"NOTE_TYPE": "Price Change",
"PRICE_PRECENTAGE_CHANGE": 1.56,
"LISTING_ID": 850072,
"COMMENT": "Price Change: $448,000 to $455,000 (+ 1.56%)",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "",
"NEW_STATUS": "",
"OLD_PRICE": 448000,
"NEW_PRICE": 455000,
"ID": 6413069,
"TYPE": 1,
"NOTE_UPDATED_BY": "RLS "
},
{
"LOG_DATE": "2020-04-13 01:58:14",
"AGENT_ID": 1,
"NOTE_TYPE": "Status Change",
"PRICE_PRECENTAGE_CHANGE": "",
"LISTING_ID": 850072,
"COMMENT": "Status Change: In Contract to Sold",
"COMPANY": "Douglas Elliman Real Estate",
"OLD_STATUS": "In Contract",
"NEW_STATUS": "Sold",
"OLD_PRICE": "",
"NEW_PRICE": "",
"ID": 6660304,
"TYPE": 2,
"NOTE_UPDATED_BY": "RLS "
}
],
"LISTING_ID": 850072
}
]
}
Listing history
Retrieve listing history
Returns list of listingsHistory
Required
apiKey
string
required
API KEY
listing_id
string
required
ID number of an individual listing or a comma-delimited list of ID numbers.
Optional
limit
numeric
optional
default 20
Number of listings per result (5 / 10 / 20). Up to 100 listings per result
page
numeric
optional
default 1
Page number (1 or higher)
update_type
string
optional
Status for status change or Price for price change
updated_since
string
optional
Confine results to listing history which have benn updated since this time. Format MM/DD/YYYYTHH:MM, updated_since parameter only applies when update_type parameter is specified.
status_type
string
optional
Filter status change logs based on new listing status type or price change log based on the current listing status
curl -G "https://dataapi.realtymx.com/listingsHistory" \ -d "apiKey=$API_KEY"
Listing photos
The photo object
Fields returned by /listings/{listing_id}/photos. Names come back uppercase.
Attributes
PHOTO_ID
integer
The photo's ID. Stable for the life of the photo, including when its image is replaced. Also returned in GET /listings PHOTOS.
PHOTO_URL
string
The full-size image. Always absolute.
PHOTO_TITLE
string
Caption; empty when none.
SORT_ORDER
integer
1-based display order, always 1..N. Position 1 is the listing's main photo (the first non-PDF).
WIDTH, HEIGHT
integer | null
Stored pixel size, after resizing. null on old rows that never recorded it.
WATERMARKED
boolean | null
Whether the stored image carries the client's watermark. Known only for photos uploaded through the API; null otherwise.
MANAGED_BY_YOU
boolean
true if your API key uploaded this photo, or adopted it by replacing it with a source_id. Use it to keep your sync to your own photos.
SOURCE_ID
string | null
Your ID for the image, as sent on upload. Only when MANAGED_BY_YOU is true.
SHA256
string | null
Lower-case hex SHA-256 of the file you sent - not of the stored image, which is resized, re-encoded and possibly watermarked. Compare it with your source file to detect changes. Only when MANAGED_BY_YOU is true; RealtyMX holds no checksum for agent or feed photos.
UPLOADED_AT
string | null
ISO 8601 UTC time of the upload or last replace through the API. null for other photos.
{
"PHOTO_ID": 13554,
"PHOTO_URL": "https://images.realty.mx/3c4dbf7f2da0b868215e5f94fc1654f2/images/assets/482913_13554.jpg",
"PHOTO_TITLE": "Living room",
"SORT_ORDER": 3,
"WIDTH": 1800,
"HEIGHT": 1200,
"WATERMARKED": true,
"MANAGED_BY_YOU": true,
"SOURCE_ID": "acme-sync:unit-4B:img-0042",
"SHA256": "150958ef2d3c98b6fcc95e9118cad6a3550d4bb654dc44565046db5dbf99f5f1",
"UPLOADED_AT": "2026-10-05T14:02:11Z"
}
Listing photos
List a listing's photos
Lists a listing's photos, or uploads photos to it - one per request, or up to 10 in a batch. Built for automated photo sync: every upload carries a source_id, so a retry returns the existing photo instead of creating a duplicate, and photos uploaded by your key are marked MANAGED_BY_YOU with their SOURCE_ID and the SHA256 of the file you sent. Photo fields use the same names as the PHOTOS array on GET /listings (PHOTO_ID, PHOTO_URL, PHOTO_TITLE, SORT_ORDER, WIDTH, HEIGHT). Uploads are stored where the RealtyMX back office stores agent photos - same S3 layout and client watermark - and appear in the app, on GET /listings and in syndication feeds. GET needs only the API key; POST requires HTTP Basic authentication - Authorization: Basic base64(api_key:secret_key). Refused on MLS feed databases. Spec: docs/listings-photos-api-specification.md
Required
apiKey
string
required
API KEY
listing_id
string
required
ID number of the listing. Taken from the URL path.
What you can tell about a photo
Every photo on the listing is returned, whoever added it: agents in RealtyMX, feed imports, or any API key. MANAGED_BY_YOU, SOURCE_ID and SHA256 are filled in only for photos your key uploaded — RealtyMX keeps no checksum for agent or feed photos, so for those they are null. Agents can still edit any photo in the app: if one deletes a photo of yours it disappears here, and re-uploading its source_id creates it again.
The photo fields use the same names as the PHOTOS array on GET /listings — PHOTO_ID, PHOTO_URL, PHOTO_TITLE, SORT_ORDER, WIDTH, HEIGHT — plus the fields above. SORT_ORDER is always 1..N in display order here, even when the stored order has gaps from edits made in the app.
curl -G "https://dataapi.realtymx.com/listings/482913/photos" \ -d "apiKey=$API_KEY"
{
"LISTING_ID": 482913,
"PHOTO_COUNT": 2,
"PHOTO_LIMIT": 30,
"PHOTOS": [
{ "PHOTO_ID": 13552, "SORT_ORDER": 1, "MANAGED_BY_YOU": false, "SOURCE_ID": null, ... },
{ "PHOTO_ID": 13554, "SORT_ORDER": 2, "MANAGED_BY_YOU": true, "SOURCE_ID": "acme-sync:unit-4B:img-0042", ... }
]
}
Listing photos
The upload response object
Fields returned by /listings/{listing_id}/photos. Names come back lower-case.
Attributes
status
string
Success; for a batch, Partial when some photos failed, Error when all did.
message
string
What happened, or what failed.
listing_id
integer
The listing.
photo
object
Single upload. The photo object (upper-case keys, as on GET /listings PHOTOS), with its final SORT_ORDER.
photo_count
integer
Photos on the listing after the upload, from every source.
idempotent_replay
boolean
true when the source_id already held this same file, so nothing was written (HTTP 200 instead of 201).
results
array
Batch only. One entry per photo in index order: index, source_id, http_status (what that photo would have returned on its own), then photo and idempotent_replay, or error.
warnings
array
Present when something was adjusted, e.g. watermark=true sent to a client with no watermark configured.
listing_url
string
The listing's page in the RealtyMX back office.
{
"status": "Success",
"message": "Photo uploaded.",
"listing_id": 482913,
"photo": {
"PHOTO_ID": 13554,
"SORT_ORDER": 3,
"PHOTO_URL": "https://images.realty.mx/3c4dbf7f2da0b868215e5f94fc1654f2/images/assets/482913_13554.jpg",
"WATERMARKED": true,
"MANAGED_BY_YOU": true,
"SOURCE_ID": "acme-sync:unit-4B:img-0042",
...
},
"photo_count": 3,
"idempotent_replay": false,
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=482913"
}
Listing photos
Upload photos
Uploads one photo (multipart/form-data parts file, source_id, and optionally title, position, watermark), or a batch of up to 10 as indexed parts photos[0][file], photos[0][source_id], photos[1][file] ... with a top-level watermark as the batch default. JPEG or PNG, at most 15 MB per file and 60 MB per batch, at least 400 px on the shorter side. Stored as JPEG, scaled down to the client's maximum photo size. Returns 201 with the photo, or 200 with idempotent_replay true when the source_id already holds the same file. A batch returns one result per photo, with 207 if any failed; the photo limit is checked for the whole batch before anything is written. Requires HTTP Basic authentication.
This endpoint modifies data and uses HTTP Basic authentication rather than the apiKey parameter. See authentication.
Required
apiKey
string
required
API KEY. May be supplied as the username half of the Authorization header instead of as a parameter.
listing_id
string
required
ID number of the listing. Taken from the URL path.
Optional
file
any
optional
The image, as a multipart file part. JPEG or PNG, at most 15 MB. Required for a single upload; for a batch use photos[n][file] instead.
source_id
any
optional
Your stable ID for this image, 1-200 characters, matched case-insensitively. Required with file. Uploading the same source_id and file again returns the existing photo; the same source_id with a different file is a 409 - replace it with PUT. For a batch use photos[n][source_id].
title
any
optional
Optional caption, up to 50 characters. A title of floorplan, floor plan or floor-plan marks a floor plan, which is never watermarked. For a batch use photos[n][title].
position
any
optional
Optional 1-based position to insert the photo at. Omit to add it at the end; values past the end are clamped to the end. For a batch use photos[n][position].
watermark
any
optional
Optional. false skips the client's watermark for this upload; omit it, or send true, to follow the client's setting. In a batch this is the default for every photo, and photos[n][watermark] overrides it.
Retries cannot duplicate a photo
Every upload carries your source_id (case-insensitive). RealtyMX keeps one photo per key, listing and source_id:
The source_id… | Result |
|---|---|
| is new for this listing | 201, photo created |
| holds a photo with the same file (same SHA-256) | 200, idempotent_replay: true, nothing written |
| holds a photo with a different file | 409 naming the photo_id — replace it with PUT |
| held a photo that has since been deleted | 201, photo created again |
Batches
Send up to 10 photos in one request as indexed parts: photos[0][file], photos[0][source_id], photos[1][file]… Each takes the same optional title, position and watermark; a top-level watermark is the default. The photo limit is checked for the whole batch before anything is written; after that each photo succeeds or fails on its own, and the response is 207 Multi-Status with one result per photo when any failed. Resending a whole batch is safe. Allow about 1–2 seconds per photo.
What happens to the image
The type is read from the file's content. It is scaled down to the client's maximum photo size, re-encoded as JPEG (transparency is flattened onto white), turned upright from its EXIF orientation, watermarked when the client has a watermark configured. The listing's photo count, main photo and update date are refreshed, and the upload is recorded in its history.
| Limit | Value |
|---|---|
| Formats | JPEG, PNG. WebP, HEIC, GIF and PDF are refused (415) |
| File size | 15 MB per file, 60 MB per batch (413) |
| Image size | At least 400 px on the shorter side, at most 60 megapixels (422) |
| Damaged files | Truncated or undecodable files are refused (415) |
| Photos per listing | The client's limit, returned as PHOTO_LIMIT by GET (409) |
Refused with 403 on the MLS feed databases (ROLEX, MLSNI, globalMLS), and with 422 for older clients that keep photos on their own web server. A 502 means storage or the watermark was unavailable; nothing was saved, so retry.
curl -X POST "https://dataapi.realtymx.com/listings/482913/photos" \ -u "$API_KEY:$API_SECRET" \ -F "[email protected]" \ -F "source_id=acme-sync:unit-4B:img-0042" \ -F "title=Living room"
{
"status": "Partial",
"message": "2 of 3 photos uploaded.",
"listing_id": 482913,
"photo_count": 7,
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=482913",
"results": [
{ "index": 0, "source_id": "acme-sync:unit-4B:img-0041", "http_status": 201,
"idempotent_replay": false, "photo": { "PHOTO_ID": 13554, "SORT_ORDER": 6, ... } },
{ "index": 1, "source_id": "acme-sync:unit-4B:img-0042", "http_status": 200,
"idempotent_replay": true, "photo": { "PHOTO_ID": 13550, "SORT_ORDER": 1, ... } },
{ "index": 2, "source_id": "acme-sync:unit-4B:img-0043", "http_status": 415,
"error": "The file is not a JPEG or PNG image." }
]
}
Listing photos
The photo update response object
Fields returned by /listings/{listing_id}/photos/{photo_id}. Names come back lower-case.
Attributes
status
string
Success, or Error.
message
string
Photo updated, or No changes when everything sent already matched.
photo
object
The photo object after the change.
photo_count
integer
Photos on the listing.
changes
object
Each changed field - photo_url, photo_title, sort_order - with its from and to value. Empty when nothing changed.
warnings
array
Present when something was adjusted.
listing_url
string
The listing's page in the RealtyMX back office.
{
"status": "Success",
"message": "Photo updated.",
"listing_id": 482913,
"photo": { "PHOTO_ID": 13554, "SORT_ORDER": 1, ... },
"photo_count": 3,
"changes": {
"photo_url": {
"from": "https://images.realty.mx/3c4dbf7f2da0b868215e5f94fc1654f2/images/assets/482913_13554.jpg",
"to": "https://images.realty.mx/3c4dbf7f2da0b868215e5f94fc1654f2/images/assets/482913_13554_1.jpg"
},
"sort_order": { "from": 3, "to": 1 }
},
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=482913"
}
Listing photos
Update a photo
Changes one photo. Send any of file, title, position as multipart/form-data. A new file replaces the image and keeps its photo_id and position; it is stored under a new file name so caches pick it up. Sending the same file again as the one on record is a no-op.
This endpoint modifies data and uses HTTP Basic authentication rather than the apiKey parameter. See authentication.
Required
apiKey
string
required
API KEY. May be supplied as the username half of the Authorization header instead of as a parameter.
listing_id
string
required
ID number of the listing. Taken from the URL path.
photo_id
string
required
ID number of the photo. Taken from the URL path.
Optional
file
any
optional
Optional new image, as a multipart file part. JPEG or PNG, at most 15 MB. Processed and watermarked like an upload.
source_id
any
optional
Optional, with file only. Records the new image under this source_id. On a photo your key did not upload, this adopts the photo: it becomes MANAGED_BY_YOU. Must not belong to another photo on the listing.
title
any
optional
Optional new caption, up to 50 characters. An empty value clears it.
position
any
optional
Optional new 1-based position. The other photos shift to make room; values past the end move the photo to the end.
watermark
any
optional
Optional, with file only. false skips the client's watermark for the new image.
Any photo on the listing can be changed
Including photos added by agents, feeds or other API keys — keep to your own with MANAGED_BY_YOU. Sending a source_id with a new file on a photo you did not upload adopts it: it becomes MANAGED_BY_YOU and later retries are idempotent. Every change is written to the listing's history with your key's name.
Send multipart/form-data when replacing the file; a title or position change can also be sent as JSON or a form-encoded body. Sending the same file that is already on record is a no-op that returns No changes.
A replaced image gets a new file name, so its PHOTO_URL changes. changes reports photo_url, photo_title and sort_order. Images are served through a CDN, which can keep showing an old or deleted image for a few minutes.
curl -X PUT "https://dataapi.realtymx.com/listings/482913/photos/13554" \ -u "$API_KEY:$API_SECRET" \ -F "[email protected]" \ -F "position=1"
Listing photos
Delete a photo
Deletes one photo. The remaining photos are renumbered 1..N. The stored files are removed unless another photo row still uses them (photos copied between listings share files).
This endpoint modifies data and uses HTTP Basic authentication rather than the apiKey parameter. See authentication.
Required
apiKey
string
required
API KEY. May be supplied as the username half of the Authorization header instead of as a parameter.
listing_id
string
required
ID number of the listing. Taken from the URL path.
photo_id
string
required
ID number of the photo. Taken from the URL path.
curl -X DELETE "https://dataapi.realtymx.com/listings/482913/photos/13554" \ -u "$API_KEY:$API_SECRET"
{
"status": "Success",
"message": "Photo deleted.",
"listing_id": 482913,
"photo_id": 13554,
"photo_count": 2,
"listing_url": "https://demo.realtymx.com/admin2/view_listing.cfm?id=482913"
}
Buildings
The building object
Fields returned by /buildings. Names come back uppercase.
Attributes
TOTAL_COUNT
integer
Total building count returned from API
ID
integer
Building ID number
STREET_NUMBER
Building Street Number
ADDRESS
Building Address
ALTERNATE_ADDRESS
Building Alternate Address
LATITUDE
decimal
Building Latitude
LONGITUDE
decimal
Building Longitude
ALTERNATE_ADDRESS
Building Alternate Address
CATEGORY
Open • Semi-Exclusive • Exclusive • Co-Broke • Private
PROPERTY_TYPE
Apartment • House • Townhouse • Condo • Coop • Condop • Building • Commercial • Office • Retail • Investment • Development • Land • Parking Spots • Mixed Use
AMENITIES
A list of one or more building amenitites • Bicycle Room • Brownstone • Business Center • Children Playroom • Common Outdoor Space • Concierge • Courtyard • Diplomats OK • Doorman • Driveway • Elevator • Freight Elevator • Garage • Green Building • Health Club • High Speed Internet • Laundry • Laundry Services • Live In Super • Lounge • Maid Service • New Construction • Nursery • Pied a Terre • Pool • Receiving Room • Roof Deck • Storage • Subway • Valet • Virtual Doorman • Wheelchair Access • WiFi
AGENTS_NOTE
Building Agents Note
DEALS_NOTE
Building Deals Note
PUBLIC_NOTE
Building Note for public
PRIVATE_NOTE
Building Note for internal use
ACCESS_NOTE
Building Access Note
PUBLIC_TRANSPORT
Public Transporation information such as subway lines and bus stops
FAMILIES
integer
Number of families. Usually used for building type House or Townhouse
UNITS
integer
Number of units in building
YEAR_BUILT
integer
Year when building was built e.g 2000
PERIOD
Prewar • Postwar • New • N/A
HEATING_SYSTEM
Gas-Forced-Air • Radiator • Central • Gas • Other
COOLING_SYSTEM
Central AC • Window/Wall • None
SERVICE_LEVEL
N/A • Full Service • Doorman (w/g) • Doorman (f/t) • Doorman (p/t) • Attended Lobby • Unattended Lobby • Virtual Doorman Only • Elevator • Brownstone • Walkup • Video • Voice
PETS_POLICY
Unknown • No Pets • Cats Only • Dogs Only • Small Pets • Pets OK • Case By Case
WALLS_POLICY
Pressurized Walls • Bookcase Walls • Glass Sliding Door • Walkabout Wall • Divider • No Walls • Case by case
SHARES_POLICY
Shares Allowed • Shares Not Allowed • Case by case
PARKING
Indoor • Outdoor • Assigned Parking • Heated • Valet • Street • Easy Street No Permit • Street with Permit
ZONE
Building Zoning
BUILDING_CLASS
Building class for commercial building use. • A • B • C
BUILDING_EXTENSION
Building extension code for commercial building use.
PHOTOS
PHOTO_TITLE: Photo title • PHOTO_URL: Photo URL • PHOTO_ORDER: integer. numeric value for photo ordering • WIDTH: integer. photo width in pixel • HEIGHT: integer. photo height in pixel
EXPAND
Comma-separated list of related data to include in the response. Available options: • listings - Every listing attached to the building, active or not (ID, UNIT_NUMBER, STATUS, PRICE, BEDROOMS, BATHROOMS, ROOMS, DATE_UPDATE), newest update first. Inactive statuses end in "Inactive" • contacts - All contacts linked to the building (ID, COMPANY, EMAIL, OFFICEPHONE) Note: When using expand, the response will include additional arrays (LISTINGS and/or CONTACTS) containing the expanded data.
MATCH
object
Present only when the request has address. Counted after every other filter, so management_company_id or contact_id can settle an ambiguous address.
• STATUS - not_found (0 buildings), unique (1) or ambiguous (2 or more: the same address stored as several buildings)
• BUILDING_IDS - every matching building ID, across all pages
• HOUSE / NORMALIZED_ADDRESS - the house number and canonical street key that were searched, e.g. east 38 street
• ZIP - the zip applied, from zip or the end of address; empty when none
• ZIP_MISMATCH_IDS - buildings at the same address with a different stored zip, left out of BUILDING_IDS. Check these before creating a building on not_found
MANAGEMENT_COMPANY_ID
integer
ID of the building's management company (contact record). Where several contacts are linked, this is the one with the lowest ID
MANAGEMENT_COMPANY
Building contact company name
MANAGEMENT_COMPANY_URL
Building conatct web site URL
MANAGEMENT_COMPANY_PHONE
Building conatct phone number
{
"TOTAL_COUNT": 7756,
"BUILDINGS": [
{
"MANAGEMENT_COMPANY_ID": 990,
"MANAGEMENT_COMPANY": "TF Cornerstone",
"ZONE": "ABC",
"STREET_NUMBER": "99",
"AGENTS_NOTE": "Pets Policy: Yes - Case by Case",
"HEATING_SYSTEM": "Central",
"MANAGEMENT_COMPANY_URL": "",
"SERVICE_LEVEL": "Full Service",
"MANAGEMENT_COMPANY_PHONE": "(212) 627-1000",
"PUBLIC_TRANSPORT": "A,C,1,2,4,5",
"FAMILIES": 0,
"YEAR_BUILT": 2003,
"AMENITIES": "Doorman,Elevator,Health Club,Garage,Subway,Laundry,Bicycle Room,Sto…",
"ID": 1530,
"PARKING": "Indoor",
"UNITS": 439,
"PHOTOS": [
{
"PHOTO_TITLE": "",
"PHOTO_URL": "http://demo.realtymx.com/images/assets/1530_13380.jpg",
"SORT_ORDER": 1,
"WIDTH": 259,
"HEIGHT": 194
}
],
"NEIGHBORHOOD_ID": 16,
"BUILDING_CLASS": "",
"BLOCK": 0,
"STYLE": "N/A",
"UTILITIESINCLUDED": "",
"NAME": "99 John Deco Lofts",
"LOT": 0,
"SHARES_POLICY": "Shares Allowed",
"DEALS_NOTE": "USA guarantors accepted\r\n2-3 week Approval time \r\nSigned applic…",
"ALTERNATE_ADDRESS": "",
"PETS_POLICY": "No Pets",
"ADDRESS": "99 John Street",
"PERIOD": "Postwar",
"PUBLIC_NOTE": "Built in 1933, the 99 John Deco Lofts building straddles the Financ…",
"BUILDING_EXTENSION": "",
"LATITUDE": 40.70836,
"NEIGHBORHOODS": "Financial District",
"NUM_IMAGES": 1,
"BUILDING_WEBSITE": "http://www.99johndecolofts.com/",
"ZIP_CODE": "10038",
"LONGITUDE": -74.006004,
"PRIVATE_NOTE": "",
"BUILDING_KEYS": "KWDM",
"STORIES": 25,
"STATE": "NY",
"LOT_SIZE": "",
"CYOF": 0,
"KEY_CODE": "",
"CATEGORY": "OPEN",
"MANAGEMENT_COMPANY_EMAIL": "",
"COOLING_SYSTEM": "Central AC",
"PROPERTY_TYPE": "Condo",
"BUILDING_PHONE": "212-212-2121",
"DATE_CREATE": "2018-03-29 14:27:27",
"SOURCEDB": "demo",
"ACCESS_NOTE": "TEL: (212) 217-9999 FAX: (212) 217-9995\r\nshows mon - fri 1-1:30pm…",
"SCHOOL_CODE": "D2",
"WALLS_POLICY": "Pressurized Walls",
"STREET": "John Street",
"CONCESSION": "",
"CROSS_STREET": "CLIFF ST.",
"CITY": "New York",
"BUILDING_SIZE": "",
"DATE_UPDATE": "2018-03-29 14:42:47"
}
]
}
Buildings
List all buildings
Returns list of buildings. Pass address to look a building up by its street address instead: the response then carries a MATCH block whose STATUS is not_found, unique or ambiguous.
Required
apiKey
string
required
API KEY
Optional
limit
numeric
optional
default 20
Provide number of properties per page (10 / 20 / 40)
page
numeric
optional
default 1
Provide page number (1 or higher)
sort
string
optional
default date
Provide sorting factor (id / date)
order
string
optional
default desc
Provide sorting order (desc / asc)
id
string
optional
ID number of an individual listing,or a comma-delimited list of ID numbers.
updated_since
string
optional
Confine results to buildings which have benn updated since this time. Format mm/dd/yyyyThh:nn
type
string
optional
Building Type ()
neighborhood_id
string
optional
ID number of an indivisual category id (neighborhood id), or a comma-delimited list of ID numbers
expand
string
optional
Comma-separated list of related data to include (listings,contacts)
featured
string
optional
Filter by featured flag (1 = featured, 0 = not featured)
address
string
optional
Street address to look up, starting with the house number, e.g. 555 W 23rd St or 555 West 23rd Street, New York, NY 10011 (only the part before the first comma is matched; a trailing zip is used when zip is not given). Matched exactly after normalisation - abbreviations, ordinals and directions are equated (W 23 St = West 23rd Street) against the building's address and alternate address. Adds a MATCH block to the response.
zip
string
optional
5-digit zip code. Only used with address: buildings whose stored zip differs are excluded (and listed in MATCH.ZIP_MISMATCH_IDS).
management_company_id
string
optional
Contact ID of the management company (the MANAGEMENT_COMPANY_ID returned for each building), or a comma-delimited list
contact_id
string
optional
Contact ID, or a comma-delimited list. Matches buildings linked to any of these contacts, not only through MANAGEMENT_COMPANY_ID
Looking a building up by address
Pass address — house number first, e.g. 330 E 38th St or a full line like 330 East 38th Street, New York, NY 10016 — and the response gains a MATCH object whose STATUS is not_found, unique or ambiguous, with every matching ID in BUILDING_IDS. A lookup always returns 200; not_found is a result, not an error. Only the text before the first comma is matched, and a trailing zip is used when zip is not sent.
Matching uses the same canonical street key as POST /listings, so W 23 St, West 23rd Street and W23RD ST. are equal, compared against the building's address and alternate address. Unlike POST /listings it is exact: there is no looser fallback, and it never picks a winner for you.
ambiguous is common. The same address is often stored as several building records (2,702 addresses on one large client). Narrow it with zip, management_company_id or contact_id — MATCH is computed after every other filter — or choose yourself; expand=listings shows which record is in use.
not_found does not always mean “safe to create”. Buildings at the same address with a different stored zip (including blank) are listed in ZIP_MISMATCH_IDS. And buildings stored without a street-type word (W 23, LEONARD) are not found by W 23rd St — search the stored form too.
Filtering by contact
management_company_id matches the contact each building reports as MANAGEMENT_COMPANY_ID — the lowest-ID linked contact, since RealtyMX does not mark which link is the manager. contact_id matches any linked contact. They differ only for the roughly 5% of buildings with more than one contact; when in doubt, use contact_id.
Expanded listings include inactive ones
expand=listings returns every listing ever attached to the building, whatever its status. Filter on STATUS — off-market statuses end in Inactive.
curl -G "https://dataapi.realtymx.com/buildings" \ -d "apiKey=$API_KEY"
{
"TOTAL_COUNT": 2,
"MATCH": {
"STATUS": "ambiguous",
"BUILDING_IDS": [34, 239],
"HOUSE": "330",
"NORMALIZED_ADDRESS": "east 38 street",
"ZIP": "",
"ZIP_MISMATCH_IDS": []
},
"BUILDINGS": [
{
"ID": 34,
"ADDRESS": "330 E 38TH ST.",
"ZIP_CODE": "10009",
"MANAGEMENT_COMPANY_ID": 2,
"LISTINGS": [
{
"ID": 404,
"UNIT_NUMBER": "4B",
"STATUS": "Rental Inactive",
"PRICE": 3550,
"BEDROOMS": 1,
"BATHROOMS": 1,
"ROOMS": 3,
"DATE_UPDATE": "2026-05-17 18:54:00"
}
]
},
{
"ID": 239,
"ADDRESS": "330 East 38th Street",
"ZIP_CODE": "10016",
"MANAGEMENT_COMPANY_ID": "",
"LISTINGS": []
}
]
}
Neighborhoods
The neighborhood object
Fields returned by /neighborhoods. Names come back uppercase.
Attributes
NEIGHBORHOOD_ID
integer
Neighborhood ID. This is the value to pass as neighborhood_id when filtering listings or buildings.
NEIGHBORHOOD
string
Neighborhood name, for example Battery Park City.
PARENT_NEIGHBORHOOD_ID
integer
ID of the area this neighborhood sits inside. 0 means it is itself a top-level area, such as a borough.
PARENT_NEIGHBORHOOD
string
Name of the parent area. An empty string on a top-level area, which is how you tell boroughs from the neighborhoods within them.
NEIGHBORHOOD_IMAGE
string
Image URL for the neighborhood. Frequently empty.
NEIGHBORHOOD_DESCRIPTION
string
Free-text description. Frequently empty.
[
{
"NEIGHBORHOOD_ID": 23,
"NEIGHBORHOOD": "Manhattan",
"PARENT_NEIGHBORHOOD_ID": 0,
"PARENT_NEIGHBORHOOD": "",
"NEIGHBORHOOD_IMAGE": "",
"NEIGHBORHOOD_DESCRIPTION": ""
},
{
"NEIGHBORHOOD_ID": 25,
"NEIGHBORHOOD": "Battery Park City",
"PARENT_NEIGHBORHOOD_ID": 23,
"PARENT_NEIGHBORHOOD": "Manhattan",
"NEIGHBORHOOD_IMAGE": "",
"NEIGHBORHOOD_DESCRIPTION": ""
}
]
Neighborhoods
List all neighborhoods
Returns list of neighborhoods
Required
apiKey
string
required
API KEY
Optional
neighborhood_id
string
optional
ID number of an indivisual neighborhood id, or a comma-delimited list of ID numbers
curl -G "https://dataapi.realtymx.com/neighborhoods" \ -d "apiKey=$API_KEY"
Contacts
The contact object
Fields returned by /contacts. Names come back uppercase.
Attributes
TOTAL_COUNT
integer
Total contact count matching the request, not the number returned on this page.
ID
integer
Contact ID number.
COMPANY
string
Company name. Often the only name a contact has, since many contacts are companies rather than people.
TYPE
string
What the contact is. A contact can be several things at once, so this is a comma-separated list built from the individual flags below, and it carries a trailing comma - Broker, rather than Broker. An empty string means no type is set. • Landlord • Management • Broker • Super • Tenant • Agent • Doorman • Lawyer • Mortgage • Appraiser • Seller • ListingManager • Developer • Onsite • Group • Contractor • Inspector • Guarantor • Board • Limited • Other
STATUS
string
Whether the contact record is active. • Active • Inactive
CATEGORY
string
The exclusivity arrangement with this contact. • OPEN • Semi-Exclusive • Exclusive • Co-Broke • Private
EMAIL
string
Contact email address. Not a unique identifier - the same address can appear on several contact records, and some are agent addresses rather than the contact's own.
PHONE
string
Office phone number.
WEBSITE
string
Contact website.
ADDRESS
string
Full address as street, city state zip. Returned as an empty string when the street address is blank, rather than a partial address made up of city and state alone.
PETS_POLICY
string
The contact's pets policy, applied to their listings. • Unknown • Cats Only • Small Dogs • Pets OK • Dogs Only • Case By Case • No Pets
GUARANTOR
string
Where a guarantor may be based for this contact's listings. • Unknown • No Guarantor • Case by Case • New York City • New York State • Tri State • USA • Anywhere
CONCESSION
string
Free-text concessions offered across this contact's listings.
DO_NOT_ADVERTISE
integer
1 when the contact's listings must not be advertised, otherwise 0.
ACCESS_NOTE
string
How to get into the building - keys, doorman, lockbox.
AGENTS_NOTE
string
Internal note for agents. Not intended for public display.
LISTING_AGENT_ID1 / ID2 / ID3
string
IDs of up to three listing agents assigned to this contact. Empty when the slot is unused, so a contact with one agent returns values in the first slot only.
LISTING_AGENT_NAME1 / NAME2 / NAME3
string
First and last name of the agent in the matching ID slot.
DATE_CREATE
datetime
When the contact record was created.
DATE_UPDATE
datetime
When the contact record was last changed. This is what updated_since filters on.
{
"TOTAL_COUNT": 71,
"contacts": [
{
"ID": 6,
"COMPANY": "Example Management LLC",
"TYPE": "Landlord,Management,",
"STATUS": "Active",
"CATEGORY": "OPEN",
"EMAIL": "[email protected]",
"PHONE": "6465551234",
"WEBSITE": "https://example.com",
"ADDRESS": "100 Example Street, NEW YORK NY 10025",
"PETS_POLICY": "Case By Case",
"GUARANTOR": "New York State",
"CONCESSION": "1 month free on a 12 month lease",
"DO_NOT_ADVERTISE": 0,
"ACCESS_NOTE": "Keys at the front desk",
"AGENTS_NOTE": "Call before showing",
"LISTING_AGENT_ID1": "2710",
"LISTING_AGENT_NAME1": "Jane Doe",
"LISTING_AGENT_ID2": "",
"LISTING_AGENT_NAME2": "",
"LISTING_AGENT_ID3": "",
"LISTING_AGENT_NAME3": "",
"DATE_CREATE": "2003-01-22 01:13:01",
"DATE_UPDATE": "2024-08-21 11:22:02"
}
]
}
Contacts
List all contacts
Returns list of contacts
Required
apiKey
string
required
API KEY
Optional
limit
numeric
optional
default 20
Provide number of properties per page (10 / 20 / 40)
page
numeric
optional
default 1
Provide page number (1 or higher)
sort
string
optional
default date
Provide sorting factor (id / date)
order
string
optional
default desc
Provide sorting order (desc / asc)
id
string
optional
ID number of an individual contact ,or a comma-delimited list of ID numbers.
updated_since
string
optional
Confine results to contacts which have benn updated since this time. Format mm/dd/yyyyThh:nn
curl -G "https://dataapi.realtymx.com/contacts" \ -d "apiKey=$API_KEY"
Tenants
The tenant object
Fields returned by /tenants. Names come back uppercase.
Attributes
TOTAL_COUNT
Total tenant count matching the lookup (not the number returned on this page)
ID
Tenant (contact) ID number
NAME / FIRST_NAME / LAST_NAME
Tenant name
EMAIL
Tenant email address. Not a unique identifier — one email can match several contact records, which are returned as separate entries. Some addresses are agent emails or placeholders shared by many unrelated clients.
CELL_PHONE
Cell number. May be empty even when HOME_PHONE is populated.
HOME_PHONE
Home number
OFFICE_PHONE
Office number
REPRESENTATION
Tenant representation registration status. • HAS_AGREEMENT: true when a signed representation agreement is on file • SIGNATURE: the name the tenant signed with • SIGNED_DATE: date the agreement was signed • ACKNOWLEDGED: legacy acknowledgement flag; left null on recent records, so HAS_AGREEMENT is the reliable field • IS_TENANT_AGENT: agreement is tenant-side. Only captured since 2026-02-13 — older signed agreements return false because the flag did not exist yet, which is not evidence of landlord-side representation • IS_LANDLORD_AGENT: agreement is landlord-side • EXPIRATION_DATE: derived, see EXPIRATION_IS_DERIVED below • IS_ACTIVE: true when the derived EXPIRATION_DATE has not passed; inherits the same approximation • EXPIRATION_IS_DERIVED: always true. No expiration is stored in the database. EXPIRATION_DATE is calculated as SIGNED_DATE + EXPIRATION_TERM_DAYS. The agreement text actually runs from the date the tenant is introduced to a given property, which is per-property and not stored, so treat this date as indicative rather than contractual • EXPIRATION_TERM_DAYS: term used for the calculation (agreement_term_days request parameter, default 120) • AGENT: the agent associated with the tenant (ID / NAME / EMAIL). This is the agent currently assigned to the contact record, which is what the agent_id request parameter filters on. A tenant reassigned to a new agent carries their past registrations with them, so this is not a reliable record of who was present at signing
SEARCH_CRITERIA
The optional "Search Criteria" block of the registration form. Every field is optional, and most registrants leave part of it blank, so check HAS_CRITERIA before treating an empty value as meaningful. Fields the tenant did not fill in are returned as an empty string, never as 0. • HAS_CRITERIA: true when the tenant supplied at least one criterion. SHARING_APARTMENT is deliberately excluded from this test, because false there does not distinguish "answered No" from "never answered" • APT_SIZE: size code, 1–6. Empty when not provided (stored as the -1 sentinel) • APT_SIZE_LABEL: the label for that code — Studio / Loft, Alcove Studio, One Bedroom, Two Bedroom, Three Bedroom, Four Bedroom +. The mapping lives in the registration form rather than the database; see the specification if you consume more than one client database • PRICE_MIN / PRICE_MAX: monthly rent range in dollars. Empty when the box was left blank (stored as the -1 sentinel). A returned 0 is stored distinctly from blank — read it as "no minimum" rather than as a missing value • PREFERRED_AREAS: neighborhoods the tenant selected, in the order they were stored. Empty array when none were chosen. The list mixes granularity: an entry may be a top-level region (Downtown, Brooklyn) or a neighborhood within one (East Village), and a tenant can pick both a region and neighborhoods inside it. • ID / NAME: neighborhood ID and name, matching /neighborhoods • PARENT_ID / PARENT_NAME: the region the neighborhood sits in; both empty when the entry is itself a top-level region • HAS_PETS: true when the tenant declared pets. There is no pets column in the database — the form stores the literal string "No" when the answer was No and when the question was skipped, so false does not distinguish the two • PETS_DESCRIPTION: free text describing the pets, e.g. "Cat", "2 small dogs". Empty when HAS_PETS is false • MOVE_BY: date the tenant must move by (yyyy-mm-dd). Self-reported and not validated, so a small number of records carry obviously mistyped years • REASON_FOR_MOVING: free text, e.g. "Lease ending" • SHARING_APARTMENT: true when the tenant said they would share the apartment. False covers both "answered No" and "never answered"
COSIGNERS
Co-signer (guarantor) declared on the tenant's application. Empty when none is declared. For co-signers recorded against a specific lease, use /leases. • NAME: Co-signer name • RELATIONSHIP: Relationship to the tenant, e.g. Father • INCOME: Free-text income. -1 means "not provided" • STATE: Co-signer state • SOURCE: Where the co-signer came from; "application" for the tenant's own application
INTERESTED_IN_MOVERS
Answer to the registration form's "Will you be using professional moving services?" question: true (Yes), false (No), or an empty string when it was not answered. The form pre-selects Yes, so true can mean the tenant left the default rather than actively asked for movers.
INTERESTED_IN_UTILITIES
Answer to the registration form's "Will you need a telecommunications / internet service provider?" question: true (Yes), false (No), or an empty string when it was not answered. Despite the name this covers telecom / internet only, not gas or electricity. The form pre-selects Yes, so true can mean the tenant left the default. Empty on some 2019–2020 registrations taken on a form version that did not ask it.
{
"TOTAL_COUNT": 1,
"tenants": [
{
"ID": 111079,
"NAME": "Jane Doe",
"FIRST_NAME": "Jane",
"LAST_NAME": "Doe",
"EMAIL": "[email protected]",
"CELL_PHONE": "6465551234",
"HOME_PHONE": "",
"OFFICE_PHONE": "",
"REPRESENTATION": {
"HAS_AGREEMENT": true,
"SIGNATURE": "Jane Doe",
"SIGNED_DATE": "2026-07-16 15:23:31",
"ACKNOWLEDGED": false,
"IS_TENANT_AGENT": true,
"IS_LANDLORD_AGENT": false,
"EXPIRATION_DATE": "2026-11-13",
"IS_ACTIVE": true,
"EXPIRATION_IS_DERIVED": true,
"EXPIRATION_TERM_DAYS": 120,
"AGENT": {
"ID": 2710,
"NAME": "Judy Stepeck",
"EMAIL": "[email protected]"
}
},
"SEARCH_CRITERIA": {
"HAS_CRITERIA": true,
"APT_SIZE": 3,
"APT_SIZE_LABEL": "One Bedroom",
"PRICE_MIN": 2500,
"PRICE_MAX": 4000,
"PREFERRED_AREAS": [
{
"ID": 9,
"NAME": "East Village",
"PARENT_ID": 166,
"PARENT_NAME": "Downtown"
},
{
"ID": 163,
"NAME": "East Side",
"PARENT_ID": "",
"PARENT_NAME": ""
}
],
"HAS_PETS": true,
"PETS_DESCRIPTION": "Cat",
"MOVE_BY": "2026-09-01",
"REASON_FOR_MOVING": "Lease ending",
"SHARING_APARTMENT": false
},
"COSIGNERS": [
{
"NAME": "John Doe",
"RELATIONSHIP": "Father",
"INCOME": "150000",
"STATE": "NY",
"SOURCE": "application"
}
],
"INTERESTED_IN_MOVERS": true,
"INTERESTED_IN_UTILITIES": false
}
]
}
Tenants
Look up a tenant
Returns a tenant's (client's) representation registration status: whether an agreement is signed, the signing agent, the sign date, a derived expiration, cell phone and any declared co-signer, plus the optional search criteria captured at registration (apartment size, price range, preferred neighborhoods, pets, move-by date, reason for moving, whether they are sharing), and whether they want professional movers or a telecommunications / internet provider. Look a tenant up by email or id, or list a whole book of business by agent_id or agent_email (optionally narrowed to registrations only with has_agreement=1). Lease history is at /leases
Required
apiKey
string
required
API KEY
Optional
email
string
optional
Email address of the tenant, or a comma-delimited list of email addresses. Required unless id or agent_id is provided. Note that one email can match several contact records, which are returned separately.
id
string
optional
ID number of an individual tenant (contact), or a comma-delimited list of ID numbers. Required unless email or agent_id is provided.
agent_id
string
optional
Agent ID, or a comma-delimited list, matched against the agent currently assigned to the tenant. Required unless email, id or agent_email is provided. Returns every client of that agent, so pair it with has_agreement=1 to get only those who completed a registration. This is the current assignment on the contact record, not necessarily the agent present at signing; see the specification.
agent_email
string
optional
Agent email address, or a comma-delimited list, matched against the agent currently assigned to the tenant. Required unless email, id or agent_id is provided. Matching is case-insensitive. One address can belong to several agent records, in which case the clients of all of them are returned - usually what you want, since the duplicates are the same person. Supplying agent_id as well narrows to agents matching both.
has_agreement
string
optional
Confine results by registration status (1 = a signed representation agreement is on file, 0 = none). Leave empty for both. Requires a database holding clientData.
signed_since
string
optional
Confine results to agreements signed on or after this time, compared against REPRESENTATION.SIGNED_DATE. Format mm/dd/yyyyThh:nn. Requires a database holding clientData.
limit
numeric
optional
default 20
Provide number of tenants per page (max 100)
page
numeric
optional
default 1
Provide page number (1 or higher)
agreement_term_days
numeric
optional
default 120
Term length in days used to derive REPRESENTATION.EXPIRATION_DATE from the signing date. No expiration is stored in the database, so the returned date is always flagged EXPIRATION_IS_DERIVED and is an approximation.
curl -G "https://dataapi.realtymx.com/tenants" \ -d "apiKey=$API_KEY"
Leases
The lease object
Fields returned by /leases. Names come back uppercase.
Attributes
TOTAL_COUNT
Total lease count matching the lookup (not the number returned on this page)
DEAL_ID
Deal ID number of the lease
LEASE_SIGN_DATE
Date the lease was signed. Results are sorted on this field, newest first by default, so the most recent signed lease is the first entry.
LEASE_START_DATE
Date the lease term begins
LEASE_END_DATE
Date the lease term ends
ADDRESS
Address recorded on the deal (house + street + apartment). Stored on the deal at deal time, so it may differ from the listing's current address.
CITY / STATE / ZIP
Address parts recorded on the deal
MONTHLY_RENT
Rent recorded when the deal closed
BEDS
Bedrooms. Read from the listing's current record rather than a snapshot taken at signing, and null when the listing no longer resolves.
BATHS
Bathrooms. Same caveat as BEDS.
LISTING_ID
ID of the listing the lease was signed on
DEAL_STATUS
Executed leases only. Draft (-999), Cancelled (0) and Pending (-1) are excluded, so a tenant whose lease is signed but not yet approved returns no leases at all. • Approved • Paid
TENANT
The contact record this lease belongs to. One email can map to several contact records, so a single email lookup may return leases under different TENANT.ID values. Each lease is returned once even when several contacts share it, attributed to the most recent matching contact. • ID: Tenant (contact) ID • NAME: Tenant Name • EMAIL: Tenant Email • CELL_PHONE: Tenant cell number
AGENTS
Agents on the deal. Empty array when none are recorded. • ID: Agent ID • NAME: Agent Name • EMAIL: Agent Email
COSIGNERS
Co-signers (guarantors) recorded against this lease. Empty array when none. • ID: Co-signer ID • NAME: Co-signer Name • EMAIL: Co-signer Email • CELL_PHONE: Co-signer cell number
{
"TOTAL_COUNT": 1,
"leases": [
{
"DEAL_ID": 39091,
"LEASE_SIGN_DATE": "2026-04-17 00:00:00",
"LEASE_START_DATE": "2026-05-01 00:00:00",
"LEASE_END_DATE": "2027-04-30 00:00:00",
"ADDRESS": "158 West 84th Street #3A",
"CITY": "New York",
"STATE": "NY",
"ZIP": "10024",
"MONTHLY_RENT": 3795.0,
"BEDS": 1.0,
"BATHS": 1.0,
"LISTING_ID": 1791065,
"DEAL_STATUS": "Paid",
"TENANT": {
"ID": 108060,
"NAME": "Jane Doe",
"EMAIL": "[email protected]",
"CELL_PHONE": "6465551234"
},
"AGENTS": [
{
"ID": 3371,
"NAME": "Thomas Bohan",
"EMAIL": "[email protected]"
}
],
"COSIGNERS": [
{
"ID": 108061,
"NAME": "John Doe",
"EMAIL": "[email protected]",
"CELL_PHONE": "2032530649"
}
]
}
]
}
Leases
Retrieve lease history
Returns a tenant's signed lease history by email address: sign/start/end dates, address, beds/baths, monthly rent, agents and co-signers. Executed rentals only (Approved or Paid); Draft, Cancelled and Pending are excluded. Representation status is at /tenants
Required
apiKey
string
required
API KEY
Optional
email
string
optional
Email address of the tenant, or a comma-delimited list of email addresses. Required unless id is provided. Returns the tenant's full signed lease history, newest first.
id
string
optional
Contact ID of the tenant, or a comma-delimited list of ID numbers. Required unless email is provided.
limit
numeric
optional
default 20
Provide number of leases per page (max 100)
page
numeric
optional
default 1
Provide page number (1 or higher)
order
string
optional
default desc
Sort order on lease sign date (desc / asc). Default desc, so the most recent signed lease is first.
updated_since
string
optional
Confine results to leases signed on or after this time. Format mm/dd/yyyyThh:nn
curl -G "https://dataapi.realtymx.com/leases" \ -d "apiKey=$API_KEY"
Leads
The lead object
Fields returned by /leads. Names come back uppercase.
Attributes
TOTAL_COUNT
Total lead count matching the request, across every page — not the number of leads in this response.
ID
Lead ID number.
DATE_CREATE
When the lead was captured. Filter on this with created_since.
DATE_UPDATE
When the lead was last changed. Filter on this with updated_since to sync incrementally. Always populated, and never earlier than DATE_CREATE.
NAME / FIRST_NAME / LAST_NAME
Name given by the lead. NAME is the two joined, and is empty when neither was supplied.
EMAIL
Email address given by the lead. Not unique: the same address can appear on many unrelated leads, and is often an agent or placeholder address rather than the person's own.
LEAD_TYPE
What the lead is looking for, derived from LEAD_TYPE_CODE: • 1 → sale • 2 → rent Returned empty for any other stored code, rather than guessing. See LEAD_TYPE_CODE.
LEAD_TYPE_CODE
The raw stored type. Only 1 and 2 describe a lead. Listing status codes have leaked into this column over the years and also appear here: • 11 — In Contract • 19 — Sold • 21 — Ap Pending • 22 — Rented • -2 — For Rent (inactive) • -22 — Rented (inactive) These are not lead types and are not tombstones; deletion here is permanent, so a present row is a live row.
IS_ACTIVE / STATUS_CODE
Whether the saved search still emails the client: • 0 → Inactive • 1 → Active This is not the lead pipeline stage. Rows are created active and switched off later, so the large majority of historic leads are inactive. A false IS_ACTIVE does not mean a dead or invalid lead — use PROGRESS for pipeline stage.
SOURCE
Where the lead came from, as ID and NAME (for example RentHop, StreetEasy, Zillow). The IDs are defined per client database and are not portable between clients — match on NAME, or re-read the IDs per client. Empty when the capturing system did not record a source, which does not mean the lead has no origin.
LEAD_FROM / ALERT_NAME
Free-text origin labels written by the capturing system. Convenient but inconsistent between systems, and not a reliable way to group leads by source — prefer SOURCE.
COMMENT
The message the lead sent, usually with the listing reference prepended. Free text, and it may also carry duplicate-lead blocks appended by the capture pipeline — do not parse it for structured data.
PROGRESS
The pipeline stage, as ID and NAME (for example Unqualified Lead, Showing, Qualified Lead, In Contract). The stage list is defined per client. Empty means no stage has been set. This is the field to read for lead status, not IS_ACTIVE.
ASSIGNED_AGENTS
The agents the lead is assigned to, each with ID, NAME and EMAIL. Up to three, all co-equal — there is no primary. An empty array means the lead is unassigned; filter for those with agent_id=0.
CLIENT_ID
The contact record this lead is linked to, for use with /tenants and /leases. Empty when the lead was never linked to a contact, and also when the linked contact was later deleted — the two are indistinguishable.
LISTING_ID / LISTING_ID_SOURCE
The listing the lead enquired about, when the lead came from one. LISTING_ID resolves against /listings only when LISTING_ID_SOURCE is empty; when it names another database the id belongs to that database and will not match this client's listings. Empty LISTING_ID means the lead was not tied to a specific listing.
SEARCH
The criteria attached to the lead: AREAS, STREET, CITY, STATE, ZIP, MIN_PRICE, MAX_PRICE, BEDS, BATHS, PROPERTY_TYPE. For a lead captured from a listing these are copied from that listing rather than stated by the person, and the price range is widened around the listing price — so it describes the listing enquired about, not necessarily a stated budget.
SEARCH.AREAS
Neighbourhoods, each with ID and NAME, resolvable against /neighborhoods. An empty array means no area was recorded.
{
"TOTAL_COUNT": 2,
"leads": [
{
"ID": 1146379,
"DATE_CREATE": "2026-07-16 17:25:49",
"DATE_UPDATE": "2026-07-16 17:25:49",
"NAME": "Jane Doe",
"FIRST_NAME": "Jane",
"LAST_NAME": "Doe",
"EMAIL": "[email protected]",
"PHONE": "2125550101",
"CELL_PHONE": "6465550199",
"HOME_PHONE": "",
"WORK_PHONE": "",
"LEAD_TYPE": "rent",
"LEAD_TYPE_CODE": 2,
"IS_ACTIVE": true,
"STATUS_CODE": 1,
"LEAD_FROM": "Renthop",
"ALERT_NAME": "Lead From Renthop",
"COMMENT": "ID 1848656\nHi, I am interested in this apartment. Is it still avai…",
"SOURCE": {
"ID": 47,
"NAME": "RentHop"
},
"PROGRESS": {
"ID": 3,
"NAME": "Qualified Lead"
},
"ASSIGNED_AGENTS": [
{
"ID": 4802,
"NAME": "John Smith",
"EMAIL": "[email protected]"
}
],
"CLIENT_ID": "",
"LISTING_ID": 1848656,
"LISTING_ID_SOURCE": "",
"SEARCH": {
"AREAS": [
{
"ID": "273",
"NAME": "Middle Village"
}
],
"STREET": "",
"CITY": "",
"STATE": "",
"ZIP": "",
"MIN_PRICE": 2250,
"MAX_PRICE": 2750,
"BEDS": "1",
"BATHS": 1.0,
"PROPERTY_TYPE": "Apartment"
}
},
{
"ID": 1146341,
"DATE_CREATE": "2026-07-15 09:02:11",
"DATE_UPDATE": "2026-07-15 11:40:26",
"NAME": "John Roe",
"FIRST_NAME": "John",
"LAST_NAME": "Roe",
"EMAIL": "[email protected]",
"PHONE": "",
"CELL_PHONE": "9175550123",
"HOME_PHONE": "",
"WORK_PHONE": "",
"LEAD_TYPE": "",
"LEAD_TYPE_CODE": 22,
"IS_ACTIVE": false,
"STATUS_CODE": 0,
"LEAD_FROM": "Lead From StreetEasy",
"ALERT_NAME": "Lead From StreetEasy",
"COMMENT": "",
"SOURCE": {
"ID": 36,
"NAME": "StreetEasy"
},
"PROGRESS": {
"ID": "",
"NAME": ""
},
"ASSIGNED_AGENTS": [],
"CLIENT_ID": "",
"LISTING_ID": "",
"LISTING_ID_SOURCE": "",
"SEARCH": {
"AREAS": [
{
"ID": "180",
"NAME": "Hell's Kitchen"
},
{
"ID": "3",
"NAME": "Midtown West"
}
],
"STREET": "",
"CITY": "New York",
"STATE": "NY",
"ZIP": "",
"MIN_PRICE": 3000,
"MAX_PRICE": 4500,
"BEDS": "2",
"BATHS": 1.0,
"PROPERTY_TYPE": "Apartment"
}
}
]
}
Leads
List all leads
Returns inbound leads and saved searches from the Alerts table, newest first: contact details, lead source, assigned agents, pipeline progress and the search criteria attached to the lead. Intended for CRM sync — poll with updated_since to pull only what changed. Note that this table holds both leads captured from listing sites and searches saved by hand, and no column reliably separates the two; see SOURCE, LISTING_ID and ALERT_NAME to classify.
Required
apiKey
string
required
API KEY
Optional
id
string
optional
ID number of an individual lead, or a comma-delimited list of ID numbers.
email
string
optional
Email address of the lead, or a comma-delimited list of email addresses. Note that email is not unique: the same address can appear on many unrelated leads, and is often an agent or placeholder address.
limit
numeric
optional
default 20
Provide number of leads per page (max 100)
page
numeric
optional
default 1
Provide page number (1 or higher)
sort
string
optional
default date
Provide sorting factor (date / updated / id). date sorts on DATE_CREATE, updated on DATE_UPDATE.
order
string
optional
default desc
Provide sorting order (desc / asc). Default desc, so the newest lead is first.
updated_since
string
optional
Confine results to leads changed on or after this time, compared against DATE_UPDATE. Use this to sync incrementally. Format mm/dd/yyyyThh:nn
created_since
string
optional
Confine results to leads created on or after this time, compared against DATE_CREATE. Format mm/dd/yyyyThh:nn
source
string
optional
Source ID, or a comma-delimited list of source IDs, as returned in SOURCE.ID. These IDs are defined per client database and are not portable between clients.
agent_id
string
optional
Assigned agent ID, or a comma-delimited list. Matches a lead if the agent is any one of its assigned agents. Use 0 to return unassigned leads.
status
string
optional
Filter on the alert active flag (1 = active, 0 = inactive). This flag controls whether the saved search still emails the client; it is NOT the lead pipeline stage, which is PROGRESS. Most historic rows are 0, so leave this empty unless you specifically want active alerts.
lead_type
string
optional
Filter on lead type (sale / rent). Leads whose stored type is neither are returned only when this filter is empty; see LEAD_TYPE.
curl -G "https://dataapi.realtymx.com/leads" \ -d "apiKey=$API_KEY"
Deals
The deal object
Fields returned by /deals. Names come back uppercase.
Attributes
TOTAL_COUNT
Total listing count returned from API
ID
Deal ID number
LISTING_ADDRESS
Listing address associated with deal record.
DEAL_TYPE
Rental • Sales
DEAL_STATUS
Draft • Pending • Approved • Paid • Cancelled
DEAL_DATE
Date when deal is made
LEASE_SIGN_DATE
Date when lease singed
AGENTS
ID: Agent ID • NAME: Agent Name • Email: Agent Email
CLIENTS
ID: Client ID • NAME: Client Name • Email: Client Email
GURANTORS
ID: Gurantor ID • NAME: Gurantor Name • Email: Gurantor Email
{
"TOTAL_COUNT": 1,
"deals": [
{
"ID": 3254,
"LISTING_ADDRESS": "99 JOHN ST. #1F",
"DEAL_TYPE": "Rental",
"DEAL_STATUS": "Pending",
"DEAL_DATE": "2016-01-27 00:00:00",
"LEASE_SIGN_DATE": "2016-01-27 00:00:00",
"AGENTS": [
{
"ID": 413,
"EMAIL": "[email protected]",
"NAME": "Rob Rodriguez"
},
{
"ID": 423,
"EMAIL": "[email protected]",
"NAME": "Takumi Iwasaki"
}
],
"CLIENTS": [
{
"ID": 50,
"EMAIL": "[email protected]",
"NAME": "test test"
},
{
"ID": 897,
"EMAIL": "[email protected]",
"NAME": "test realtymx"
}
]
"GURANTORS": [
{
"ID": 953,
"EMAIL": "[email protected]",
"NAME": "test Guarantor"
}
],
}
]
}
Deals
List all deals
Returns list of deals
Required
apiKey
string
required
API KEY
Optional
limit
numeric
optional
default 100
Provide number of properties per page (10 / 20 / 40)
page
numeric
optional
default 1
Provide page number (1 or higher)
sort
string
optional
default date
Provide sorting factor (id / date)
order
string
optional
default desc
Provide sorting order (desc / asc)
id
string
optional
ID number of an individual deal ,or a comma-delimited list of ID numbers.
updated_since
string
optional
Confine results to deals which have benn updated since this time. Format mm/dd/yyyyThh:nn
curl -G "https://dataapi.realtymx.com/deals" \ -d "apiKey=$API_KEY"
/docs
Serves the API documentation page
curl -G "https://dataapi.realtymx.com/docs" \ -d "apiKey=$API_KEY"