parseapi 1.9.3__tar.gz → 1.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. {parseapi-1.9.3 → parseapi-1.10.0}/CHANGELOG.md +6 -0
  2. {parseapi-1.9.3 → parseapi-1.10.0}/PKG-INFO +71 -3
  3. {parseapi-1.9.3 → parseapi-1.10.0}/README.md +70 -2
  4. {parseapi-1.9.3 → parseapi-1.10.0}/api/public.json +2558 -1000
  5. {parseapi-1.9.3 → parseapi-1.10.0}/pyproject.toml +1 -1
  6. parseapi-1.10.0/src/parseapi/__init__.py +7 -0
  7. {parseapi-1.9.3 → parseapi-1.10.0}/src/parseapi/_client.py +197 -23
  8. parseapi-1.10.0/src/parseapi/city.py +31 -0
  9. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-company-coverage.json +12 -0
  10. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-company-profile.json +16 -0
  11. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-emoji-catalog.json +185 -0
  12. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-emoji-metadata.json +127 -0
  13. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-provider.json +31 -0
  14. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-tariff-search.json +15 -0
  15. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-tariff.json +10 -0
  16. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-time.json +78 -0
  17. parseapi-1.10.0/tests/fixtures/response-fixtures/clean-timezones.json +601 -0
  18. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-company-coverage.json +13 -0
  19. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-company-profile.json +17 -0
  20. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-emoji-catalog.json +189 -0
  21. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-emoji-metadata.json +131 -0
  22. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-provider.json +42 -0
  23. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-tariff-search.json +16 -0
  24. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-tariff.json +11 -0
  25. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-time.json +84 -0
  26. parseapi-1.10.0/tests/fixtures/response-fixtures/standard-timezones.json +602 -0
  27. parseapi-1.10.0/tests/test_city_canonical.py +132 -0
  28. parseapi-1.10.0/tests/test_city_quality.py +57 -0
  29. parseapi-1.10.0/tests/test_city_query_parity.py +54 -0
  30. parseapi-1.10.0/tests/test_response_decoding.py +31 -0
  31. parseapi-1.9.3/src/parseapi/__init__.py +0 -6
  32. {parseapi-1.9.3 → parseapi-1.10.0}/.github/workflows/publish.yml +0 -0
  33. {parseapi-1.9.3 → parseapi-1.10.0}/.github/workflows/test.yml +0 -0
  34. {parseapi-1.9.3 → parseapi-1.10.0}/.gitignore +0 -0
  35. {parseapi-1.9.3 → parseapi-1.10.0}/LICENSE +0 -0
  36. {parseapi-1.9.3 → parseapi-1.10.0}/scripts/public_api.py +0 -0
  37. {parseapi-1.9.3 → parseapi-1.10.0}/smoke/smoke.py +0 -0
  38. {parseapi-1.9.3 → parseapi-1.10.0}/src/parseapi/py.typed +0 -0
  39. {parseapi-1.9.3 → parseapi-1.10.0}/tests/bank-fixtures.json +0 -0
  40. {parseapi-1.9.3 → parseapi-1.10.0}/tests/fixtures/emoji-artwork.json +0 -0
  41. {parseapi-1.9.3 → parseapi-1.10.0}/tests/fixtures/emoji-catalog.json +0 -0
  42. {parseapi-1.9.3 → parseapi-1.10.0}/tests/fixtures/measure-response.json +0 -0
  43. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_bank.py +0 -0
  44. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_card_dx.py +0 -0
  45. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_client.py +0 -0
  46. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_company_directory.py +0 -0
  47. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_email_enrichment.py +0 -0
  48. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_emoji.py +0 -0
  49. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_language.py +0 -0
  50. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_measure_response.py +0 -0
  51. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_name_formatting.py +0 -0
  52. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_postal_localities.py +0 -0
  53. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_public_api.py +0 -0
  54. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_stack.py +0 -0
  55. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_tariff.py +0 -0
  56. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_tariff_short_id.py +0 -0
  57. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_time_complete.py +0 -0
  58. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_time_gaps.py +0 -0
  59. {parseapi-1.9.3 → parseapi-1.10.0}/tests/test_version.py +0 -0
  60. {parseapi-1.9.3 → parseapi-1.10.0}/tests/typing_company_directory.py +0 -0
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.10.0 — 2026-10-15
4
+
5
+ - Add compatible City resource/list, spelling-search, geographic-filter, pagination, hierarchy, relationship and distance support.
6
+ - Keep existing City calls and response defaults compatible; expose ambiguity candidates when requested.
7
+ - Remove population observation periods from public examples; retain published typed members only for source compatibility.
8
+
3
9
  ## 1.9.1 — 2026-10-12
4
10
 
5
11
  - Add Emoji search/browse, categories, catalog, metadata, parsing and conversion; keep existing lookup calls and response decoding compatible.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: parseapi
3
- Version: 1.9.3
3
+ Version: 1.10.0
4
4
  Summary: Official ParseAPI client for Python. One key, minimal JSON, fast.
5
5
  Project-URL: Homepage, https://parseapi.com
6
6
  Project-URL: Documentation, https://parseapi.com/docs
@@ -275,7 +275,7 @@ place = parse.postal("28202", country="US", deep=True)
275
275
  property_tax = (place.get("deep") or {}).get("property_tax")
276
276
  ```
277
277
 
278
- Read `population_period` alongside `population`: a reporting year (`YYYY`) or period (`YYYY-YYYY`), null when unknown or unverifiable. Keep missing or null values unknown and preserve a known zero. These fields belong to full place profiles. State district lists include each district's population and period. Postal nearby and distance detail remains metropolitan associations only. Continent population stays in core.
278
+ Read `population` as the source’s count for that place boundary. Keep missing or null values unknown and preserve a known zero. State district lists include each district’s population. Postal nearby and distance detail remains metropolitan associations only. Continent population stays in core.
279
279
 
280
280
  Country deep includes `land_area` and `water_area` in km2, `coastline` in km, and mean `elevation` in metres. `lowest_point` and `highest_point` contain a nullable `name` and an `elevation` in metres. Values below sea level are negative. Missing or null values stay unknown, and zero stays zero.
281
281
 
@@ -329,7 +329,7 @@ Invalid input returns `valid: false` with unknown provider fields. A checksum-va
329
329
 
330
330
  The default pooled lookup includes provider identity, specialty and practice contact where held. Paid `deep` adds `deactivated_at`, `medicare`, `opt_out` and `enrollments` from stored source files, with no separate check meter or live verification. `enrollments: null` means unavailable; `[]` means no enrollment rows are returned. The API omits unrequested `deep` and returns `{}` when requested on Free.
331
331
 
332
- Paid Deep also returns `taxonomies` in published order, with taxonomy code, specialty label, primary flag and provider-reported license number/state, plus `enumerated_at`, `updated_at` and `reactivated_at` record dates. Reported licenses are not verified licenses. Null lists mean unavailable; empty lists mean the edition contains no entries. Core `sources` is available on every plan: NPPES, LEIE, PECOS and opt-out each have nullable edition metadata (`edition`, `published_at`, `through`, `imported_at`). Provider record dates are separate from source publication and completed import dates. Older responses may omit these additions. Edition details remain null until a verified source is served.
332
+ Paid Deep also returns `taxonomies` in published order, with taxonomy code, specialty label, primary flag and provider-reported license number/state, plus `enumerated_at`, `updated_at` and `reactivated_at` record dates. Reported licenses are not verified licenses. Null lists mean unavailable; empty lists mean the edition contains no entries. Provider record dates describe the provider record. Unknown dates stay null.
333
333
 
334
334
  ## Deep
335
335
 
@@ -482,3 +482,71 @@ A device's emoji font remains the ordinary display.
482
482
 
483
483
  These additions are a local release candidate until the matching SDK and
484
484
  backend are published. Existing lookup and search contracts are preserved.
485
+
486
+
487
+ ## City scope and reviewed details
488
+
489
+ ```python
490
+ city = parse.city("Sakai", country="JP", state="27", grain="municipality",
491
+ aliases=True, ambiguity="error", hierarchy=True, deep=True)
492
+ ```
493
+
494
+ `type` selects the recorded country-specific place type. `grain` selects a reviewed `municipality`, `subdivision`, `locality` or `metropolitan_area`; unreviewed places do not match a grain filter. `aliases=True` enables reviewed name forms. `ambiguity="error"` rejects several eligible exact matches. Existing calls keep their defaults, and `AsyncParseAPI` accepts the same options.
495
+
496
+ `hierarchy=True` adds optional `grain` and `parent` fields using stable City IDs. A null parent means no relationship has been reviewed. Nearest lookup applies country, state, type and grain to eligible centers within 2,000 km; a nearest center does not establish boundary containment. Nearby type and grain select both the named anchor and its results.
497
+
498
+ Paid Deep can include `population_observed_on` and `population_basis` for a reviewed count at the same place layer. Download dates do not supply population observation dates. These options use current API 2.0.0; older responses can omit the new fields.
499
+
500
+ ```python
501
+ opts = dict(country="JP", min_population=100_000, sort="-population,+name",
502
+ limit=50)
503
+ first = parse.city.list(**opts)
504
+ for city in first["data"]:
505
+ print(city["id"], city.get("name"))
506
+ if first["next_cursor"]:
507
+ next_page = parse.city.list(**opts, cursor=first["next_cursor"])
508
+ parse.city.nearby_coordinates(48.2082, 16.3738, radius=40, unit="km")
509
+ parse.city.search("sa", page=True, timezone="Asia/Tokyo", bbox="130,30,145,45")
510
+ ```
511
+
512
+ Collections support inclusive `min_population`/`max_population`, `min_elevation`/`max_elevation`, `countries`, `exclude_countries`, `timezones`, exact `timezone` and center-coordinate `bbox` (`west,south,east,north`; west greater than east crosses the dateline). Unknown populations do not match a population range. Browse sorts by name or population; search also supports relevance; nearby also supports distance. `order` accepts `asc` or `desc` (relevance allows only `asc`); population defaults to descending with unknown counts last. Filtering and ordering use the same count as paid Deep.
513
+
514
+ `lang="de"` displays Vienna as Wien; `lang="ja"` supports 1,912 reviewed Japanese native names, and `lang="zh-Hant"` supports 377 reviewed Traditional Chinese names in Taiwan. Approved translations take precedence; missing or unsupported labels keep the source name. IDs and `name_local` stay unchanged. Name sorting uses the stored primary name, regardless of display language. Coordinate nearby defaults to 40 km, or 25 mi with `unit="mi"`, and caps the radius at 800 km or 500 mi.
515
+
516
+ `city.list` and `city.nearby_coordinates` return `{ "object": "list", "data": [...], "next_cursor": ... }`. Each item retains `id` and `object: "city"`. Existing lookup, search, nearest and named-nearby calls keep their classic responses. Add `format="list"` to search or named nearby for a canonical collection, or `format="resource"` to lookup, ID lookup or nearest for a canonical resource. Classic search and named nearby include `next_cursor` with `page=True` or `cursor`; old responses may omit it. Keep the original options, including `limit`, when continuing. An invalid cursor or changed query/order returns 400; restart without the cursor. Pages are not a historical snapshot. Named nearby applies population, timezone and bbox to results, while country/state select its anchor. Async methods accept the same arguments.
517
+
518
+ `city.children(id)`, `city.ancestors(id)` and `city.siblings(id)` return canonical lists with `coverage: "partial"`. An empty list does not prove the absence of relatives. Children and siblings support page continuation. `city.distance(from_id, to_id)` returns `object: "city_distance"`, `from`, `to`, `distance` in kilometers, `distance_mi` in miles and `method: "great_circle"`. It compares stored centers; unknown coordinates remain null and known zero remains zero. Async clients support the same calls.
519
+
520
+ Strict ambiguity returns HTTP 409. Catch `ParseAPIError` with `code == "ambiguous_city"` and read optional `error.candidates` for at most two safe City identity objects; `CityAmbiguityCandidate` is exported as a TypedDict. Choose an ID or narrow the filters for a new request. Other errors and retry behavior remain unchanged.
521
+
522
+
523
+ ## Canonical City operations
524
+
525
+ Classic lookup, search, nearest and named-nearby methods retain their default envelopes and required-field models. Browse and coordinate-nearby use canonical lists: `object`, `data` and nullable `next_cursor` (camelCase properties in Swift/Kotlin). Keep all query options unchanged when continuing a page; no client fetches pages automatically.
526
+
527
+ ```python
528
+ page = parse.city.search('Viena', format='list', match='fuzzy', max_distance=1)
529
+ ```
530
+
531
+ Select `format=resource` for one City or `format=list` for a collection. Country inclusion/exclusion sets, timezone sets, inclusive population and meter-elevation bounds, stored-center `bbox` and signed multi-key sorting are available for collections. Unknown numeric facts do not match range filters.
532
+
533
+ Search defaults to prefix matching. Exact and fuzzy matching are explicit; fuzzy accepts maximum edit distance 1 or 2 and returns `match` evidence (`type`, `source`, `value`, `language`, `edit_distance`). Review a fuzzy choice before storing its ID.
534
+
535
+ Reviewed children, ancestors and siblings use canonical lists with partial relationship coverage. Empty data does not prove there are no geographic relatives. Children/siblings accept page controls; ancestors do not. Distance reports great-circle kilometers and miles between stored centers: zero is known zero, null is unknown, and it does not imply travel time or containment.
536
+
537
+ Strict `ambiguity=error` can return HTTP 409 `ambiguous_city` with up to two safe candidate identities. The existing error constructor and unrelated error metadata are preserved; candidates are retained only for that status/code and never contain Deep. GeoJSON is available through HTTP; these typed City list methods do not return GeoJSON.
538
+
539
+
540
+
541
+ Reviewed name forms:
542
+
543
+ ```python
544
+ city = parse.city.id('city_7aj899nvwyku', format='resource', romanized=True)
545
+ ```
546
+
547
+ Coverage by country and available fields is described at https://parseapi.com/city#coverage.
548
+
549
+ `romanized=true` requests reviewed official name forms as `name_romanized` and `romanization_language` (camelCase in Swift/Kotlin). Current reviewed forms cover 20 Japanese whole-city aliases in ja-Latn. Missing or conflicting forms stay null; ASCII folding is not substituted for an official form.
550
+
551
+
552
+ Conditional `If-None-Match` reads and GeoJSON currently use HTTP directly. A matching City ETag returns 304 without a body; ordinary billing and rate limits apply. These JSON client methods do not supply conditional-cache handling.
@@ -256,7 +256,7 @@ place = parse.postal("28202", country="US", deep=True)
256
256
  property_tax = (place.get("deep") or {}).get("property_tax")
257
257
  ```
258
258
 
259
- Read `population_period` alongside `population`: a reporting year (`YYYY`) or period (`YYYY-YYYY`), null when unknown or unverifiable. Keep missing or null values unknown and preserve a known zero. These fields belong to full place profiles. State district lists include each district's population and period. Postal nearby and distance detail remains metropolitan associations only. Continent population stays in core.
259
+ Read `population` as the source’s count for that place boundary. Keep missing or null values unknown and preserve a known zero. State district lists include each district’s population. Postal nearby and distance detail remains metropolitan associations only. Continent population stays in core.
260
260
 
261
261
  Country deep includes `land_area` and `water_area` in km2, `coastline` in km, and mean `elevation` in metres. `lowest_point` and `highest_point` contain a nullable `name` and an `elevation` in metres. Values below sea level are negative. Missing or null values stay unknown, and zero stays zero.
262
262
 
@@ -310,7 +310,7 @@ Invalid input returns `valid: false` with unknown provider fields. A checksum-va
310
310
 
311
311
  The default pooled lookup includes provider identity, specialty and practice contact where held. Paid `deep` adds `deactivated_at`, `medicare`, `opt_out` and `enrollments` from stored source files, with no separate check meter or live verification. `enrollments: null` means unavailable; `[]` means no enrollment rows are returned. The API omits unrequested `deep` and returns `{}` when requested on Free.
312
312
 
313
- Paid Deep also returns `taxonomies` in published order, with taxonomy code, specialty label, primary flag and provider-reported license number/state, plus `enumerated_at`, `updated_at` and `reactivated_at` record dates. Reported licenses are not verified licenses. Null lists mean unavailable; empty lists mean the edition contains no entries. Core `sources` is available on every plan: NPPES, LEIE, PECOS and opt-out each have nullable edition metadata (`edition`, `published_at`, `through`, `imported_at`). Provider record dates are separate from source publication and completed import dates. Older responses may omit these additions. Edition details remain null until a verified source is served.
313
+ Paid Deep also returns `taxonomies` in published order, with taxonomy code, specialty label, primary flag and provider-reported license number/state, plus `enumerated_at`, `updated_at` and `reactivated_at` record dates. Reported licenses are not verified licenses. Null lists mean unavailable; empty lists mean the edition contains no entries. Provider record dates describe the provider record. Unknown dates stay null.
314
314
 
315
315
  ## Deep
316
316
 
@@ -463,3 +463,71 @@ A device's emoji font remains the ordinary display.
463
463
 
464
464
  These additions are a local release candidate until the matching SDK and
465
465
  backend are published. Existing lookup and search contracts are preserved.
466
+
467
+
468
+ ## City scope and reviewed details
469
+
470
+ ```python
471
+ city = parse.city("Sakai", country="JP", state="27", grain="municipality",
472
+ aliases=True, ambiguity="error", hierarchy=True, deep=True)
473
+ ```
474
+
475
+ `type` selects the recorded country-specific place type. `grain` selects a reviewed `municipality`, `subdivision`, `locality` or `metropolitan_area`; unreviewed places do not match a grain filter. `aliases=True` enables reviewed name forms. `ambiguity="error"` rejects several eligible exact matches. Existing calls keep their defaults, and `AsyncParseAPI` accepts the same options.
476
+
477
+ `hierarchy=True` adds optional `grain` and `parent` fields using stable City IDs. A null parent means no relationship has been reviewed. Nearest lookup applies country, state, type and grain to eligible centers within 2,000 km; a nearest center does not establish boundary containment. Nearby type and grain select both the named anchor and its results.
478
+
479
+ Paid Deep can include `population_observed_on` and `population_basis` for a reviewed count at the same place layer. Download dates do not supply population observation dates. These options use current API 2.0.0; older responses can omit the new fields.
480
+
481
+ ```python
482
+ opts = dict(country="JP", min_population=100_000, sort="-population,+name",
483
+ limit=50)
484
+ first = parse.city.list(**opts)
485
+ for city in first["data"]:
486
+ print(city["id"], city.get("name"))
487
+ if first["next_cursor"]:
488
+ next_page = parse.city.list(**opts, cursor=first["next_cursor"])
489
+ parse.city.nearby_coordinates(48.2082, 16.3738, radius=40, unit="km")
490
+ parse.city.search("sa", page=True, timezone="Asia/Tokyo", bbox="130,30,145,45")
491
+ ```
492
+
493
+ Collections support inclusive `min_population`/`max_population`, `min_elevation`/`max_elevation`, `countries`, `exclude_countries`, `timezones`, exact `timezone` and center-coordinate `bbox` (`west,south,east,north`; west greater than east crosses the dateline). Unknown populations do not match a population range. Browse sorts by name or population; search also supports relevance; nearby also supports distance. `order` accepts `asc` or `desc` (relevance allows only `asc`); population defaults to descending with unknown counts last. Filtering and ordering use the same count as paid Deep.
494
+
495
+ `lang="de"` displays Vienna as Wien; `lang="ja"` supports 1,912 reviewed Japanese native names, and `lang="zh-Hant"` supports 377 reviewed Traditional Chinese names in Taiwan. Approved translations take precedence; missing or unsupported labels keep the source name. IDs and `name_local` stay unchanged. Name sorting uses the stored primary name, regardless of display language. Coordinate nearby defaults to 40 km, or 25 mi with `unit="mi"`, and caps the radius at 800 km or 500 mi.
496
+
497
+ `city.list` and `city.nearby_coordinates` return `{ "object": "list", "data": [...], "next_cursor": ... }`. Each item retains `id` and `object: "city"`. Existing lookup, search, nearest and named-nearby calls keep their classic responses. Add `format="list"` to search or named nearby for a canonical collection, or `format="resource"` to lookup, ID lookup or nearest for a canonical resource. Classic search and named nearby include `next_cursor` with `page=True` or `cursor`; old responses may omit it. Keep the original options, including `limit`, when continuing. An invalid cursor or changed query/order returns 400; restart without the cursor. Pages are not a historical snapshot. Named nearby applies population, timezone and bbox to results, while country/state select its anchor. Async methods accept the same arguments.
498
+
499
+ `city.children(id)`, `city.ancestors(id)` and `city.siblings(id)` return canonical lists with `coverage: "partial"`. An empty list does not prove the absence of relatives. Children and siblings support page continuation. `city.distance(from_id, to_id)` returns `object: "city_distance"`, `from`, `to`, `distance` in kilometers, `distance_mi` in miles and `method: "great_circle"`. It compares stored centers; unknown coordinates remain null and known zero remains zero. Async clients support the same calls.
500
+
501
+ Strict ambiguity returns HTTP 409. Catch `ParseAPIError` with `code == "ambiguous_city"` and read optional `error.candidates` for at most two safe City identity objects; `CityAmbiguityCandidate` is exported as a TypedDict. Choose an ID or narrow the filters for a new request. Other errors and retry behavior remain unchanged.
502
+
503
+
504
+ ## Canonical City operations
505
+
506
+ Classic lookup, search, nearest and named-nearby methods retain their default envelopes and required-field models. Browse and coordinate-nearby use canonical lists: `object`, `data` and nullable `next_cursor` (camelCase properties in Swift/Kotlin). Keep all query options unchanged when continuing a page; no client fetches pages automatically.
507
+
508
+ ```python
509
+ page = parse.city.search('Viena', format='list', match='fuzzy', max_distance=1)
510
+ ```
511
+
512
+ Select `format=resource` for one City or `format=list` for a collection. Country inclusion/exclusion sets, timezone sets, inclusive population and meter-elevation bounds, stored-center `bbox` and signed multi-key sorting are available for collections. Unknown numeric facts do not match range filters.
513
+
514
+ Search defaults to prefix matching. Exact and fuzzy matching are explicit; fuzzy accepts maximum edit distance 1 or 2 and returns `match` evidence (`type`, `source`, `value`, `language`, `edit_distance`). Review a fuzzy choice before storing its ID.
515
+
516
+ Reviewed children, ancestors and siblings use canonical lists with partial relationship coverage. Empty data does not prove there are no geographic relatives. Children/siblings accept page controls; ancestors do not. Distance reports great-circle kilometers and miles between stored centers: zero is known zero, null is unknown, and it does not imply travel time or containment.
517
+
518
+ Strict `ambiguity=error` can return HTTP 409 `ambiguous_city` with up to two safe candidate identities. The existing error constructor and unrelated error metadata are preserved; candidates are retained only for that status/code and never contain Deep. GeoJSON is available through HTTP; these typed City list methods do not return GeoJSON.
519
+
520
+
521
+
522
+ Reviewed name forms:
523
+
524
+ ```python
525
+ city = parse.city.id('city_7aj899nvwyku', format='resource', romanized=True)
526
+ ```
527
+
528
+ Coverage by country and available fields is described at https://parseapi.com/city#coverage.
529
+
530
+ `romanized=true` requests reviewed official name forms as `name_romanized` and `romanization_language` (camelCase in Swift/Kotlin). Current reviewed forms cover 20 Japanese whole-city aliases in ja-Latn. Missing or conflicting forms stay null; ASCII folding is not substituted for an official form.
531
+
532
+
533
+ Conditional `If-None-Match` reads and GeoJSON currently use HTTP directly. A matching City ETag returns 304 without a body; ordinary billing and rate limits apply. These JSON client methods do not supply conditional-cache handling.