Lescrous APItrouverunlogement.lescrous.fr ↗
Search, filter, and monitor French CROUS student housing listings. 7 endpoints covering residences, availability, price, city, room type, and regional data.
What is the Lescrous API?
This API exposes 7 endpoints for querying student housing listings managed by the French CROUS network via trouverunlogement.lescrous.fr. Use search_residences to retrieve paginated accommodation listings with rent prices, equipment, and availability status, or get_residence_details to pull full residence data including transport links, area dimensions, booking status, and occupation modes with rent ranges.
curl -X GET 'https://api.parse.bot/scraper/d252a081-10a5-437e-9533-68a7a9175a3e/search_residences?page=1&page_size=5&occupation_modes=couple' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace trouverunlogement-lescrous-fr-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: CROUS Student Housing SDK — find affordable student housing in France."""
from parse_apis.crous_student_housing_api import (
CrousHousing, OccupationMode, RoomType, City, AccommodationNotFound,
)
client = CrousHousing()
# List all CROUS regions to see coverage across France.
for region in client.regions.list(limit=5):
print(region.id, region.name)
# Search for studio accommodations under €400/month.
for acc in client.accommodations.by_price(max_price=400, limit=3):
print(acc.label, acc.available, acc.residence.address)
# Filter by room type using the RoomType enum.
studio = client.accommodations.by_room_type(room_type=RoomType.STUDIO, limit=1).first()
if studio:
print(studio.label, studio.area.min, studio.area.max)
# Get full details for a specific accommodation.
try:
detail = client.accommodations.get(id=str(studio.id))
print(detail.label, detail.residence.label, detail.available)
for eq in detail.equipments[:3]:
print(f" {eq.category}: {eq.label}")
except AccommodationNotFound as exc:
print(f"Not found: {exc}")
# Search by city using the City enum.
for acc in client.accommodations.by_city(city=City.TULLE, limit=3):
for mode in acc.occupationModes:
print(acc.label, mode.type, mode.rent.min, mode.rent.max)
print("exercised: regions.list / by_price / by_room_type / get / by_city")
Search for student housing accommodations across France. Returns a paginated list of accommodations with residence details, rent prices, equipment, and availability status. Also includes aggregation data with map markers and filter counts. Default page size is 24.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination. |
| page_size | integer | Number of results per page. |
| occupation_modes | string | Comma-separated occupation mode filters. Accepted values: 'alone', 'couple', 'house_sharing'. |
{
"type": "object",
"fields": {
"page": "integer current page index (0-based)",
"items": "array of accommodation listing objects",
"total": "integer total number of matching accommodations",
"pageSize": "integer number of results per page",
"aggregations": "object with occupationModes counts, equipmentCategories, rent distribution, and map markers"
},
"sample": {
"data": {
"page": 0,
"items": [
{
"id": 6,
"area": {
"max": 26,
"min": 26
},
"label": "Tulle Studio",
"available": true,
"residence": {
"label": "Résidence de Souilhac",
"address": "35 rue d'Arsonval 19000 TULLE"
},
"equipments": [
{
"id": "d090e186-fa0e-11e7-89ed-005056940822",
"label": "WC",
"category": "Bâtiment"
}
],
"bookingData": {
"amount": 10000
},
"occupationModes": [
{
"rent": {
"max": 40359,
"min": 40359
},
"type": "alone"
}
]
}
],
"total": 135,
"pageSize": 5,
"aggregations": {
"occupationModes": {
"alone": 127,
"couple": 6,
"house_sharing": 16
}
}
},
"status": "success"
}
}About the Lescrous API
What the API covers
The API covers student housing accommodations managed across France by the CROUS network. search_residences returns a paginated results.items array where each item includes an accommodation ID, type label, availability boolean, and rent data. The aggregations object returned alongside results contains occupation mode counts, equipment category breakdowns, rent distribution buckets, and map marker coordinates — useful for building map views or faceted filter UIs.
Residence and booking detail
get_residence_details accepts a numeric accommodation_id (obtainable from results[*].items[*].id) and returns a rich response: area with min/max square meters, residence with name, address, GPS location, transport links, and media assets, equipments as a categorized array, bookingData with a booking amount and availability flag, and occupationModes listing rent ranges in cents for solo, couple, or house-sharing arrangements.
Filtering options
Three filter endpoints narrow results without requiring search-side logic. filter_by_price accepts a max_price in euros and compares against each accommodation's minimum rent. filter_by_room_type does a case-insensitive substring match on the label field, so values like Studio, T1, or Chambre all work. search_residences_by_city matches against residence address and label fields. All three return the same results and aggregations structure as the base search. get_available_residences further narrows to listings where available is true.
Regional data
list_crous_regions returns a static list of 24 CROUS regional organizations, each with an integer id and a string name. These IDs reflect the real administrative structure of the CROUS network across metropolitan France.
The Lescrous API is a managed, monitored endpoint for trouverunlogement.lescrous.fr — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when trouverunlogement.lescrous.fr changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official trouverunlogement.lescrous.fr API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a housing availability monitor that polls
get_available_residencesand alerts when new listings appear - Render an interactive map of student housing using map marker coordinates from the
aggregationsobject - Display price distribution histograms using rent bucket data from the
aggregations.rentfield - Filter listings by city and room type together by chaining
search_residences_by_cityresults client-side withfilter_by_room_type - Show transport links and nearby transit options by extracting
residence.transportsfromget_residence_details - Compare rent ranges across occupation modes (alone vs. couple vs. house sharing) using
occupationModesrent data - Populate a regional selector UI using the 24 CROUS organizations returned by
list_crous_regions
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does CROUS provide an official developer API for trouverunlogement.lescrous.fr?+
What does `get_residence_details` return beyond what the search endpoint provides?+
get_residence_details returns fields not present in the search listing: area (min/max square meters), residence.transports (transport links near the residence), residence.medias (photos and media assets), equipments as a full categorized array, and bookingData with a booking amount and availability flag. The search endpoint returns summary-level fields only.Does `search_residences_by_city` search all pages of results or only one page at a time?+
page and page_size parameters and apply the city filter across pages.Can I filter by both price and room type in a single API call?+
max_price and room_type filters in one request. filter_by_price and filter_by_room_type are separate endpoints. You can fork the API on Parse and revise it to add a combined filter endpoint that applies both constraints in a single call.Does the API expose individual room-level booking or waitlist data?+
bookingData at the accommodation level, which includes a booking amount and an availability flag, but does not break down individual room availability, waitlist position, or booking slot schedules. You can fork the API on Parse and revise it to add an endpoint targeting room-level booking detail if the source exposes that data.