openapi: 3.0.0 info: title: SkySlope Offers API Reference x-logo: url: https://s3.amazonaws.com/cdn.skyslope.com/offer-management/om-logo-w-padding.png altText: Offers Logo href: https://skyslope.com/offer-management-login/ description: '# Introduction The SkySlope Offers API is organized around [REST](https://en.wikipedia.org/wiki/Representational_state_transfer). Our API has predictable resource-oriented URLs, accepts JSON-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs. # Authentication The SkySlope Offers API uses [OAuth 2.0 client credentials flow](https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/) to obtain an access token that can be used to authenticate subsequent API requests. To obtain an access token, see **[this endpoint](https://offers.skyslope.com/offers-api/reference#tag/Auth/paths/~1mls~1token/post)**. Authentication to the API is performed by including your access token in the **Authorization** header of your API requests with the Bearer authentication scheme. All API requests must be made over [HTTPS](https://en.wikipedia.org/wiki/HTTPS). Calls made over plain HTTP will fail. API requests without authentication will also fail. ' termsOfService: https://skyslope.com/terms-conditions/ contact: name: Support url: https://support.skyslope.com/hc/en-us email: support@skyslope.com servers: - url: https://offers.skyslope.com/offers-api description: Production server - url: https://staging-offers.skyslope.com/offers-api description: Staging server components: schemas: RESOOffer: type: object properties: OfferId: type: string OfferOriginatingSystemId: type: string OfferSourceSystemId: type: string ModificationTimestamp: type: IsoDate OfferSubmissionDate: type: IsoDate OfferProperty: type: object properties: OfferAgentId: type: string ListingId: type: string ListingKey: type: string Market: type: string PropertyType: type: string ListingStatus: type: string StreetNumber: type: string StreetName: type: string UnitNumber: type: string City: type: string StateOrProvince: type: string PostalCode: type: string CountyOrParish: type: string ParcelNumber: type: string OfferTerms: type: object properties: OfferPrice: type: number OfferStatus: type: string CreditAtClosing: type: any EarnestMoney: type: number OfferClosingDate: type: IsoDate OfferClosingDays: type: number Deposit: type: number OfferExpirationDate: type: IsoDate AdditionalTerms: type: string Contingencies: type: array items: type: object properties: name: type: string _: type: any EscalationClause: type: any HomeWarranty: type: string IncreasedDeposit: type: number BuyerFinancing: type: string OfferVersionNumber: type: number paths: /ext/agent/:agentId/listings?startDate=2023-01-01: get: summary: Retrieve an up-to-date agent listings & offers count description: 'Retrieve the ten listings owned by this agent, that have most recently received offers. Sorted descending by offer submission date (most recent first). ' tags: - Agents, Listings parameters: - in: path name: agentId schema: type: string required: true description: 'The agent id used to filter the listings. Contact SkySlope for your MLS field mapping. ' - in: query name: startDate schema: type: Date required: false description: 'yyyy-mm-dd

Optional parameter in ISO format yyyy-mm-ddT00:00:00.000Z to help separating listings with new offers from the rest.

If startDate is not provided, it''s assumed to be 7 days prior to today.

If there exists listings with offers newer than startDate, the hasNewOffers indicator will be true otherwise false.

' - in: header name: Authorization schema: type: string required: true description: 'Bearer ACCESS_TOKEN

"ACCESS_TOKEN" is the token returned from /ext/token

' x-codeSamples: - lang: cURL source: 'curl -X GET "https://offers.skyslope.com/offers-api/ext/agent/:agentId/listings?startDate=2023-01-01" -H "Authorization: Bearer ACCESS_TOKEN" ' - lang: Javascript source: "fetch(\"https://offers.skyslope.com/offers-api/ext/agent/:agentId/listings?startDate=2023-01-01\"\ , {\n headers: {\n \"Authorization\": \"ACCESS_TOKEN\"\n }\n})\n.then(response => {\n \ \ console.info(response);\n})\n.catch(error => {\n console.error(error);\n});\n" - lang: Python source: 'import requests url = "https://offers.skyslope.com/offers-api/ext/report" params = {"startDate": "2023-01-01", "endDate": "2023-04-26"} headers = {"Authorization": "ACCESS_TOKEN"} response = requests.get(url, params=params, headers=headers) print(response.content.decode()) ' - lang: C# source: "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n\ {\n static async Task Main(string[] args)\n {\n using (var client = new HttpClient())\n\ \ {\n client.DefaultRequestHeaders.Add(\"Authorization\": \"ACCESS_TOKEN\"\ );\n var response = await client.GetAsync(\"https://offers.skyslope.com/offers-api/ext/agent/:agentId/listings?startDate=2023-01-01\"\ );\n Console.WriteLine(await response.Content.ReadAsStringAsync());\n }\n\ \ }\n}\n" - lang: PHP source: '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://offers.skyslope.com/offers-api/ext/agent/:agentId/listings?startDate=2023-01-01"); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization": "ACCESS_TOKEN")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); curl_close($ch); echo $response; ' - lang: Ruby source: 'require ''uri'' require ''net/http'' url = URI("https://offers.skyslope.com/offers-api/ext/agent/:agentId/listings?startDate=2023-01-01") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = "ACCESS_TOKEN" response = http.request(request) puts response.read_body ' responses: '200': description: OK content: application/json: schema: type: object properties: hasNewOffers: type: boolean listings: type: array items: type: object properties: fileId: type: number listingName: type: string offersCount: type: number latestOfferDate: type: ISO Date hasNewOffers: type: boolean viewOffersLink: type: string example: hasNewOffers: true listings: - fileId: 12345 listingName: property X offersCount: 3 hasNewOffers: true latestOfferDate: '2023-06-27T14:58:25.439Z' viewOffersLink: https://offers.skyslope.com/file/12345 - fileId: 67890 listingName: property Y offersCount: 4 hasNewOffers: false latestOfferDate: '2022-06-27T14:58:25.439Z' viewOffersLink: https://offers.skyslope.com/file/67890 '204': description: No Content '400': description: Bad Request - Missing or invalid request parameters '401': description: Unauthorized - Missing or invalid API key '500': description: Internal Server Error /ext/offer/:offerId: get: summary: Retrieve the offer details description: Retrieves the offer details given the offer identifier tags: - Offers parameters: - in: path name: offerId schema: type: String required: true description: 'Offer Identifier ' - in: header name: Authorization schema: type: string required: true description: 'Bearer ACCESS_TOKEN "ACCESS_TOKEN" is the token returned from /ext/token ' x-codeSamples: - lang: cURL source: 'curl -X GET "https://offers.skyslope.com/offers-api/ext/offer/64510abe7d7e1f1dfac47393" -H "Authorization: Bearer ACCESS_TOKEN" ' - lang: Javascript source: "fetch(\"https://offers.skyslope.com/offers-api/ext/offer/64510abe7d7e1f1dfac47393\",\ \ {\n headers: {\n \"Authorization\": \"ACCESS_TOKEN\"\n }\n})\n.then(response => {\n \ \ console.info(response);\n})\n.catch(error => {\n console.error(error);\n});\n" - lang: Python source: 'import requests url = "https://offers.skyslope.com/offers-api/ext/offer" params = {"offerId": "64510abe7d7e1f1dfac47393"} headers = {"Authorization": "ACCESS_TOKEN"} response = requests.get(url, params=params, headers=headers) print(response.content.decode()) ' - lang: C# source: "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n\ {\n static async Task Main(string[] args)\n {\n using (var client = new HttpClient())\n\ \ {\n client.DefaultRequestHeaders.Add(\"Authorization\": \"ACCESS_TOKEN\"\ );\n var response = await client.GetAsync(\"https://offers.skyslope.com/offers-api/ext/offer/64510abe7d7e1f1dfac47393\"\ );\n Console.WriteLine(await response.Content.ReadAsStringAsync());\n }\n\ \ }\n}\n" - lang: PHP source: '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://offers.skyslope.com/offers-api/ext/offer/64510abe7d7e1f1dfac47393"); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization": "ACCESS_TOKEN")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); curl_close($ch); echo $response; ' - lang: Ruby source: 'require ''uri'' require ''net/http'' url = URI("https://offers.skyslope.com/offers-api/ext/offer/64510abe7d7e1f1dfac47393") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = "ACCESS_TOKEN" response = http.request(request) puts response.read_body ' responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/RESOOffer' example: OfferId: 64510abe7d7e1f1dfac47393 OfferOriginatingSystemId: SkySlope OfferSourceSystemId: SkySlope ModificationTimestamp: '2023-05-02T13:18:21.439Z' OfferSubmissionDate: '2023-05-01T13:18:21.439Z' OfferProperty: OfferAgentId: Agent123 ListingId: Listing456 ListingKey: Key789 Market: Residential PropertyType: Single Family ListingStatus: Active StreetNumber: '1266' StreetName: Ocala UnitNumber: Apt 4 City: TALLAHASSEE StateOrProvince: FL PostalCode: '32304' CountyOrParish: Leon ParcelNumber: Parcel123 OfferTerms: OfferPrice: 250000 OfferStatus: Submitted CreditAtClosing: To be determined EarnestMoney: 1000 OfferClosingDate: '2023-06-01T04:00:00.000Z' OfferClosingDays: 30 Deposit: 3000 OfferExpirationDate: '2023-05-15T04:00:00.000Z' AdditionalTerms: Small pets allowed Contingencies: [] EscalationClause: None HomeWarranty: Seller IncreasedDeposit: 500 BuyerFinancing: Conventional OfferVersionNumber: 1 '204': description: No Content '400': description: Bad Request - Missing or invalid request parameters '401': description: Unauthorized - Missing or invalid access token '500': description: Internal Server Error /ext/offers: get: summary: Retrieve all offers for a given date range. description: Retrieve all offers for a given date range. tags: - Offers parameters: - in: query name: startDate schema: type: Date required: true description: "2023-01-01\n\n The start of the date range in UTC format\n" - in: query name: endDate schema: type: Date required: false description: '2023-01-31 The end of the date range in UTC format. Max date range is 31 days. When larger range is requested, result for 31 days is returned. ' - in: query name: page schema: type: Number required: false description: Page number - in: query name: pageSize schema: type: Number required: false description: Page size - in: header name: Authorization schema: type: string required: true description: 'Bearer ACCESS_TOKEN "ACCESS_TOKEN" is the token returned from /ext/token ' x-codeSamples: - lang: cURL source: 'curl -X GET "https://offers.skyslope.com/offers-api/ext/offers/?startDate=2023-01-01&endDate=2023-01-31" -H "Authorization: Bearer ACCESS_TOKEN" ' - lang: Javascript source: "fetch(\"https://offers.skyslope.com/offers-api/ext/offers/?startDate=2023-01-01&endDate=2023-01-31\"\ , {\n headers: {\n \"Authorization\": \"ACCESS_TOKEN\"\n }\n})\n.then(response => {\n \ \ console.info(response);\n})\n.catch(error => {\n console.error(error);\n});\n" - lang: Python source: 'import requests url = "https://offers.skyslope.com/offers-api/ext/offers" params = {"startDate": "2023-01-01", "endDate": "2023-01-31"} headers = {"Authorization": "ACCESS_TOKEN"} response = requests.get(url, params=params, headers=headers) print(response.content.decode()) ' - lang: C# source: "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n\ {\n static async Task Main(string[] args)\n {\n using (var client = new HttpClient())\n\ \ {\n client.DefaultRequestHeaders.Add(\"Authorization\": \"ACCESS_TOKEN\"\ );\n var response = await client.GetAsync(\"https://offers.skyslope.com/offers-api/ext/offers/?startDate=2023-01-01&endDate=2023-01-31\"\ );\n Console.WriteLine(await response.Content.ReadAsStringAsync());\n }\n\ \ }\n}\n" - lang: PHP source: '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://offers.skyslope.com/offers-api/ext/offers/?startDate=2023-01-01&endDate=2023-01-31"); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization": "ACCESS_TOKEN")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); curl_close($ch); echo $response; ' - lang: Ruby source: 'require ''uri'' require ''net/http'' url = URI("https://offers.skyslope.com/offers-api/ext/offers/?startDate=2023-01-01&endDate=2023-01-31") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = "ACCESS_TOKEN" response = http.request(request) puts response.read_body ' responses: '200': description: OK content: application/json: schema: type: array items: $ref: '#/components/schemas/RESOOffer' example: - OfferId: 64510abe7d7e1f1dfac47393 OfferOriginatingSystemId: SkySlope OfferSourceSystemId: SkySlope ModificationTimestamp: '2023-05-02T13:18:21.439Z' OfferSubmissionDate: '2023-05-01T13:18:21.439Z' OfferProperty: OfferAgentId: Agent123 ListingId: Listing456 ListingKey: Key789 Market: Residential PropertyType: Single Family ListingStatus: Active StreetNumber: '1266' StreetName: Ocala UnitNumber: Apt 4 City: TALLAHASSEE StateOrProvince: FL PostalCode: '32304' CountyOrParish: Leon ParcelNumber: Parcel123 OfferTerms: OfferPrice: 250000 OfferStatus: Submitted CreditAtClosing: To be determined EarnestMoney: 1000 OfferClosingDate: '2023-06-01T04:00:00.000Z' OfferClosingDays: 30 Deposit: 3000 OfferExpirationDate: '2023-05-15T04:00:00.000Z' AdditionalTerms: Small pets allowed Contingencies: [] EscalationClause: None HomeWarranty: Seller IncreasedDeposit: 500 BuyerFinancing: Conventional OfferVersionNumber: 1 '204': description: No Content '400': description: Bad Request - Missing or invalid request parameters '401': description: Unauthorized - Missing or invalid access token '500': description: Internal Server Error /ext/report: get: summary: Retrieve count of listings & offers description: Retrieves a count of listings & offers for the provided date range. tags: - Report parameters: - in: query name: startDate schema: type: Date required: true description: "2023-01-01\n\n The start of the date range in UTC format\n" - in: query name: endDate schema: type: Date required: true description: '2023-05-01 The end of the date range in UTC format ' - in: header name: Authorization schema: type: string required: true description: 'Bearer ACCESS_TOKEN "ACCESS_TOKEN" is the token returned from /ext/token ' x-codeSamples: - lang: cURL source: 'curl -X GET "https://offers.skyslope.com/offers-api/ext/report?startDate=2023-01-01&endDate=2023-04-26" -H "Authorization: Bearer ACCESS_TOKEN" ' - lang: Javascript source: "fetch(\"https://offers.skyslope.com/offers-api/ext/report?startDate=2023-01-01&endDate=2023-04-26\"\ , {\n headers: {\n \"Authorization\": \"ACCESS_TOKEN\"\n }\n})\n.then(response => {\n \ \ console.info(response);\n})\n.catch(error => {\n console.error(error);\n});\n" - lang: Python source: 'import requests url = "https://offers.skyslope.com/offers-api/ext/report" params = {"startDate": "2023-01-01", "endDate": "2023-04-26"} headers = {"Authorization": "ACCESS_TOKEN"} response = requests.get(url, params=params, headers=headers) print(response.content.decode()) ' - lang: C# source: "using System;\nusing System.Net.Http;\nusing System.Threading.Tasks;\n\nclass Program\n\ {\n static async Task Main(string[] args)\n {\n using (var client = new HttpClient())\n\ \ {\n client.DefaultRequestHeaders.Add(\"Authorization\": \"ACCESS_TOKEN\"\ );\n var response = await client.GetAsync(\"https://offers.skyslope.com/offers-api/ext/report?startDate=2023-01-01&endDate=2023-04-26\"\ );\n Console.WriteLine(await response.Content.ReadAsStringAsync());\n }\n\ \ }\n}\n" - lang: PHP source: '$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://offers.skyslope.com/offers-api/ext/report?startDate=2023-01-01&endDate=2023-04-26"); curl_setopt($ch, CURLOPT_HTTPHEADER, array("Authorization": "ACCESS_TOKEN")); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); curl_close($ch); echo $response; ' - lang: Ruby source: 'require ''uri'' require ''net/http'' url = URI("https://offers.skyslope.com/offers-api/ext/report?startDate=2023-01-01&endDate=2023-04-26") http = Net::HTTP.new(url.host, url.port) http.use_ssl = true request = Net::HTTP::Get.new(url) request["Authorization"] = "ACCESS_TOKEN" response = http.request(request) puts response.read_body ' responses: '200': description: OK content: application/json: schema: type: object properties: mlsMarket: type: string offerCount: type: number listingCount: type: number example: mlsMarket: your-market offerCount: 100 listingCount: 10 '204': description: No Content '400': description: Bad Request - Missing or invalid request body '401': description: Unauthorized - Missing or invalid API key '500': description: Internal Server Error /ext/token: post: summary: Retrieve an access token description: Retrieve an access token to authenticate requests with. tags: - Auth parameters: - in: header name: Authorization schema: type: string required: true description: 'Basic BASE64_CREDENTIALS "BASE64_CREDENTIALS" is the Base64-encoded value of your Client ID and Client Secret, separated by a colon ' x-codeSamples: - lang: cURL source: 'curl --location --request POST ''https://offers.skyslope.com/offers-api/ext/token'' \ --header ''Authorization: Basic BASE64_CREDENTIALS'' ' - lang: Javascript source: "var myHeaders = new Headers(); myHeaders.append(\"Authorization\", \"Basic BASE64_CREDENTIALS);\n\ var requestOptions = {\n method: 'POST',\n headers: myHeaders,\n redirect: 'follow'\n};\n\ fetch(\"https://offers.skyslope.com/offers-api/ext/token\", requestOptions)\n .then(response\ \ => response.text())\n .then(result => console.info(result))\n .catch(error => console.info('error',\ \ error));\n" - lang: Python source: "import requests\n\nurl = \"https://offers.skyslope.com/offers-api/ext/token\"\n\npayload\ \ = {}\nheaders = {\n 'Authorization': 'Basic BASE64_CREDENTIALS'\n}\n\nresponse = requests.request(\"\ POST\", url, headers=headers, data=payload)\n\nprint(response.text)\n" - lang: C# source: 'var client = new HttpClient(); var request = new HttpRequestMessage(HttpMethod.Post, "https://offers.skyslope.com/offers-api/ext/token"); request.Headers.Add("Authorization", "Basic BASE64_CREDENTIALS"); var response = await client.SendAsync(request); response.EnsureSuccessStatusCode(); Console.WriteLine(await response.Content.ReadAsStringAsync()); ' - lang: PHP source: " 'https://offers.skyslope.com/offers-api/ext/token',\n\ \ CURLOPT_RETURNTRANSFER => true,\n CURLOPT_ENCODING => '',\n CURLOPT_MAXREDIRS => 10,\n\ \ CURLOPT_TIMEOUT => 0,\n CURLOPT_FOLLOWLOCATION => true,\n CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n\ \ CURLOPT_CUSTOMREQUEST => 'POST',\n CURLOPT_HTTPHEADER => array(\n 'Authorization: Basic\ \ BASE64_CREDENTIALS'\n ),\n));\n$response = curl_exec($curl);\ncurl_close($curl); echo $response;\n" - lang: Ruby source: 'require "uri" require "net/http" url = URI("https://offers.skyslope.com/offers-api/ext/token") http = Net::HTTP.new(url.host, url.port); request = Net::HTTP::Post.new(url) request["Authorization"] = "Basic Basic BASE64_CREDENTIALS" response = http.request(request) puts response.read_body ' responses: '200': description: OK content: application/json: schema: type: object properties: token_type: type: string expires_in: type: number access_token: type: string example: token_type: Bearer expires_in: 3600 access_token: ACCESS_TOKEN '204': description: No Content '400': description: Bad Request '401': description: Unauthorized '500': description: Internal Server Error