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:

  • limit and page for paging, capped at 100 per page.
  • sort and order for ordering.
  • updated_since to fetch only what changed, which is how a sync should poll.
  • expand to 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.

curlA first request
curl -G "https://dataapi.realtymx.com/listings" \
  -d "apiKey=$API_KEY" \
  -d "limit=5"
Response200 OK
{
  "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.

Authorization: Basic <base64>

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

LimitThresholdApplies to
Requests per second3All keys
Simultaneous requests5All keys
Requests per hour100Limited-access keys only
curlReading
curl -G "https://dataapi.realtymx.com/tenants" \
  -d "apiKey=$API_KEY" \
  -d "[email protected]"
curlWriting
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.

CodeMeaning
200Success.
201Created — a new listing was written. The response carries its listing_id.
400A parameter failed validation. The message says which.
401No API key, or no Authorization header on a write.
403Key inactive, not authorized, or the secret does not match. Contact RealtyMX.
404No record with that ID in your database.
405Your IP is not on the key's allow-list. The API returns 405 here rather than 403.
409A listing for that unit already exists. The body lists the conflicts.
429Rate limit exceeded.
500Server 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.

Response400
{
  "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

ResponseThe listing object
{  
   "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

GET/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/listings
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.

ResponseThe create response object
{
      "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

POST/listings

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}.

jsonRequest body
{ "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/listings
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"}'
Response409 Conflict
{
      "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.

ResponseThe update response object
{
      "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

PATCHPUT/listings/{listing_id}

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.

RuleResult
Sales listing priced under 10,000400
Rental priced at 100,000 or more200 with a warning
Net effective rent on, without free months and a minimum lease400
Minimum lease term above the maximum400
Landlord pays the fee, but no OP amount and no CYOF400
Rental terms on a sales listing400
Closing values on a listing that is not Sold or Rented400
Total rooms below the bedroom count, or a bath count below 1200 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.

ValueStatusOff marketOn market?
1For Sale-1Yes
2For Rent-2Yes
11In Contract-11Yes
12Offer In-12Yes
21App. Pending-21Yes
19Sold-19No
22Rented-22No
0Suspend—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.

ChangeRecorded as
PriceA price-change entry with the old and new price and the percentage
StatusA status-change entry with the old and new status
Availability, space, rental terms, access notesA change-log entry each, except the two lease term fields
Coming back on marketA Listed or Relisted entry
Auto-filled closing valuesA 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.

TransitionEffect
On market → offElapsed days recorded; response includes days_on_market
Off market → onThe clock restarts and a Relisted entry is written
Within the same sideNothing. 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/listings/{listing_id}
curl -X PATCH \
  "https://dataapi.realtymx.com/listings/482913" \
  -u "$API_KEY:$API_SECRET" \
  -H "Content-Type: application/json" \
  -d '{"price": 4200}'
Response200 OK
{
      "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"
   }
ResponseAlso possible
{
      "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"
   }
ResponseAlso possible
{
      "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"
   }
ResponseAlso possible
{
      "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"
   }
ResponseAlso possible
{
      "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"

ResponseThe listing history object
{
        "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

GET/listingsHistory

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/listingsHistory
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.

ResponseThe photo object
{
      "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

GET/listings/{listing_id}/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/listings/{listing_id}/photos
curl -G "https://dataapi.realtymx.com/listings/482913/photos" \
  -d "apiKey=$API_KEY"
Response200 OK
{
      "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.

ResponseThe upload response object
{
      "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

POST/listings/{listing_id}/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 listing201, photo created
holds a photo with the same file (same SHA-256)200, idempotent_replay: true, nothing written
holds a photo with a different file409 naming the photo_id — replace it with PUT
held a photo that has since been deleted201, 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.

LimitValue
FormatsJPEG, PNG. WebP, HEIC, GIF and PDF are refused (415)
File size15 MB per file, 60 MB per batch (413)
Image sizeAt least 400 px on the shorter side, at most 60 megapixels (422)
Damaged filesTruncated or undecodable files are refused (415)
Photos per listingThe 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/listings/{listing_id}/photos
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"
ResponseBatch - 207 Multi-Status
{
      "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.

ResponseThe photo update response object
{
      "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

PUT/listings/{listing_id}/photos/{photo_id}

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/listings/{listing_id}/photos/{photo_id}
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

DELETE/listings/{listing_id}/photos/{photo_id}

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/listings/{listing_id}/photos/{photo_id}
curl -X DELETE "https://dataapi.realtymx.com/listings/482913/photos/13554" \
  -u "$API_KEY:$API_SECRET"
Response200 OK
{
      "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

ResponseThe building object
{
    "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

GET/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/buildings
curl -G "https://dataapi.realtymx.com/buildings" \
  -d "apiKey=$API_KEY"
ResponseAddress lookup
{
  "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.

ResponseThe neighborhood object
[
      {
         "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

GET/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/neighborhoods
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.

ResponseThe contact object
{
      "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

GET/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/contacts
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.

ResponseThe tenant object
{
   "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

GET/tenants

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/tenants
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

ResponseThe lease object
{
   "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

GET/leases

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/leases
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.

ResponseThe lead object
{
   "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

GET/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/leads
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

ResponseThe deal object
{
   "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

GET/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/deals
curl -G "https://dataapi.realtymx.com/deals" \
  -d "apiKey=$API_KEY"

/docs

GET/docs

Serves the API documentation page

curl/docs
curl -G "https://dataapi.realtymx.com/docs" \
  -d "apiKey=$API_KEY"