The Inside Airbnb London dataset has 87946 listings and the id column (which is the primary key) has a minimum value of 13913 and maximum of 973895808066047620 in the database.
I used “Ealing” as the SearchText for my initial testing and tried different page numbers and sizes
The listings search results JSON looked good but I missed one important detail…
[
{
"id": 32458423,
"name": "Bed and breakfast in Ealing · ★5.0 · 1 bedroom · 1 bed · 1 private bath",
"listingURL": "https://www.airbnb.com/rooms/32458423"
},
{
"id": 7905935,
"name": "Guest suite in Ealing Broadway · ★4.93 · 1 bedroom · 1 bed · 1 private bath",
"listingURL": "https://www.airbnb.com/rooms/7905935"
},
{
"id": 5262733,
"name": "Home in Ealing · ★4.97 · 1 bedroom · 1 shared bath",
"listingURL": "https://www.airbnb.com/rooms/5262733"
},
{
"id": 685148830257321200,
"name": "Home in Ealing London · ★5.0 · 4 bedrooms · 8 beds · 2.5 baths",
"listingURL": "https://www.airbnb.com/rooms/685148830257321258"
},
{
"id": 10704599,
"name": "Home in ealing, london · ★4.47 · 3 bedrooms · 4 beds · 1 bath",
"listingURL": "https://www.airbnb.com/rooms/10704599"
}
]
To “smoke test” to the lookup functionality I tried a couple of the listing ids
The HTTP GET method routing parameter and the response Data Transfer Object(DTO) the Airbnb listing Id properties are long values (ulong might have been a better choice) which should have sufficient range
string LookupByIdSql = @"SELECT Id, [Name], Listing_URL AS ListingURL
FROM ListingsHosts
WHERE id = @Id";
public record ListingLookupDto
{
public long Id { get; set; }
public string? Name { get; set; }
public string? ListingURL { get; set; }
};
//...
app.MapGet("/Listing/Results/{id:long}", async (long id, IDapperContext dappperContext) =>
{
using (var connection = dappperContext.ConnectionCreate())
{
ListingLookupDto result = await connection.QuerySingleOrDefaultWithRetryAsync<ListingLookupDto>(LookupByIdSql, new { id });
if (result is null)
{
return Results.Problem($"Listing {id} not found", statusCode: StatusCodes.Status404NotFound);
}
return Results.Ok(result);
}
})
.Produces<ListingLookupDto>(StatusCodes.Status200OK)
.Produces<ProblemDetails>(StatusCodes.Status404NotFound)
.WithOpenApi();
The id values in the search response and lookup DTOs were correct
I had missed the clue in the search response JSON the listing id and the listingURL id didn’t match.
{
"id": 685148830257321200,
"name": "Home in Ealing London · ★5.0 · 4 bedrooms · 8 beds · 2.5 baths",
"listingURL": "https://www.airbnb.com/rooms/685148830257321258"
},
The JavaScript Object Notation (JSON) Data Interchange Format(RFC7159) specification for numbers explains the discrepancy.
This specification allows implementations to set limits on the range
and precision of numbers accepted. Since software that implements
IEEE 754-2008 binary64 (double precision) numbers [IEEE754] is
generally available and widely used, good interoperability can be
achieved by implementations that expect no more precision or range
than these provide, in the sense that implementations will
approximate JSON numbers within the expected precision.





