MLS Grid RESO Web API

Normalized, RESO Data Dictionary–compliant OData v4 Web API for incremental replication of MLS listing data — Property, Member, Office, OpenHouse, Media, and Lookup resources — across the participating MLS Grid boards. Authenticated with long-lived OAuth 2.0 bearer tokens. Optimized for bulk replication via $filter on OriginatingSystemName and ModificationTimestamp with $expand of Media, Rooms, and UnitTypes.

MLS Grid RESO Web API is published by mlsgrid on the APIs.io network, described by a machine-readable OpenAPI specification.

This API exposes 6 machine-runnable capabilities that can be deployed as REST, MCP, or Agent Skill surfaces via Naftiko and 2 JSON Schema definitions.

Tagged areas include Real Estate, MLS, RESO, OData, and Property. The published artifact set on APIs.io includes API documentation, an OpenAPI specification, a JSON-LD context, 6 Naftiko capability specs, and 2 JSON Schemas.

Documentation

Specifications

Schemas & Data

Other Resources

OpenAPI Specification

mlsgrid-reso-web-api-openapi.yml Raw ↑
openapi: 3.0.3
info:
  title: MLS Grid RESO Web API
  description: |
    The MLS Grid RESO Web API is a normalized, RESO Data Dictionary–compliant OData v4 Web API for replicating
    Multiple Listing Service (MLS) data across the dozens of participating boards on the MLS Grid network. The
    API is optimized for incremental replication using `ModificationTimestamp`, supports `$select`, `$filter`,
    and `$expand` for related resources (Media, Rooms, UnitTypes), and applies a single license agreement across
    all participating MLSs.

    Authentication uses long-lived OAuth 2.0 bearer tokens issued through the MLS Grid web application.
  version: 2.0.0
  contact:
    name: MLS Grid Support
    email: [email protected]
    url: https://www.mlsgrid.com
  license:
    name: MLS Grid Master Data License Agreement
    url: https://www.mlsgrid.com
  x-logo:
    url: https://www.mlsgrid.com
servers:
- url: https://api.mlsgrid.com/v2
  description: MLS Grid Web API v2 (production)
tags:
- name: Property
  description: Property listings (RESO Data Dictionary Property resource).
- name: Member
  description: Real estate agents (RESO Data Dictionary Member resource).
- name: Office
  description: Brokerage offices (RESO Data Dictionary Office resource).
- name: OpenHouse
  description: Open house events (RESO Data Dictionary OpenHouse resource).
- name: Media
  description: Listing media (photos, virtual tours) expanded from Property.
- name: Lookup
  description: Enumerated lookup values per originating MLS.
- name: Metadata
  description: OData service and EDMX metadata.
paths:
  /$metadata:
    get:
      tags:
      - Metadata
      summary: Get Service Metadata
      description: Returns the OData v4 EDMX metadata document describing all entity types, properties, navigation properties, and enumerations exposed by the MLS Grid Web API.
      operationId: getMetadata
      responses:
        '200':
          description: EDMX metadata document.
          content:
            application/xml:
              schema:
                type: string
        '401':
          $ref: '#/components/responses/Unauthorized'
  /Property:
    get:
      tags:
      - Property
      summary: List Properties
      description: Replicate Property listings filtered by `OriginatingSystemName` and `ModificationTimestamp`. Use `$expand=Media,Rooms,UnitTypes` to include nested resources and `@odata.nextLink` for pagination.
      operationId: listProperties
      parameters:
      - $ref: '#/components/parameters/Filter'
      - $ref: '#/components/parameters/Select'
      - $ref: '#/components/parameters/Expand'
      - $ref: '#/components/parameters/Top'
      - $ref: '#/components/parameters/Count'
      responses:
        '200':
          description: Collection of Property records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PropertyCollection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /Property('{ListingKey}'):
    get:
      tags:
      - Property
      summary: Get Property by Key
      description: Retrieve a single Property record by its prefixed `ListingKey` (e.g. `actris-1234567`).
      operationId: getProperty
      parameters:
      - name: ListingKey
        in: path
        required: true
        schema:
          type: string
        description: Prefixed MLS Grid listing key.
      - $ref: '#/components/parameters/Expand'
      responses:
        '200':
          description: A single Property record.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Property'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '404':
          description: Property not found.
  /Member:
    get:
      tags:
      - Member
      summary: List Members
      description: Replicate Member (agent) records filtered by `OriginatingSystemName` and `ModificationTimestamp`.
      operationId: listMembers
      parameters:
      - $ref: '#/components/parameters/Filter'
      - $ref: '#/components/parameters/Select'
      - $ref: '#/components/parameters/Top'
      - $ref: '#/components/parameters/Count'
      responses:
        '200':
          description: Collection of Member records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MemberCollection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /Office:
    get:
      tags:
      - Office
      summary: List Offices
      description: Replicate Office (brokerage) records filtered by `OriginatingSystemName` and `ModificationTimestamp`.
      operationId: listOffices
      parameters:
      - $ref: '#/components/parameters/Filter'
      - $ref: '#/components/parameters/Select'
      - $ref: '#/components/parameters/Top'
      - $ref: '#/components/parameters/Count'
      responses:
        '200':
          description: Collection of Office records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OfficeCollection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /OpenHouse:
    get:
      tags:
      - OpenHouse
      summary: List Open Houses
      description: Replicate OpenHouse events filtered by `OriginatingSystemName` and `ModificationTimestamp`.
      operationId: listOpenHouses
      parameters:
      - $ref: '#/components/parameters/Filter'
      - $ref: '#/components/parameters/Select'
      - $ref: '#/components/parameters/Top'
      responses:
        '200':
          description: Collection of OpenHouse records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OpenHouseCollection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /Media:
    get:
      tags:
      - Media
      summary: List Media
      description: Replicate Media records as a standalone resource where supported by the originating MLS. Use `MediaModificationTimestamp` for incremental replication.
      operationId: listMedia
      parameters:
      - $ref: '#/components/parameters/Filter'
      - $ref: '#/components/parameters/Select'
      - $ref: '#/components/parameters/Top'
      responses:
        '200':
          description: Collection of Media records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/MediaCollection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
  /Lookup:
    get:
      tags:
      - Lookup
      summary: List Lookup Values
      description: Retrieve enumerated lookup values per originating MLS. Filter by `OriginatingSystemName` and `LookupName`.
      operationId: listLookups
      parameters:
      - $ref: '#/components/parameters/Filter'
      - $ref: '#/components/parameters/Select'
      - $ref: '#/components/parameters/Top'
      responses:
        '200':
          description: Collection of Lookup records.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LookupCollection'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: OAuth2
      description: Long-lived OAuth 2.0 bearer token issued via the MLS Grid web application token tab.
  parameters:
    Filter:
      name: $filter
      in: query
      description: |
        OData `$filter` expression. Required pattern uses `OriginatingSystemName eq '<system>'` combined with
        `ModificationTimestamp gt <UTC datetime>` for incremental replication. Replication queries are
        restricted to a limited set of searchable fields documented per resource.
      schema:
        type: string
      example: OriginatingSystemName eq 'actris' and ModificationTimestamp gt 2026-01-01T00:00:00Z
    Select:
      name: $select
      in: query
      description: Comma-separated list of fields to return. Reduces payload size.
      schema:
        type: string
      example: ListingKey,StandardStatus,ListPrice,ModificationTimestamp
    Expand:
      name: $expand
      in: query
      description: Comma-separated list of related resources to expand inline. Common values for Property are `Media`, `Rooms`, and `UnitTypes`.
      schema:
        type: string
      example: Media,Rooms,UnitTypes
    Top:
      name: $top
      in: query
      description: Maximum number of records to return per page.
      schema:
        type: integer
        maximum: 1000
    Count:
      name: $count
      in: query
      description: When `true`, includes `@odata.count` in the response.
      schema:
        type: boolean
  responses:
    Unauthorized:
      description: Missing or invalid bearer token.
    RateLimited:
      description: Rate limit exceeded. The MLS Grid Web API enforces 2 RPS, 7,200 requests/hour, 40,000 requests/24h, and 4 GB/hour download caps. Repeated violations may suspend the token.
      headers:
        Retry-After:
          schema:
            type: integer
          description: Seconds until the client may retry.
  schemas:
    Property:
      type: object
      description: RESO Data Dictionary Property resource. Only fields present in the originating MLS are populated.
      properties:
        ListingKey:
          type: string
          description: Prefixed MLS Grid listing key (e.g. `actris-1234567`).
        OriginatingSystemName:
          type: string
          description: Source MLS identifier (e.g. `actris`, `mred`, `nwmls`).
        StandardStatus:
          type: string
          description: RESO StandardStatus enumeration.
          enum:
          - Active
          - ActiveUnderContract
          - Pending
          - Hold
          - Withdrawn
          - Expired
          - Closed
          - Canceled
          - ComingSoon
          - Delete
          - Incomplete
        PropertyType:
          type: string
          description: RESO PropertyType enumeration.
          enum:
          - Residential
          - ResidentialIncome
          - ResidentialLease
          - CommercialSale
          - CommercialLease
          - BusinessOpportunity
          - Farm
          - Land
          - ManufacturedInPark
        ListPrice:
          type: number
        ModificationTimestamp:
          type: string
          format: date-time
        PhotosChangeTimestamp:
          type: string
          format: date-time
        MlgCanView:
          type: boolean
          description: Indicates whether the listing may currently be viewed under license terms.
        MlgCanUse:
          type: array
          description: Allowed use cases for the listing (e.g. `IDX`, `VOW`, `BO`, `PT`).
          items:
            type: string
        Media:
          type: array
          items:
            $ref: '#/components/schemas/Media'
        Rooms:
          type: array
          items:
            $ref: '#/components/schemas/Room'
        UnitTypes:
          type: array
          items:
            $ref: '#/components/schemas/UnitType'
    PropertyCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.nextLink':
          type: string
        value:
          type: array
          items:
            $ref: '#/components/schemas/Property'
    Member:
      type: object
      properties:
        MemberKey:
          type: string
        OriginatingSystemName:
          type: string
        MemberFirstName:
          type: string
        MemberLastName:
          type: string
        MemberEmail:
          type: string
        MemberMlsId:
          type: string
        ModificationTimestamp:
          type: string
          format: date-time
        MlgCanView:
          type: boolean
    MemberCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.nextLink':
          type: string
        value:
          type: array
          items:
            $ref: '#/components/schemas/Member'
    Office:
      type: object
      properties:
        OfficeKey:
          type: string
        OriginatingSystemName:
          type: string
        OfficeName:
          type: string
        OfficeMlsId:
          type: string
        ModificationTimestamp:
          type: string
          format: date-time
        MlgCanView:
          type: boolean
    OfficeCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.nextLink':
          type: string
        value:
          type: array
          items:
            $ref: '#/components/schemas/Office'
    OpenHouse:
      type: object
      properties:
        OpenHouseKey:
          type: string
        ListingKey:
          type: string
        OriginatingSystemName:
          type: string
        OpenHouseStartTime:
          type: string
          format: date-time
        OpenHouseEndTime:
          type: string
          format: date-time
        ModificationTimestamp:
          type: string
          format: date-time
    OpenHouseCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.nextLink':
          type: string
        value:
          type: array
          items:
            $ref: '#/components/schemas/OpenHouse'
    Media:
      type: object
      properties:
        MediaKey:
          type: string
        ResourceRecordKey:
          type: string
          description: Foreign key back to Property (or other resource).
        OriginatingSystemName:
          type: string
        MediaURL:
          type: string
          description: URL for downloading a local copy. Direct hot-linking is not permitted.
        MediaCategory:
          type: string
        Order:
          type: integer
        MediaModificationTimestamp:
          type: string
          format: date-time
    MediaCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.nextLink':
          type: string
        value:
          type: array
          items:
            $ref: '#/components/schemas/Media'
    Room:
      type: object
      properties:
        RoomKey:
          type: string
        RoomType:
          type: string
        RoomLevel:
          type: string
        RoomLength:
          type: number
        RoomWidth:
          type: number
    UnitType:
      type: object
      properties:
        UnitTypeKey:
          type: string
        UnitTypeType:
          type: string
        UnitTypeBedsTotal:
          type: integer
        UnitTypeBathsTotal:
          type: number
    Lookup:
      type: object
      properties:
        LookupKey:
          type: string
        OriginatingSystemName:
          type: string
        LookupName:
          type: string
        LookupValue:
          type: string
        StandardLookupValue:
          type: string
        ModificationTimestamp:
          type: string
          format: date-time
    LookupCollection:
      type: object
      properties:
        '@odata.context':
          type: string
        '@odata.nextLink':
          type: string
        value:
          type: array
          items:
            $ref: '#/components/schemas/Lookup'
security:
- bearerAuth: []