{"openapi":"3.1.0","info":{"title":"WoningMe Developer API","description":"\nProgrammatic access to rental listings across the Netherlands, covering both\n**private-sector** (vrije sector) and **housing-association / public-sector**\n(sociale huur, middenhuur) rentals, scoped to search filters you define, with\noptional webhook notifications when new listings match.\n\nSame underlying listings data that powers the [WoningMe app](https://woning.me).\n\n## Getting started\n\n1. [Create a developer account](/developer/register). The same account works for the WoningMe app.\n2. Open your [dashboard](/developer/dashboard) and click \"Generate API key\". Copy it immediately, it's shown once.\n3. Create a search filter (below) and start querying matching rental properties, or add a `webhook_url` to get notified automatically.\n\nEvery developer account gets full access free of charge until **September 15, 2026**.\nAfter that date, continued access requires an active subscription.\n\n## Authentication\n\nEvery request must include your API key in the `X-Api-Key` header. Click **Authorize**\nabove to set it once for every request you try on this page.\n\nRequests are rate limited to **60 per minute** per API key. Exceeding this returns `429`.\n\n## Webhooks\n\nIf a search filter has a `webhook_url`, we send an HTTP `POST` to it whenever a new\nrental property matches:\n\n```\nPOST https://your-app.com/hooks/amsterdam\nContent-Type: application/json\nX-WoningMe-Signature: sha256=<hex digest>\n\n{\n  \"event\": \"listing.new\",\n  \"searchId\": 42,\n  \"property\": { /* same shape as the Rental properties endpoint below */ }\n}\n```\n\n**Verifying the signature.** `X-WoningMe-Signature` is an HMAC-SHA256 digest of the raw\nrequest body, using your search filter's `webhookSecret` (returned when you create or\nfetch the search) as the key. Always verify it before trusting a payload.\n\n```python\n# Python\nimport hashlib, hmac\n\ndef verify(request_body: bytes, signature_header: str, webhook_secret: str) -> bool:\n    expected = \"sha256=\" + hmac.new(\n        webhook_secret.encode(), request_body, hashlib.sha256\n    ).hexdigest()\n    return hmac.compare_digest(expected, signature_header)\n```\n\n```javascript\n// Node.js\nconst crypto = require(\"crypto\");\n\nfunction verify(rawBody, signatureHeader, webhookSecret) {\n  const expected = \"sha256=\" + crypto\n    .createHmac(\"sha256\", webhookSecret)\n    .update(rawBody)\n    .digest(\"hex\");\n  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signatureHeader));\n}\n```\n\n**Retries.** If your endpoint doesn't respond with a `2xx` status (or times out), we\nretry once after about 30 seconds, then give up. Check the Deliveries endpoint to see\nwhat happened. Webhook delivery stops automatically once your free developer access\nexpires, independent of any WoningMe Plus subscription on your account.\n\n## Errors\n\nErrors follow the shape `{\"detail\": \"...\"}`.\n\n| Status | Meaning |\n|---|---|\n| `401` | Missing or invalid API key. |\n| `402` | Free developer access has expired; a subscription is required to continue. |\n| `404` | The search filter doesn't exist. |\n| `422` | Request body failed validation (missing/invalid field). |\n| `429` | Rate limit exceeded. 60 requests per minute per API key. |\n","version":"1.0.0"},"paths":{"/api/developer/v1/searches":{"get":{"tags":["Search filters"],"summary":"List search filters","description":"Lists all of your saved search filters.","operationId":"list_searches_api_developer_v1_searches_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchesOut"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Free developer access has expired; a subscription is required to continue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}},"security":[{"APIKeyHeader":[]}]},"post":{"tags":["Search filters"],"summary":"Create a search filter","description":"Creates a new search filter. Every property lookup and webhook is scoped to a search filter you create first; there is no way to query properties directly.","operationId":"create_search_api_developer_v1_searches_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchIn"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchOut"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Free developer access has expired; a subscription is required to continue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}},"security":[{"APIKeyHeader":[]}]}},"/api/developer/v1/searches/{search_id}":{"get":{"tags":["Search filters"],"summary":"Get a search filter","description":"Fetches a single search filter by ID.","operationId":"get_search_api_developer_v1_searches__search_id__get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchOut"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Free developer access has expired; a subscription is required to continue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"404":{"description":"The search filter doesn't exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Search filters"],"summary":"Update a search filter","description":"Updates a search filter. Only fields you include are changed; omit a field to leave it as-is.","operationId":"patch_search_api_developer_v1_searches__search_id__patch","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchPatchIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchOut"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Free developer access has expired; a subscription is required to continue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"404":{"description":"The search filter doesn't exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Request body failed validation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}}}},"delete":{"tags":["Search filters"],"summary":"Delete a search filter","operationId":"delete_search_api_developer_v1_searches__search_id__delete","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Free developer access has expired; a subscription is required to continue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"404":{"description":"The search filter doesn't exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/developer/v1/searches/{search_id}/deliveries":{"get":{"tags":["Deliveries"],"summary":"List webhook deliveries","description":"Returns the recent webhook delivery attempts for a search filter. Useful for debugging your endpoint.","operationId":"get_search_deliveries_api_developer_v1_searches__search_id__deliveries_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveriesOut"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Free developer access has expired; a subscription is required to continue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"404":{"description":"The search filter doesn't exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/developer/v1/searches/{search_id}/properties":{"get":{"tags":["Rental properties"],"summary":"List matching rental properties","description":"Returns rental properties matching that search filter's city, radius, and segments, further narrowed by any of source/property_type/min_price/max_price/min_rooms/min_surface passed as query params. The geographic and segment scope always comes from the search filter and can't be widened per request; price/rooms/surface query params can only narrow the search filter's own values further, not loosen them.","operationId":"get_search_properties_api_developer_v1_searches__search_id__properties_get","security":[{"APIKeyHeader":[]}],"parameters":[{"name":"search_id","in":"path","required":true,"schema":{"type":"integer","title":"Search Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one source, e.g. nederwoon.","title":"Source"},"description":"Filter to one source, e.g. nederwoon."},{"name":"property_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one property type, e.g. apartment, house, studio, room.","title":"Property Type"},"description":"Filter to one property type, e.g. apartment, house, studio, room."},{"name":"min_price","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum monthly rent in whole euros for this request. Combines with the search filter's own min_price (the stricter of the two wins), it does not replace it.","title":"Min Price"},"description":"Minimum monthly rent in whole euros for this request. Combines with the search filter's own min_price (the stricter of the two wins), it does not replace it."},{"name":"max_price","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Maximum monthly rent in whole euros for this request. Combines with the search filter's own max_price (the stricter of the two wins), it does not replace it.","title":"Max Price"},"description":"Maximum monthly rent in whole euros for this request. Combines with the search filter's own max_price (the stricter of the two wins), it does not replace it."},{"name":"min_rooms","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum number of rooms for this request. Combines with the search filter's own min_rooms (the stricter of the two wins).","title":"Min Rooms"},"description":"Minimum number of rooms for this request. Combines with the search filter's own min_rooms (the stricter of the two wins)."},{"name":"min_surface","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"description":"Minimum floor area in m² for this request. Combines with the search filter's own min_surface (the stricter of the two wins).","title":"Min Surface"},"description":"Minimum floor area in m² for this request. Combines with the search filter's own min_surface (the stricter of the two wins)."},{"name":"sort","in":"query","required":false,"schema":{"type":"string","description":"price, surface, rooms, available, city, last_synced_at, or first_seen_at","default":"price","title":"Sort"},"description":"price, surface, rooms, available, city, last_synced_at, or first_seen_at"},{"name":"order","in":"query","required":false,"schema":{"type":"string","description":"asc or desc","default":"asc","title":"Order"},"description":"asc or desc"},{"name":"skip","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"For pagination.","default":0,"title":"Skip"},"description":"For pagination."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":1000,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertiesOut"}}}},"401":{"description":"Missing or invalid API key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"402":{"description":"Free developer access has expired; a subscription is required to continue.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"404":{"description":"The search filter doesn't exist.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per API key).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"DeliveriesOut":{"properties":{"deliveries":{"items":{"$ref":"#/components/schemas/DeliveryOut"},"type":"array","title":"Deliveries"}},"type":"object","required":["deliveries"],"title":"DeliveriesOut"},"DeliveryOut":{"properties":{"id":{"type":"integer","title":"Id"},"propertyId":{"type":"integer","title":"Propertyid"},"status":{"type":"string","title":"Status","description":"One of \"success\", \"pending_retry\", \"failed\"."},"httpStatus":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Httpstatus","description":"Null if the request never got a response (timeout/connection error)."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Null on success."},"attemptCount":{"type":"integer","title":"Attemptcount"},"attemptedAt":{"type":"string","title":"Attemptedat"}},"type":"object","required":["id","propertyId","status","attemptCount","attemptedAt"],"title":"DeliveryOut"},"ErrorOut":{"properties":{"detail":{"type":"string","title":"Detail"}},"type":"object","required":["detail"],"title":"ErrorOut"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"PropertiesOut":{"properties":{"total":{"type":"integer","title":"Total"},"skip":{"type":"integer","title":"Skip"},"limit":{"type":"integer","title":"Limit"},"properties":{"items":{"$ref":"#/components/schemas/PropertyOut"},"type":"array","title":"Properties"}},"type":"object","required":["total","skip","limit","properties"],"title":"PropertiesOut"},"PropertyOut":{"properties":{"id":{"type":"integer","title":"Id"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Internal source slug, e.g. \"nederwoon\"."},"sourceLabel":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sourcelabel","description":"Human-readable source name, e.g. \"Nederwoon\". Null if the source has no display name configured."},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"imageUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Imageurl","description":"Null if the listing has no cover photo."},"street":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Street","description":"Null if not published by the source."},"postcode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Postcode","description":"Null if not published by the source."},"city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"City"},"propertyType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Propertytype","description":"E.g. \"Apartment\", \"House\". Null if unknown."},"constructionType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Constructiontype","description":"E.g. \"Bestaande bouw\", \"Nieuwbouw\". Frequently null."},"surfaceM2":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Surfacem2","description":"Null if not published by the source."},"rooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Rooms","description":"Null if not published by the source."},"availableFrom":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Availablefrom","description":"Free-text availability date. Often null."},"priceEurCents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priceeurcents","description":"Monthly rent in eurocents. Null if the source published no price."},"priceText":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricetext","description":"Rent as originally formatted by the source, e.g. \"€ 1.450\"."},"reactions":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Reactions","description":"Number of reactions/viewings reported by the source. Usually null."},"agent":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agent","description":"Rental agent/agency name. Null if unknown."},"agentWebsite":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentwebsite","description":"Null if we have no website on file for this agent."},"agentPhone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Agentphone","description":"Null if we have no phone number on file for this agent."},"socialHousing":{"type":"boolean","title":"Socialhousing"},"isHousingAssociation":{"type":"boolean","title":"Ishousingassociation"},"isMiddenhuur":{"type":"boolean","title":"Ismiddenhuur"},"assignmentType":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assignmenttype","description":"Frequently null."},"neighbourhoodScore":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Neighbourhoodscore","description":"Leefbaarometer score for the postcode, or null if unavailable."},"lat":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lat","description":"Null if the listing could not be geocoded."},"lon":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Lon","description":"Null if the listing could not be geocoded."},"firstSeenAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Firstseenat"},"lastSyncedAt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Lastsyncedat","description":"When we last confirmed this listing was still live."}},"type":"object","required":["id","socialHousing","isHousingAssociation","isMiddenhuur"],"title":"PropertyOut"},"SearchIn":{"properties":{"label":{"type":"string","minLength":1,"title":"Label","description":"A name you choose for this search, e.g. \"Amsterdam centrum\"."},"city":{"type":"string","minLength":1,"title":"City","description":"Dutch city or municipality name to search around."},"radius_km":{"type":"number","exclusiveMinimum":0.0,"title":"Radius Km","description":"Search radius in kilometers from the city center."},"is_free_market":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Free Market","description":"Include private-sector (vrije sector) listings. Segment flags are independent: set any combination. If none of the three are supplied, a new search matches all of them (unchanged from before segment filtering existed)."},"is_social_housing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Social Housing","description":"Include housing-association / public-sector (corporatie, sociale huur) listings. Segment flags are independent: set any combination. If none of the three are supplied, a new search matches all of them (unchanged from before segment filtering existed)."},"is_middenhuur":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Middenhuur","description":"Include mid-market rent (middenhuur) listings. Segment flags are independent: set any combination. If none of the three are supplied, a new search matches all of them (unchanged from before segment filtering existed)."},"min_price":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Price","description":"Minimum monthly rent in whole euros. Omit for no minimum."},"max_price":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Price","description":"Maximum monthly rent in whole euros. Omit for no maximum."},"min_rooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Rooms","description":"Minimum number of rooms. Omit for no minimum."},"min_surface":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Surface","description":"Minimum floor area in square meters. Omit for no minimum."},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"HTTPS URL to receive a POST when a new listing matches. Omit for no webhook."}},"type":"object","required":["label","city","radius_km"],"title":"SearchIn"},"SearchOut":{"properties":{"id":{"type":"integer","title":"Id"},"label":{"type":"string","title":"Label"},"city":{"type":"string","title":"City"},"radiusKm":{"type":"number","title":"Radiuskm"},"createdAt":{"type":"string","title":"Createdat"},"propertiesUrl":{"type":"string","title":"Propertiesurl","description":"Path to fetch rental properties matching this search."},"isFreeMarket":{"type":"boolean","title":"Isfreemarket","description":"Whether private-sector (vrije sector) listings are included."},"isSocialHousing":{"type":"boolean","title":"Issocialhousing","description":"Whether housing-association / public-sector listings are included."},"isMiddenhuur":{"type":"boolean","title":"Ismiddenhuur","description":"Whether mid-market rent (middenhuur) listings are included."},"minPrice":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minprice","description":"Minimum monthly rent in euros, or null if unset."},"maxPrice":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maxprice","description":"Maximum monthly rent in euros, or null if unset."},"minRooms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minrooms","description":"Minimum number of rooms, or null if unset."},"minSurface":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minsurface","description":"Minimum floor area in m², or null if unset."},"webhookUrl":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhookurl","description":"Null if no webhook is configured."},"webhookSecret":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhooksecret","description":"Null if no webhook is configured. Used to verify the X-WoningMe-Signature header on deliveries."}},"type":"object","required":["id","label","city","radiusKm","createdAt","propertiesUrl","isFreeMarket","isSocialHousing","isMiddenhuur"],"title":"SearchOut"},"SearchPatchIn":{"properties":{"label":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"Label","description":"Omit to leave unchanged."},"city":{"anyOf":[{"type":"string","minLength":1},{"type":"null"}],"title":"City","description":"Omit to leave unchanged."},"radius_km":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Radius Km","description":"Omit to leave unchanged."},"is_free_market":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Free Market","description":"Omit to leave unchanged."},"is_social_housing":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Social Housing","description":"Omit to leave unchanged."},"is_middenhuur":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Middenhuur","description":"Omit to leave unchanged."},"min_price":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Price","description":"Omit to leave unchanged. There is currently no way to clear a price/rooms/surface filter back to unset via PATCH once set; delete and recreate the search instead."},"max_price":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Max Price","description":"Omit to leave unchanged."},"min_rooms":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Rooms","description":"Omit to leave unchanged."},"min_surface":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Min Surface","description":"Omit to leave unchanged."},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","description":"Omit to leave unchanged. Send an empty string to remove the webhook (this also clears webhookSecret)."}},"type":"object","title":"SearchPatchIn"},"SearchesOut":{"properties":{"searches":{"items":{"$ref":"#/components/schemas/SearchOut"},"type":"array","title":"Searches"}},"type":"object","required":["searches"],"title":"SearchesOut"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}},"securitySchemes":{"APIKeyHeader":{"type":"apiKey","in":"header","name":"X-Api-Key"}}},"tags":[{"name":"Search filters","description":"A search filter defines a city, radius, housing segments, and optional price/rooms/surface minimums/maximums. Every rental-property lookup and webhook is scoped to one. The endpoint path is `/searches`; \"search filter\" is just what we call it in these docs.\n\nBy default a new search filter matches all three housing segments (private-sector, housing-association, and mid-market rent). Set `is_free_market` / `is_social_housing` / `is_middenhuur` explicitly to narrow it to just the segment(s) you want, e.g. `is_social_housing: true` alone returns only housing-association listings."},{"name":"Rental properties","description":"Rental listings matching a search filter's city, radius, segments, and price/rooms/surface filters. Many fields are nullable, since sources don't all publish the same data. See each field's description below for when it can be null."},{"name":"Deliveries","description":"Recent webhook delivery attempts for a search filter, for debugging your endpoint."}],"servers":[{"url":"https://woning.me"}]}