Skip to contents

tampaBayOpenData searches a bundled catalog of 52 checked layers or the live ArcGIS portals of six Tampa Bay publishers. Maintainers have validated the configured endpoints for checked layers. A discovered layer comes from a portal index and has not received those checks.

Live examples below are displayed but not run while the site is built. The checked-catalog example runs offline.

Start offline

library(tampaBayOpenData)

tampaBayOpenData::tbod_list_portals()[, c("id", "publisher", "jurisdiction")]
#> # A tibble: 6 × 3
#>   id           publisher                           jurisdiction
#>   <chr>        <chr>                               <chr>       
#> 1 city         City of Tampa                       tampa       
#> 2 tbrpc        Tampa Bay Regional Planning Council tampa-bay   
#> 3 stpete       City of St. Petersburg              stpete      
#> 4 clearwater   City of Clearwater                  clearwater  
#> 5 hillsborough Hillsborough County                 hillsborough
#> 6 pinellas     Pinellas County                     pinellas
tampaBayOpenData::tbod_list_datasets(source = "checked")[,
  c("id", "title", "jurisdiction", "validation_status")]
#> # A tibble: 52 × 4
#>    id                   title                     jurisdiction validation_status
#>    <chr>                <chr>                     <chr>        <chr>            
#>  1 construction-permits Permits (active GIS view) tampa        checked          
#>  2 development-cases    Active development coord… tampa        checked          
#>  3 capital-projects     Capital improvement proj… tampa        checked          
#>  4 city-boundary        Tampa boundary (shorelin… tampa        checked          
#>  5 neighborhoods        Neighborhood association… tampa        checked          
#>  6 council-districts    City council districts    tampa        checked          
#>  7 riverwalk            Tampa Riverwalk segments  tampa        checked          
#>  8 parks                Park polygons             tampa        checked          
#>  9 fire-stations        City of Tampa fire stati… tampa        checked          
#> 10 bike-lanes           Bicycle network segments  tampa        checked          
#> # ℹ 42 more rows
tampaBayOpenData::tbod_search_datasets(
  "park", source = "checked", spatial = TRUE,
  jurisdiction = c("stpete", "clearwater")
)
#> # A tibble: 2 × 23
#>   id             title description jurisdiction publisher source_url service_url
#>   <chr>          <chr> <chr>       <chr>        <chr>     <chr>      <chr>      
#> 1 stpete-parks   St. … Public par… stpete       City of … https://c… https://se…
#> 2 clearwater-pa… Clea… City of Cl… clearwater   City of … https://g… https://gi…
#> # ℹ 16 more variables: geometry_type <chr>, category <chr>, verified <date>,
#> #   terms <chr>, layer_id <int>, date_fields <list>, tags <list>,
#> #   item_id <chr>, portal <chr>, validation_status <chr>, modified <dttm>,
#> #   modified_source <chr>, service_type <chr>, layer_type <chr>,
#> #   categories <list>, original_metadata <list>
tampaBayOpenData::tbod_dataset_info("construction-permits")[
  c("title", "scope_note", "verified")]
#> $title
#> [1] "Permits (active GIS view)"
#> 
#> $scope_note
#> [1] "The upstream service is described as data for an internal active-permits viewer, although its public Query endpoint is accessible without a token. The date fields are LASTUPDATE and CREATEDDATE; no permit issue-date field is advertised. No explicit dataset license was found on this exact FeatureServer service or in the selected public ArcGIS organization catalog. Do not infer the license of a separate MapServer layer."
#> 
#> $verified
#> [1] "2026-09-29"

source = "checked" reads the registry without HTTP. IDs such as construction-permits and stpete-parks are package names, not ArcGIS item IDs. tbod_dataset_info(id) gives the scope, terms, source URL, and endpoint verification date; that date says nothing about record freshness. The coverage article has counts by publisher, and the selection policy explains which layers enter the catalog.

Discover live portal layers

found <- tbod_search_datasets("housing", source = "live", portals = "city")
found[, c("id", "title", "publisher", "validation_status", "modified")]

# A one-row result carries the source needed for inspection or retrieval.
if (nrow(found)) {
  selected <- found[1, ]
  selected[, c("item_id", "service_url", "layer_id", "portal")]
  tbod_dataset_info(selected)
}

By default, tbod_list_datasets() and tbod_search_datasets() use source = "all": they search all six portals and include the checked catalog. source = "live" returns only layers found through portal indexes, including checked layers when a live endpoint matches a checked entry. If a source is not indexed or an index lags, it may not appear in live results; a compatible public ArcGIS layer can still be retrieved by URL with tbod_get_arcgis_layer().

Use portals = "city" for Tampa, "tbrpc" for the regional planning council, or "stpete", "clearwater", "hillsborough", or "pinellas" for the other publishers. A vector selects several. tbod_list_portals() shows their publisher names and source locations offline. jurisdiction defaults to "all" for catalog functions and can be a code or a vector of codes. A jurisdiction or publisher filter narrows the organizations scanned and filters checked entries. portals only selects live organizations; it does not filter checked entries when source = "all". Retrieval and download functions default to jurisdiction = NULL: a checked ID resolves across the bundled catalog when it is unique. If two jurisdictions use the same ID, supply jurisdiction to select one.

When a live endpoint matches a checked entry, the result keeps its package ID, scope, and terms, combines checked and portal tags and categories, and uses the portal item’s modification time. New IDs have the form arcgis:<item-id>:<layer-id> and can be passed to tbod_get_dataset() later. The item or service can still change or disappear. Retrieval checks query responses and requires Query when the layer advertises a capabilities list.

Search beyond the bundled publishers

tbod_discover() accepts a public ArcGIS sharing REST root, FeatureServer or MapServer service root, or a layer URL. Portal queries search public service items; service queries filter layer names. Both return rows accepted by tbod_get_dataset(). Portal results have discovered status and stable arcgis: IDs; service results have not_checked status and use the layer URL as their ID. Queryable MapServer layers are supported.

# Replace this example address with your portal's public sharing REST root.
portal <- "https://example.maps.arcgis.com/sharing/rest"
other <- tbod_discover(portal, query = "parks", max_items = 10)
if (nrow(other)) {
  data <- tbod_get_dataset(other[1, ], limit = 100)
  # A stable ArcGIS ID can also be resolved later through its own portal.
  same_layer <- tbod_get_dataset(other$id[[1]], portal = portal, limit = 100)
}

Custom sources default to an "unspecified" jurisdiction. Set publisher and jurisdiction in tbod_discover() when you know them; these labels then travel with the discovery row and its retrieval provenance. The portal argument on retrieval applies only to a stable arcgis:<item-id>:<layer-id> ID. When retrieving a direct layer URL, tbod_get_dataset() does not accept a jurisdiction override.

Filter results

Both catalog functions accept these optional filters:

Filter Match
jurisdiction One or more codes from tbod_list_portals(); default "all".
publisher Exact publisher names from tbod_list_portals(), ignoring case.
validation_status "checked" or "discovered".
spatial TRUE for geometry layers, FALSE for tables; unknown geometry is excluded when filtering.
topic Literal substring in tags and categories, ignoring case.
category Exact category path or final category label, ignoring case.
modified_after, modified_before Inclusive bounds on the catalog’s modified timestamp.

Character filters accept vectors: values within one filter are alternatives; separate filters and the search text must all match. Date bounds accept a Date or strict "YYYY-MM-DD" string for a whole UTC day, or a POSIXct value for an exact instant. Rows with unknown modification times are excluded only when a date bound is supplied.

county_transport <- tbod_search_datasets(
  "road", source = "live", jurisdiction = "pinellas", spatial = TRUE,
  topic = "transportation", modified_after = as.Date("2025-01-01"),
  max_items = 10
)
county_transport[, c("id", "title", "publisher", "modified", "modified_source")]

modified_source = "portal_item" identifies a live ArcGIS item timestamp; "checked_snapshot" identifies an upstream timestamp saved in the checked registry. Neither establishes when every record was last updated. The separate checked verified date records an endpoint check, not feature freshness.

Understand scan limits and failures

max_items caps portal service items per organization, not the number of expanded layers. The default scans at most 25 items per organization. Use max_items = Inf explicitly for a full live listing, with a suitable total_timeout. A capped listing can miss matching items beyond the scan limit. jurisdiction and publisher narrow organizations before scanning; other filters apply after discovery and the checked overlay. Consequently, an item matching topic or modified_after may be missed by a capped scan.

results <- tbod_list_datasets(source = "live", portals = "stpete", max_items = 10)
attr(results, "discovery_complete")
attr(results, "discovery_truncated_portals")
attr(results, "discovery_scanned_items")
attr(results, "discovery_issues")
attr(results, "discovery_failed_portals")

Check discovery_complete before treating results as a complete portal catalog. The other attributes show scan progress, skipped items, and failed portals. A combined search retains rows from working publishers or from earlier pages of a failed scan. If all selected portals fail before returning rows, source = "live" errors; source = "all" warns and returns checked rows.

Continue with retrieval and downloads or read about coverage and source limits.