From 05a20375cc92477abd013534065defbbf8512b49 Mon Sep 17 00:00:00 2001 From: TMTABC Date: Fri, 7 Aug 2026 18:48:52 +0700 Subject: [PATCH 1/2] add GET /partner/v1/listings endpoint --- screening-api-docs/api.json | 207 ++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) diff --git a/screening-api-docs/api.json b/screening-api-docs/api.json index f8a752a..5e22cc1 100644 --- a/screening-api-docs/api.json +++ b/screening-api-docs/api.json @@ -5046,6 +5046,70 @@ ], "security": [] } + }, + "/partner/v1/listings": { + "get": { + "operationId": "ListingsController_findAll", + "summary": "List active listings", + "description": "Returns the authenticated partner's own active listings only - never another partner's data. Data matches the partner's generic XML feed (active listing whose unit is listed), including the Apply Now, Contact Us, and Request Showing action links. No filter/query parameters are supported in v1 beyond pagination; for a property-scoped API key, results are further restricted to the properties in scope.", + "parameters": [ + { + "name": "page", + "required": false, + "in": "query", + "schema": { + "default": 1, + "type": "number" + } + }, + { + "name": "per_page", + "required": false, + "in": "query", + "schema": { + "default": 20, + "type": "number" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/PaginatedResponse" + }, + { + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PartnerListing" + } + } + } + } + ] + } + } + } + }, + "401": { + "description": "Unauthorized" + } + }, + "tags": [ + "Listings" + ], + "security": [ + { + "bearer": [] + } + ] + } } }, "info": { @@ -10921,6 +10985,149 @@ "description": "The partner's URL slug, echoed back from the request." } } + }, + "PartnerListingActionLinks": { + "type": "object", + "description": "Lead-capture links for this listing, matching the links included in the partner's generic XML feed. A key is present only when the listing template enables that action; keys for disabled actions are omitted entirely (not null).", + "properties": { + "apply_now": { + "type": "string", + "description": "The Apply Now magic link. Present only when the template enables Apply Now and a magic link exists for the unit." + }, + "request_showing": { + "type": "string", + "description": "URL of the Request a Showing page. Present only when the template enables it." + }, + "contact_us": { + "type": "string", + "description": "URL of the Contact Us page. Present only when the template enables it." + } + } + }, + "PartnerListing": { + "type": "object", + "properties": { + "id": { + "type": "number", + "example": 12345, + "description": "Boom listing ID." + }, + "title": { + "type": "string", + "nullable": true, + "example": "Sunny 2BR near downtown" + }, + "description": { + "type": "string", + "nullable": true, + "example": "A great place to live" + }, + "property_type": { + "type": "string", + "nullable": true, + "example": "single_family", + "description": "The listing's property kind." + }, + "address": { + "allOf": [ + { + "$ref": "#/components/schemas/Address" + }, + { + "properties": { + "one_line_address": { + "type": "string", + "nullable": true, + "example": "123 Main St, San Francisco, CA, 94103, US" + } + } + } + ] + }, + "monthly_rent_amount": { + "$ref": "#/components/schemas/Money" + }, + "beds": { + "type": "number", + "nullable": true, + "example": 2 + }, + "baths": { + "type": "number", + "nullable": true, + "example": 1 + }, + "sqft": { + "type": "number", + "nullable": true, + "example": 800 + }, + "available_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "cats_allowed": { + "type": "boolean", + "nullable": true + }, + "dogs_allowed": { + "type": "boolean", + "nullable": true + }, + "primary_image_url": { + "nullable": true, + "description": "The listing's primary image. Shape varies by source: a plain URL string, an empty object when no image is set, or an object such as { \"full\": ..., \"small\": ... } or { \"url\": ..., \"alt\": ... }." + }, + "gallery_urls": { + "type": "array", + "items": {}, + "description": "Gallery images. Same variable per-item shape as primary_image_url." + }, + "common_amenity_ids": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } + }, + "special_feature_ids": { + "type": "array", + "nullable": true, + "items": { + "type": "string" + } + }, + "listing_url": { + "type": "string", + "nullable": true, + "description": "Public listing page URL - the same URL included in the partner's generic XML feed." + }, + "content_changed_at": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "last_updated": { + "type": "string", + "format": "date-time", + "nullable": true + }, + "action_links": { + "allOf": [ + { + "$ref": "#/components/schemas/PartnerListingActionLinks" + } + ], + "nullable": true, + "description": "Null when the listing has no listing template (no lead-capture actions available)." + } + }, + "required": [ + "id", + "address", + "monthly_rent_amount" + ] } } } From 823d0e4cbecbaa5da4a6e7fa0b5e2eefca0467cc Mon Sep 17 00:00:00 2001 From: TMTABC Date: Fri, 7 Aug 2026 19:45:00 +0700 Subject: [PATCH 2/2] sync PartnerListing schema: obfuscated id, drop last_updated --- screening-api-docs/api.json | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/screening-api-docs/api.json b/screening-api-docs/api.json index 5e22cc1..41d7e71 100644 --- a/screening-api-docs/api.json +++ b/screening-api-docs/api.json @@ -11008,9 +11008,9 @@ "type": "object", "properties": { "id": { - "type": "number", - "example": 12345, - "description": "Boom listing ID." + "type": "string", + "description": "Obfuscated Boom listing ID.", + "example": "aB3xQ9pL" }, "title": { "type": "string", @@ -11108,11 +11108,6 @@ "format": "date-time", "nullable": true }, - "last_updated": { - "type": "string", - "format": "date-time", - "nullable": true - }, "action_links": { "allOf": [ {