Arcgis APIopen-data-portal-san-rafael.hub.arcgis.com ↗
Access City of San Rafael parcel and zoning records via 2 endpoints. Filter by address substring or exact zoning code. Returns APN, situs address, geometry type, and more.
What is the Arcgis API?
The San Rafael Parcels and Zoning API exposes two endpoints that return parcel records and layer metadata from the City of San Rafael Open Data Portal. The search_parcels endpoint returns paginated rows with fields including APN, situs address, and zoning code, and accepts filters for address substring and exact zoning code. The get_layer_info endpoint returns the full field schema — names, types, aliases, and lengths — along with the current total record count and per-request record cap.
No input parameters required.
curl -X GET 'https://api.parse.bot/scraper/69e64ee7-8382-4b23-86ba-435f567231a6/get_layer_info' \ -H 'X-API-Key: $PARSE_API_KEY'
Returns the metadata of the data layer behind the San Rafael Parcels and Zoning dataset: the published data service URL, the layer ID and name, the geometry type, the object-id field, the per-request record cap, the current total record count, and the full field list (names, types, aliases, string lengths). Two cheap round trips; no inputs; never empty.
No input parameters required.
{
"type": "object",
"fields": {
"fields": "array of {name, type, alias, length} objects; length is null for non-string fields",
"layer_id": "integer layer ID within the service",
"layer_url": "service_url joined with layer_id",
"layer_name": "string layer name",
"field_names": "array of field name strings in layer order",
"service_url": "URL of the public data service that holds the dataset",
"record_count": "integer total number of records in the layer right now",
"geometry_type": "string geometry type of the layer",
"object_id_field": "name of the unique object-id field",
"max_record_count": "integer per-request record cap enforced by the service"
},
"sample": {
"data": {
"fields": [
{
"name": "FID",
"type": "esriFieldTypeOID",
"alias": "FID",
"length": null
},
{
"name": "ENTRYID",
"type": "esriFieldTypeDouble",
"alias": "ENTRYID",
"length": null
},
{
"name": "PROPID",
"type": "esriFieldTypeString",
"alias": "PROPID",
"length": 10
},
{
"name": "PARCEL",
"type": "esriFieldTypeString",
"alias": "PARCEL",
"length": 8
},
{
"name": "SITUS_ADDR",
"type": "esriFieldTypeString",
"alias": "SITUS_ADDR",
"length": 75
},
{
"name": "ZONING",
"type": "esriFieldTypeString",
"alias": "ZONING",
"length": 50
},
{
"name": "Shape__Area",
"type": "esriFieldTypeDouble",
"alias": "Shape__Area",
"length": null
},
{
"name": "Shape__Length",
"type": "esriFieldTypeDouble",
"alias": "Shape__Length",
"length": null
}
],
"layer_id": 0,
"layer_url": "https://services5.arcgis.com/sruoiBDPu8SihcGN/arcgis/rest/services/Parcel_Zoning_Latest/FeatureServer/0",
"layer_name": "Parcel_Zoning_Latest",
"field_names": [
"FID",
"ENTRYID",
"PROPID",
"PARCEL",
"SITUS_ADDR",
"ZONING",
"Shape__Area",
"Shape__Length"
],
"service_url": "https://services5.arcgis.com/sruoiBDPu8SihcGN/arcgis/rest/services/Parcel_Zoning_Latest/FeatureServer",
"record_count": 18276,
"geometry_type": "esriGeometryPolygon",
"object_id_field": "FID",
"max_record_count": 2000
},
"status": "success"
}
}About the Arcgis API
Layer Metadata
The get_layer_info endpoint requires no inputs and returns a complete description of the underlying data layer. Key response fields include fields (an array of objects with name, type, alias, and length, where length is null for non-string fields), record_count (the live total number of parcels), max_record_count (the service's per-request cap), geometry_type, and object_id_field. This is the right starting point before querying records, since it tells you which field names and zoning codes exist in the dataset.
Parcel and Zoning Records
The search_parcels endpoint returns one row per parcel, ordered by fid ascending. Each record includes fid, entry_id, prop_id (the APN formatted with dashes), parcel (raw APN digits), and situs_address. Two optional filters narrow results: address_contains performs a case-insensitive substring match on the situs address field — useful for finding all parcels on a named street — while zoning requires an exact match against the stored zoning code (for example, PD(1). Without filters, the endpoint pages through the full dataset.
Pagination
Results are paginated using limit and offset parameters. The limit value is clamped to a maximum of 2000, matching the service's per-request cap reported by get_layer_info. The response includes total_count (matching records across all pages), count (records on the current page), and has_more (a boolean indicating whether additional pages exist). Combine offset with total_count to iterate the full result set programmatically.
The Arcgis API is a managed, monitored endpoint for open-data-portal-san-rafael.hub.arcgis.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when open-data-portal-san-rafael.hub.arcgis.com 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 open-data-portal-san-rafael.hub.arcgis.com 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?+
- Look up all parcels on a specific street using the
address_containsfilter againstsitus_address. - Pull every parcel assigned a particular zoning code using the exact
zoningfilter. - Enumerate all field names and types with
get_layer_infobefore building a data pipeline. - Count total parcels in the city using
record_countfrom the layer metadata endpoint. - Page through the full parcel dataset for bulk APN extraction using
limitandoffset. - Cross-reference
prop_id(APN with dashes) against county assessor records for property research. - Identify parcels in planned-development zones by filtering for PD-prefixed zoning codes.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does the City of San Rafael Open Data Portal have an official developer API?+
What does `search_parcels` return for each record, and how do the address and zoning filters interact?+
fid, entry_id, prop_id (APN with dashes), parcel (raw APN digits), and situs_address. If you supply both address_contains and zoning, only records matching both conditions are returned. If neither filter is supplied, all parcels are returned in fid ascending order, paged by limit and offset.How do I know if I've retrieved all matching records when paginating?+
total_count (total matching records across the full layer), count (records on the current page), and has_more (a boolean). When has_more is false and count is less than limit, you have reached the last page. Note that limit values above 2000 are clamped to 2000, which matches the service's own per-request cap.Does the API return parcel geometry — polygon coordinates for each parcel boundary?+
search_parcels endpoint returns attribute fields (APN, address, zoning code) but not geometry coordinates. The get_layer_info endpoint does return the geometry_type string for the layer. You can fork this API on Parse and revise it to request and return geometry from the underlying service for use cases that need polygon data.