keepset 0.18.0 → 0.20.0

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.
@@ -410,7 +410,7 @@ const CitationSchema = z.object({
410
410
  const RelativePathSchema = z.string().refine((path) => path.split("/").every((segment) => segment !== "" && segment !== "." && segment !== ".."), { message: "must be a relative path of non-empty segments with no '.' or '..'" });
411
411
  /** Which file of an archive to read: a member path, matched against a member's whole path or its trailing segments (so `net.gml` finds `net/net.gml`), or the member whose name ends with one of a list of extensions (a format can have several, such as Pajek's `.net` and `.paj`). Either must match exactly one member when the recipe runs; macOS resource-fork members (`__MACOSX/` and `._` files) never match. */
412
412
  const ArchiveMemberSchema = z.union([z.object({ path: RelativePathSchema }).strict(), z.object({ extensions: z.array(z.string().regex(/^\.[A-Za-z0-9][A-Za-z0-9.]*$/, { message: "must be a file extension such as .mtx" })).min(1) }).strict()]);
413
- /** How the downloaded bytes unpack into the one file the parser reads. */
413
+ /** How the downloaded bytes unpack into the one file the parser reads. A workbook (`xlsx`) is read as the CSV of its named sheet, with dates as ISO 8601 text, for the `csv-table` parser. */
414
414
  const ArchiveSchema = z.discriminatedUnion("kind", [
415
415
  z.object({ kind: z.literal("none") }).strict(),
416
416
  z.object({ kind: z.literal("gzip") }).strict(),
@@ -425,6 +425,10 @@ const ArchiveSchema = z.discriminatedUnion("kind", [
425
425
  z.object({
426
426
  kind: z.literal("tar.gz"),
427
427
  member: ArchiveMemberSchema
428
+ }).strict(),
429
+ z.object({
430
+ kind: z.literal("xlsx"),
431
+ sheet: z.string().min(1)
428
432
  }).strict()
429
433
  ]);
430
434
  const ColumnSchema = z.int().min(0);
@@ -485,12 +489,41 @@ const ParserSchema = z.discriminatedUnion("format", [
485
489
  }).refine((parser) => parser.columns === void 0 || new Set(parser.columns).size === parser.columns.length, {
486
490
  message: "a column may be listed once",
487
491
  path: ["columns"]
492
+ }),
493
+ z.object({
494
+ format: z.literal("geojson"),
495
+ encoding: z.literal("utf-8"),
496
+ idColumn: ColumnNameSchema.nullable(),
497
+ numericColumns: z.array(z.object({
498
+ column: ColumnNameSchema,
499
+ factor: z.number().positive()
500
+ }).strict()),
501
+ dateColumns: z.array(ColumnNameSchema),
502
+ columns: z.array(ColumnNameSchema).min(1)
503
+ }).strict().refine((parser) => new Set(parser.columns).size === parser.columns.length, {
504
+ message: "a column may be listed once",
505
+ path: ["columns"]
506
+ }).refine((parser) => parser.idColumn === null || !parser.columns.includes(parser.idColumn), {
507
+ message: "the id column is the row's id, so it is not listed among the columns",
508
+ path: ["columns"]
509
+ }).refine((parser) => parser.numericColumns.every((numeric) => parser.columns.includes(numeric.column)) && parser.dateColumns.every((date) => parser.columns.includes(date)), {
510
+ message: "a numeric or date column must be among the columns kept",
511
+ path: ["columns"]
512
+ }).refine((parser) => (/* @__PURE__ */ new Set([...parser.numericColumns.map((numeric) => numeric.column), ...parser.dateColumns])).size === parser.numericColumns.length + parser.dateColumns.length, {
513
+ message: "a column may be numeric or a date, not both, and once",
514
+ path: ["dateColumns"]
488
515
  })
489
516
  ]);
517
+ /** Where a source is a paged query and not one file: an ArcGIS feature layer, whose query endpoint returns a limited number of features per request. The source URL is the layer's, the download reads every page in `orderBy` order and the parser reads the one GeoJSON collection they make. */
518
+ const PagingSchema = z.discriminatedUnion("kind", [z.object({
519
+ kind: z.literal("arcgis-query"),
520
+ orderBy: z.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/, { message: "must be a field name of the layer" })
521
+ }).strict()]);
490
522
  /** How to obtain the dataset: a fetchable recipe naming the source (by index into `sources`), the archive layout and the parser, or a statement that no declarative recipe exists yet and why. */
491
523
  const RecipeSchema = z.discriminatedUnion("status", [z.object({
492
524
  status: z.literal("fetchable"),
493
525
  source: z.int().min(0),
526
+ paging: PagingSchema.optional(),
494
527
  archive: ArchiveSchema,
495
528
  parser: ParserSchema
496
529
  }).strict(), z.object({
@@ -860,7 +893,7 @@ var catalogue_default = {
860
893
  "id": "keepset",
861
894
  "name": "keepset",
862
895
  "description": "The keepset catalogue: datasets with machine-readable recipes that fetch each one and normalise it into its category's target shape.",
863
- "version": "1.6.0",
896
+ "version": "1.8.0",
864
897
  "repository": "https://github.com/Mearman/keepset",
865
898
  "namespaceAliases": {
866
899
  "networkrepository": ["nr"],
@@ -1805,17 +1838,99 @@ var catalogue_default = {
1805
1838
  "retrieved": "2026-10-19",
1806
1839
  "status": "live"
1807
1840
  }, {
1808
- "url": "https://utility.arcgis.com/usrsvcs/servers/53520af18235499d9ecd9c96f624eeae/rest/services/AM/Leak_Repairs_Live/FeatureServer/0/query?where=1%3D1&outFields=*&returnGeometry=false&f=json",
1841
+ "url": "https://utility.arcgis.com/usrsvcs/servers/53520af18235499d9ecd9c96f624eeae/rest/services/AM/Leak_Repairs_Live/FeatureServer/0",
1809
1842
  "retrieved": "2026-10-19",
1810
1843
  "status": "live"
1811
1844
  }],
1812
1845
  "licence": { "kind": "unrecorded" },
1813
1846
  "citations": [],
1814
1847
  "recipe": {
1815
- "status": "not-fetchable",
1816
- "reason": "The source is an ArcGIS feature service that returns Esri JSON in pages of at most 2000 features, and keepset has no ArcGIS JSON parser or paging yet."
1848
+ "status": "fetchable",
1849
+ "source": 1,
1850
+ "paging": {
1851
+ "kind": "arcgis-query",
1852
+ "orderBy": "OBJECTID"
1853
+ },
1854
+ "archive": { "kind": "none" },
1855
+ "parser": {
1856
+ "format": "geojson",
1857
+ "encoding": "utf-8",
1858
+ "idColumn": "OBJECTID",
1859
+ "numericColumns": [{
1860
+ "column": "geometry_latitude",
1861
+ "factor": 1
1862
+ }, {
1863
+ "column": "geometry_longitude",
1864
+ "factor": 1
1865
+ }],
1866
+ "dateColumns": [
1867
+ "StartDateActual",
1868
+ "StopDateActual",
1869
+ "StopDateEstimated"
1870
+ ],
1871
+ "columns": [
1872
+ "StopDateActual",
1873
+ "StopDateEstimated",
1874
+ "geometry_latitude",
1875
+ "geometry_longitude",
1876
+ "StartDateActual",
1877
+ "Activity",
1878
+ "Status"
1879
+ ]
1880
+ }
1881
+ },
1882
+ "crosswalk": {
1883
+ "source": "geojson",
1884
+ "target": "or/v1",
1885
+ "rules": [
1886
+ {
1887
+ "op": "move",
1888
+ "from": "meta",
1889
+ "to": "meta"
1890
+ },
1891
+ {
1892
+ "op": "move",
1893
+ "from": "nodes[].id",
1894
+ "to": "nodes[].id"
1895
+ },
1896
+ {
1897
+ "op": "move",
1898
+ "from": "nodes[].StopDateActual",
1899
+ "to": "nodes[].closed"
1900
+ },
1901
+ {
1902
+ "op": "move",
1903
+ "from": "nodes[].StopDateEstimated",
1904
+ "to": "nodes[].deadline"
1905
+ },
1906
+ {
1907
+ "op": "move",
1908
+ "from": "nodes[].geometry_latitude",
1909
+ "to": "nodes[].lat"
1910
+ },
1911
+ {
1912
+ "op": "move",
1913
+ "from": "nodes[].geometry_longitude",
1914
+ "to": "nodes[].lon"
1915
+ },
1916
+ {
1917
+ "op": "move",
1918
+ "from": "nodes[].StartDateActual",
1919
+ "to": "nodes[].opened"
1920
+ },
1921
+ {
1922
+ "op": "move",
1923
+ "from": "nodes[].Activity",
1924
+ "to": "nodes[].skill"
1925
+ },
1926
+ {
1927
+ "op": "move",
1928
+ "from": "nodes[].Status",
1929
+ "to": "nodes[].status"
1930
+ }
1931
+ ],
1932
+ "oneWay": []
1817
1933
  },
1818
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
1819
1934
  "expectedCounts": {},
1820
1935
  "properties": { "surveyId": "or-113" }
1821
1936
  },
@@ -3481,18 +3596,74 @@ var catalogue_default = {
3481
3596
  "url": "https://gis.ccc.govt.nz/server/rest/services/OpenData/WaterSupply/FeatureServer/3",
3482
3597
  "retrieved": "2026-10-19",
3483
3598
  "status": "live"
3484
- }, {
3485
- "url": "https://gis.ccc.govt.nz/server/rest/services/OpenData/WaterSupply/FeatureServer/3/query?where=1%3D1&outFields=*&returnGeometry=false&f=json",
3486
- "retrieved": "2026-10-19",
3487
- "status": "live"
3488
3599
  }],
3489
3600
  "licence": { "kind": "unrecorded" },
3490
3601
  "citations": [],
3491
3602
  "recipe": {
3492
- "status": "not-fetchable",
3493
- "reason": "The source is an ArcGIS feature service that returns Esri JSON in pages of at most 2000 features, and keepset has no ArcGIS JSON parser or paging yet."
3603
+ "status": "fetchable",
3604
+ "source": 0,
3605
+ "paging": {
3606
+ "kind": "arcgis-query",
3607
+ "orderBy": "WaterShutOffID"
3608
+ },
3609
+ "archive": { "kind": "none" },
3610
+ "parser": {
3611
+ "format": "geojson",
3612
+ "encoding": "utf-8",
3613
+ "idColumn": "WaterShutOffID",
3614
+ "numericColumns": [],
3615
+ "dateColumns": ["PlannedFinishTime", "CreateDate"],
3616
+ "columns": [
3617
+ "PlannedFinishTime",
3618
+ "CreateDate",
3619
+ "IsPlanned",
3620
+ "WorkStatus",
3621
+ "LocationSuburb"
3622
+ ]
3623
+ }
3624
+ },
3625
+ "crosswalk": {
3626
+ "source": "geojson",
3627
+ "target": "or/v1",
3628
+ "rules": [
3629
+ {
3630
+ "op": "move",
3631
+ "from": "meta",
3632
+ "to": "meta"
3633
+ },
3634
+ {
3635
+ "op": "move",
3636
+ "from": "nodes[].id",
3637
+ "to": "nodes[].id"
3638
+ },
3639
+ {
3640
+ "op": "move",
3641
+ "from": "nodes[].PlannedFinishTime",
3642
+ "to": "nodes[].deadline"
3643
+ },
3644
+ {
3645
+ "op": "move",
3646
+ "from": "nodes[].CreateDate",
3647
+ "to": "nodes[].opened"
3648
+ },
3649
+ {
3650
+ "op": "move",
3651
+ "from": "nodes[].IsPlanned",
3652
+ "to": "nodes[].skill"
3653
+ },
3654
+ {
3655
+ "op": "move",
3656
+ "from": "nodes[].WorkStatus",
3657
+ "to": "nodes[].status"
3658
+ },
3659
+ {
3660
+ "op": "move",
3661
+ "from": "nodes[].LocationSuburb",
3662
+ "to": "nodes[].territory"
3663
+ }
3664
+ ],
3665
+ "oneWay": []
3494
3666
  },
3495
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
3496
3667
  "expectedCounts": {},
3497
3668
  "properties": { "surveyId": "or-114" }
3498
3669
  },
@@ -4583,6 +4754,10 @@ var catalogue_default = {
4583
4754
  "url": "https://hub.arcgis.com/datasets/297fcd81118a4d5cbf2fd07ebdee628c",
4584
4755
  "retrieved": "2026-10-19",
4585
4756
  "status": "live"
4757
+ }, {
4758
+ "url": "https://gis2.co.dakota.mn.us/arcgis/rest/services/DCGIS_OL_PropertyInformation/MapServer/80",
4759
+ "retrieved": "2026-10-19",
4760
+ "status": "live"
4586
4761
  }],
4587
4762
  "licence": {
4588
4763
  "kind": "custom",
@@ -4591,10 +4766,83 @@ var catalogue_default = {
4591
4766
  },
4592
4767
  "citations": [],
4593
4768
  "recipe": {
4594
- "status": "not-fetchable",
4595
- "reason": "The source is an ArcGIS map service that returns GeoJSON and keepset has no GeoJSON parser yet."
4769
+ "status": "fetchable",
4770
+ "source": 1,
4771
+ "paging": {
4772
+ "kind": "arcgis-query",
4773
+ "orderBy": "OBJECTID"
4774
+ },
4775
+ "archive": { "kind": "none" },
4776
+ "parser": {
4777
+ "format": "geojson",
4778
+ "encoding": "utf-8",
4779
+ "idColumn": "OBJECTID",
4780
+ "numericColumns": [
4781
+ {
4782
+ "column": "geometry_latitude",
4783
+ "factor": 1
4784
+ },
4785
+ {
4786
+ "column": "geometry_longitude",
4787
+ "factor": 1
4788
+ },
4789
+ {
4790
+ "column": "SaleAmount",
4791
+ "factor": 1
4792
+ }
4793
+ ],
4794
+ "dateColumns": ["SaleDate"],
4795
+ "columns": [
4796
+ "SaleDate",
4797
+ "geometry_latitude",
4798
+ "geometry_longitude",
4799
+ "SaleAmount",
4800
+ "CITYNAME"
4801
+ ]
4802
+ }
4803
+ },
4804
+ "crosswalk": {
4805
+ "source": "geojson",
4806
+ "target": "or/v1",
4807
+ "rules": [
4808
+ {
4809
+ "op": "move",
4810
+ "from": "meta",
4811
+ "to": "meta"
4812
+ },
4813
+ {
4814
+ "op": "move",
4815
+ "from": "nodes[].id",
4816
+ "to": "nodes[].id"
4817
+ },
4818
+ {
4819
+ "op": "move",
4820
+ "from": "nodes[].SaleDate",
4821
+ "to": "nodes[].deadline"
4822
+ },
4823
+ {
4824
+ "op": "move",
4825
+ "from": "nodes[].geometry_latitude",
4826
+ "to": "nodes[].lat"
4827
+ },
4828
+ {
4829
+ "op": "move",
4830
+ "from": "nodes[].geometry_longitude",
4831
+ "to": "nodes[].lon"
4832
+ },
4833
+ {
4834
+ "op": "move",
4835
+ "from": "nodes[].SaleAmount",
4836
+ "to": "nodes[].prize"
4837
+ },
4838
+ {
4839
+ "op": "move",
4840
+ "from": "nodes[].CITYNAME",
4841
+ "to": "nodes[].territory"
4842
+ }
4843
+ ],
4844
+ "oneWay": []
4596
4845
  },
4597
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
4598
4846
  "expectedCounts": {},
4599
4847
  "properties": { "surveyId": "or-46" }
4600
4848
  },
@@ -4947,6 +5195,10 @@ var catalogue_default = {
4947
5195
  "url": "https://environment.data.gov.uk/dataset/9c7728fc-68e2-46e1-addb-63790b6b5313",
4948
5196
  "retrieved": "2026-10-19",
4949
5197
  "status": "live"
5198
+ }, {
5199
+ "url": "https://environment.data.gov.uk/api/file/download?fileDataSetId=e06036f5-7f41-46a3-93ff-fbd0fa1a83cc&fileName=Environment_Agency_Prosecutions.xlsx",
5200
+ "retrieved": "2026-10-19",
5201
+ "status": "live"
4950
5202
  }],
4951
5203
  "licence": {
4952
5204
  "kind": "spdx",
@@ -4954,10 +5206,73 @@ var catalogue_default = {
4954
5206
  },
4955
5207
  "citations": [],
4956
5208
  "recipe": {
4957
- "status": "not-fetchable",
4958
- "reason": "The download is an xlsx workbook with an explanation sheet and a data sheet, and keepset has no spreadsheet parser yet."
5209
+ "status": "fetchable",
5210
+ "source": 1,
5211
+ "archive": {
5212
+ "kind": "xlsx",
5213
+ "sheet": "Environment Agency Prosecutions"
5214
+ },
5215
+ "parser": {
5216
+ "format": "csv-table",
5217
+ "encoding": "utf-8",
5218
+ "delimiter": "comma",
5219
+ "skipLines": 0,
5220
+ "idColumn": null,
5221
+ "numericColumns": [{
5222
+ "column": "Fine",
5223
+ "factor": 1
5224
+ }],
5225
+ "columns": [
5226
+ "Date_of_Action",
5227
+ "Fine",
5228
+ "Incident_Type",
5229
+ "Verdict",
5230
+ "Incident_Area"
5231
+ ]
5232
+ }
5233
+ },
5234
+ "crosswalk": {
5235
+ "source": "csv-table",
5236
+ "target": "or/v1",
5237
+ "rules": [
5238
+ {
5239
+ "op": "move",
5240
+ "from": "meta",
5241
+ "to": "meta"
5242
+ },
5243
+ {
5244
+ "op": "move",
5245
+ "from": "nodes[].id",
5246
+ "to": "nodes[].id"
5247
+ },
5248
+ {
5249
+ "op": "move",
5250
+ "from": "nodes[].Date_of_Action",
5251
+ "to": "nodes[].closed"
5252
+ },
5253
+ {
5254
+ "op": "move",
5255
+ "from": "nodes[].Fine",
5256
+ "to": "nodes[].prize"
5257
+ },
5258
+ {
5259
+ "op": "move",
5260
+ "from": "nodes[].Incident_Type",
5261
+ "to": "nodes[].skill"
5262
+ },
5263
+ {
5264
+ "op": "move",
5265
+ "from": "nodes[].Verdict",
5266
+ "to": "nodes[].status"
5267
+ },
5268
+ {
5269
+ "op": "move",
5270
+ "from": "nodes[].Incident_Area",
5271
+ "to": "nodes[].territory"
5272
+ }
5273
+ ],
5274
+ "oneWay": []
4959
5275
  },
4960
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
4961
5276
  "expectedCounts": {},
4962
5277
  "properties": { "surveyId": "or-50" }
4963
5278
  },
@@ -5201,10 +5516,61 @@ var catalogue_default = {
5201
5516
  "licence": { "kind": "unrecorded" },
5202
5517
  "citations": [],
5203
5518
  "recipe": {
5204
- "status": "not-fetchable",
5205
- "reason": "The source is an ArcGIS feature service that returns GeoJSON in pages of a limited number of features and keepset has no GeoJSON parser or paging yet."
5519
+ "status": "fetchable",
5520
+ "source": 0,
5521
+ "paging": {
5522
+ "kind": "arcgis-query",
5523
+ "orderBy": "OBJECTID"
5524
+ },
5525
+ "archive": { "kind": "none" },
5526
+ "parser": {
5527
+ "format": "geojson",
5528
+ "encoding": "utf-8",
5529
+ "idColumn": "OBJECTID",
5530
+ "numericColumns": [{
5531
+ "column": "lien_balance",
5532
+ "factor": 1
5533
+ }],
5534
+ "dateColumns": [],
5535
+ "columns": [
5536
+ "sale_or_purchase_date",
5537
+ "lien_balance",
5538
+ "lien_type"
5539
+ ]
5540
+ }
5541
+ },
5542
+ "crosswalk": {
5543
+ "source": "geojson",
5544
+ "target": "or/v1",
5545
+ "rules": [
5546
+ {
5547
+ "op": "move",
5548
+ "from": "meta",
5549
+ "to": "meta"
5550
+ },
5551
+ {
5552
+ "op": "move",
5553
+ "from": "nodes[].id",
5554
+ "to": "nodes[].id"
5555
+ },
5556
+ {
5557
+ "op": "move",
5558
+ "from": "nodes[].sale_or_purchase_date",
5559
+ "to": "nodes[].opened"
5560
+ },
5561
+ {
5562
+ "op": "move",
5563
+ "from": "nodes[].lien_balance",
5564
+ "to": "nodes[].prize"
5565
+ },
5566
+ {
5567
+ "op": "move",
5568
+ "from": "nodes[].lien_type",
5569
+ "to": "nodes[].skill"
5570
+ }
5571
+ ],
5572
+ "oneWay": []
5206
5573
  },
5207
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
5208
5574
  "expectedCounts": {},
5209
5575
  "properties": { "surveyId": "or-44" }
5210
5576
  },
@@ -5226,17 +5592,83 @@ var catalogue_default = {
5226
5592
  "retrieved": "2026-10-19",
5227
5593
  "status": "live"
5228
5594
  }, {
5229
- "url": "https://services-eu1.arcgis.com/PyGgzM45TvWtSBsM/arcgis/rest/services/DCC_Derelict_Sites_Register_Public_points_view/FeatureServer/0/query?where=1%3D1&outFields=*&f=geojson",
5595
+ "url": "https://services-eu1.arcgis.com/PyGgzM45TvWtSBsM/arcgis/rest/services/DCC_Derelict_Sites_Register_Public_points_view/FeatureServer/0",
5230
5596
  "retrieved": "2026-10-19",
5231
5597
  "status": "live"
5232
5598
  }],
5233
5599
  "licence": { "kind": "unrecorded" },
5234
5600
  "citations": [],
5235
5601
  "recipe": {
5236
- "status": "not-fetchable",
5237
- "reason": "The data is an ArcGIS feature service that returns GeoJSON, and keepset has no GeoJSON parser or paging yet."
5602
+ "status": "fetchable",
5603
+ "source": 1,
5604
+ "paging": {
5605
+ "kind": "arcgis-query",
5606
+ "orderBy": "OBJECTID"
5607
+ },
5608
+ "archive": { "kind": "none" },
5609
+ "parser": {
5610
+ "format": "geojson",
5611
+ "encoding": "utf-8",
5612
+ "idColumn": "OBJECTID",
5613
+ "numericColumns": [{
5614
+ "column": "geometry_latitude",
5615
+ "factor": 1
5616
+ }, {
5617
+ "column": "geometry_longitude",
5618
+ "factor": 1
5619
+ }],
5620
+ "dateColumns": [],
5621
+ "columns": [
5622
+ "geometry_latitude",
5623
+ "geometry_longitude",
5624
+ "date_added_to_the_derelict_sites_register",
5625
+ "derelict_site_status",
5626
+ "administrative_area_name"
5627
+ ]
5628
+ }
5629
+ },
5630
+ "crosswalk": {
5631
+ "source": "geojson",
5632
+ "target": "or/v1",
5633
+ "rules": [
5634
+ {
5635
+ "op": "move",
5636
+ "from": "meta",
5637
+ "to": "meta"
5638
+ },
5639
+ {
5640
+ "op": "move",
5641
+ "from": "nodes[].id",
5642
+ "to": "nodes[].id"
5643
+ },
5644
+ {
5645
+ "op": "move",
5646
+ "from": "nodes[].geometry_latitude",
5647
+ "to": "nodes[].lat"
5648
+ },
5649
+ {
5650
+ "op": "move",
5651
+ "from": "nodes[].geometry_longitude",
5652
+ "to": "nodes[].lon"
5653
+ },
5654
+ {
5655
+ "op": "move",
5656
+ "from": "nodes[].date_added_to_the_derelict_sites_register",
5657
+ "to": "nodes[].opened"
5658
+ },
5659
+ {
5660
+ "op": "move",
5661
+ "from": "nodes[].derelict_site_status",
5662
+ "to": "nodes[].status"
5663
+ },
5664
+ {
5665
+ "op": "move",
5666
+ "from": "nodes[].administrative_area_name",
5667
+ "to": "nodes[].territory"
5668
+ }
5669
+ ],
5670
+ "oneWay": []
5238
5671
  },
5239
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
5240
5672
  "expectedCounts": {},
5241
5673
  "properties": { "surveyId": "or-90" }
5242
5674
  },
@@ -5625,14 +6057,66 @@ var catalogue_default = {
5625
6057
  "url": "https://services1.arcgis.com/A14KNJpxNyBTu19J/arcgis/rest/services/Weed_Abatement_Parcels/FeatureServer",
5626
6058
  "retrieved": "2026-10-19",
5627
6059
  "status": "live"
6060
+ }, {
6061
+ "url": "https://services1.arcgis.com/A14KNJpxNyBTu19J/arcgis/rest/services/Weed_Abatement_Parcels/FeatureServer/0",
6062
+ "retrieved": "2026-10-19",
6063
+ "status": "live"
5628
6064
  }],
5629
6065
  "licence": { "kind": "unrecorded" },
5630
6066
  "citations": [],
5631
6067
  "recipe": {
5632
- "status": "not-fetchable",
5633
- "reason": "The data is an ArcGIS feature service that returns GeoJSON of parcel polygons in pages of at most 1000 features, and keepset has no GeoJSON parser or paging yet."
6068
+ "status": "fetchable",
6069
+ "source": 1,
6070
+ "paging": {
6071
+ "kind": "arcgis-query",
6072
+ "orderBy": "OBJECTID"
6073
+ },
6074
+ "archive": { "kind": "none" },
6075
+ "parser": {
6076
+ "format": "geojson",
6077
+ "encoding": "utf-8",
6078
+ "idColumn": "OBJECTID",
6079
+ "numericColumns": [],
6080
+ "dateColumns": [],
6081
+ "columns": [
6082
+ "TYPE",
6083
+ "STATUS",
6084
+ "CITY"
6085
+ ]
6086
+ }
6087
+ },
6088
+ "crosswalk": {
6089
+ "source": "geojson",
6090
+ "target": "or/v1",
6091
+ "rules": [
6092
+ {
6093
+ "op": "move",
6094
+ "from": "meta",
6095
+ "to": "meta"
6096
+ },
6097
+ {
6098
+ "op": "move",
6099
+ "from": "nodes[].id",
6100
+ "to": "nodes[].id"
6101
+ },
6102
+ {
6103
+ "op": "move",
6104
+ "from": "nodes[].TYPE",
6105
+ "to": "nodes[].skill"
6106
+ },
6107
+ {
6108
+ "op": "move",
6109
+ "from": "nodes[].STATUS",
6110
+ "to": "nodes[].status"
6111
+ },
6112
+ {
6113
+ "op": "move",
6114
+ "from": "nodes[].CITY",
6115
+ "to": "nodes[].territory"
6116
+ }
6117
+ ],
6118
+ "oneWay": []
5634
6119
  },
5635
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
5636
6120
  "expectedCounts": {},
5637
6121
  "properties": { "surveyId": "or-94" }
5638
6122
  },
@@ -7195,14 +7679,72 @@ var catalogue_default = {
7195
7679
  "url": "https://hub.arcgis.com/datasets/a963186c15d845bb93cce1c00022e380",
7196
7680
  "retrieved": "2026-10-19",
7197
7681
  "status": "live"
7682
+ }, {
7683
+ "url": "https://services3.arcgis.com/UYCjD74OfK5zL9b8/arcgis/rest/services/Arrears_2025/FeatureServer/0",
7684
+ "retrieved": "2026-10-19",
7685
+ "status": "live"
7198
7686
  }],
7199
7687
  "licence": { "kind": "unrecorded" },
7200
7688
  "citations": [],
7201
7689
  "recipe": {
7202
- "status": "not-fetchable",
7203
- "reason": "The source is an ArcGIS feature service that returns GeoJSON in pages of a limited number of features and keepset has no GeoJSON parser or paging yet."
7690
+ "status": "fetchable",
7691
+ "source": 1,
7692
+ "paging": {
7693
+ "kind": "arcgis-query",
7694
+ "orderBy": "FID"
7695
+ },
7696
+ "archive": { "kind": "none" },
7697
+ "parser": {
7698
+ "format": "geojson",
7699
+ "encoding": "utf-8",
7700
+ "idColumn": "FID",
7701
+ "numericColumns": [],
7702
+ "dateColumns": [],
7703
+ "columns": [
7704
+ "ArrearsC_2",
7705
+ "LeaseTypeD",
7706
+ "ArrearsSta",
7707
+ "RegionDesc"
7708
+ ]
7709
+ }
7710
+ },
7711
+ "crosswalk": {
7712
+ "source": "geojson",
7713
+ "target": "or/v1",
7714
+ "rules": [
7715
+ {
7716
+ "op": "move",
7717
+ "from": "meta",
7718
+ "to": "meta"
7719
+ },
7720
+ {
7721
+ "op": "move",
7722
+ "from": "nodes[].id",
7723
+ "to": "nodes[].id"
7724
+ },
7725
+ {
7726
+ "op": "move",
7727
+ "from": "nodes[].ArrearsC_2",
7728
+ "to": "nodes[].opened"
7729
+ },
7730
+ {
7731
+ "op": "move",
7732
+ "from": "nodes[].LeaseTypeD",
7733
+ "to": "nodes[].skill"
7734
+ },
7735
+ {
7736
+ "op": "move",
7737
+ "from": "nodes[].ArrearsSta",
7738
+ "to": "nodes[].status"
7739
+ },
7740
+ {
7741
+ "op": "move",
7742
+ "from": "nodes[].RegionDesc",
7743
+ "to": "nodes[].territory"
7744
+ }
7745
+ ],
7746
+ "oneWay": []
7204
7747
  },
7205
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
7206
7748
  "expectedCounts": {},
7207
7749
  "properties": { "surveyId": "or-41" }
7208
7750
  },
@@ -8349,14 +8891,97 @@ var catalogue_default = {
8349
8891
  "url": "https://hub.arcgis.com/datasets/1fd891c3301c4c4581b86c338468fbe4",
8350
8892
  "retrieved": "2026-10-19",
8351
8893
  "status": "live"
8894
+ }, {
8895
+ "url": "https://services1.arcgis.com/79kfd2K6fskCAkyg/arcgis/rest/services/PM_SiteVisit_Violations/FeatureServer/0",
8896
+ "retrieved": "2026-10-19",
8897
+ "status": "live"
8352
8898
  }],
8353
8899
  "licence": { "kind": "unrecorded" },
8354
8900
  "citations": [],
8355
8901
  "recipe": {
8356
- "status": "not-fetchable",
8357
- "reason": "The source is an ArcGIS feature service that returns GeoJSON in pages of a limited number of features, and keepset has no GeoJSON parser or paging yet."
8902
+ "status": "fetchable",
8903
+ "source": 1,
8904
+ "paging": {
8905
+ "kind": "arcgis-query",
8906
+ "orderBy": "ObjectId"
8907
+ },
8908
+ "archive": { "kind": "none" },
8909
+ "parser": {
8910
+ "format": "geojson",
8911
+ "encoding": "utf-8",
8912
+ "idColumn": "ObjectId",
8913
+ "numericColumns": [
8914
+ {
8915
+ "column": "geometry_latitude",
8916
+ "factor": 1
8917
+ },
8918
+ {
8919
+ "column": "geometry_longitude",
8920
+ "factor": 1
8921
+ },
8922
+ {
8923
+ "column": "CitationAmount",
8924
+ "factor": 1
8925
+ }
8926
+ ],
8927
+ "dateColumns": ["G6A_G6_COMPL_DD"],
8928
+ "columns": [
8929
+ "G6A_G6_COMPL_DD",
8930
+ "geometry_latitude",
8931
+ "geometry_longitude",
8932
+ "CitationAmount",
8933
+ "G6A_G6_STATUS",
8934
+ "CouncilDist"
8935
+ ]
8936
+ }
8937
+ },
8938
+ "crosswalk": {
8939
+ "source": "geojson",
8940
+ "target": "or/v1",
8941
+ "rules": [
8942
+ {
8943
+ "op": "move",
8944
+ "from": "meta",
8945
+ "to": "meta"
8946
+ },
8947
+ {
8948
+ "op": "move",
8949
+ "from": "nodes[].id",
8950
+ "to": "nodes[].id"
8951
+ },
8952
+ {
8953
+ "op": "move",
8954
+ "from": "nodes[].G6A_G6_COMPL_DD",
8955
+ "to": "nodes[].deadline"
8956
+ },
8957
+ {
8958
+ "op": "move",
8959
+ "from": "nodes[].geometry_latitude",
8960
+ "to": "nodes[].lat"
8961
+ },
8962
+ {
8963
+ "op": "move",
8964
+ "from": "nodes[].geometry_longitude",
8965
+ "to": "nodes[].lon"
8966
+ },
8967
+ {
8968
+ "op": "move",
8969
+ "from": "nodes[].CitationAmount",
8970
+ "to": "nodes[].prize"
8971
+ },
8972
+ {
8973
+ "op": "move",
8974
+ "from": "nodes[].G6A_G6_STATUS",
8975
+ "to": "nodes[].status"
8976
+ },
8977
+ {
8978
+ "op": "move",
8979
+ "from": "nodes[].CouncilDist",
8980
+ "to": "nodes[].territory"
8981
+ }
8982
+ ],
8983
+ "oneWay": []
8358
8984
  },
8359
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
8360
8985
  "expectedCounts": {},
8361
8986
  "properties": { "surveyId": "or-62" }
8362
8987
  },
@@ -13445,6 +14070,10 @@ var catalogue_default = {
13445
14070
  "url": "https://hub.arcgis.com/datasets/596fa66b53a948e4b74fea86dbe44690",
13446
14071
  "retrieved": "2026-10-19",
13447
14072
  "status": "live"
14073
+ }, {
14074
+ "url": "https://www.maps.north-ayrshire.gov.uk/arcgis/rest/services/AGOL/Building_Warrant_Applications_Weekly/FeatureServer/2",
14075
+ "retrieved": "2026-10-19",
14076
+ "status": "live"
13448
14077
  }],
13449
14078
  "licence": {
13450
14079
  "kind": "custom",
@@ -13453,10 +14082,82 @@ var catalogue_default = {
13453
14082
  },
13454
14083
  "citations": [],
13455
14084
  "recipe": {
13456
- "status": "not-fetchable",
13457
- "reason": "The data is an ArcGIS feature service that returns GeoJSON in pages of at most 2000 features, and keepset has no GeoJSON parser or paging yet."
14085
+ "status": "fetchable",
14086
+ "source": 1,
14087
+ "paging": {
14088
+ "kind": "arcgis-query",
14089
+ "orderBy": "OBJECTID"
14090
+ },
14091
+ "archive": { "kind": "none" },
14092
+ "parser": {
14093
+ "format": "geojson",
14094
+ "encoding": "utf-8",
14095
+ "idColumn": "OBJECTID",
14096
+ "numericColumns": [{
14097
+ "column": "geometry_latitude",
14098
+ "factor": 1
14099
+ }, {
14100
+ "column": "geometry_longitude",
14101
+ "factor": 1
14102
+ }],
14103
+ "dateColumns": ["RECPTD", "DECIDD"],
14104
+ "columns": [
14105
+ "DECIDD",
14106
+ "geometry_latitude",
14107
+ "geometry_longitude",
14108
+ "RECPTD",
14109
+ "APPTYP",
14110
+ "DECISION"
14111
+ ]
14112
+ }
14113
+ },
14114
+ "crosswalk": {
14115
+ "source": "geojson",
14116
+ "target": "or/v1",
14117
+ "rules": [
14118
+ {
14119
+ "op": "move",
14120
+ "from": "meta",
14121
+ "to": "meta"
14122
+ },
14123
+ {
14124
+ "op": "move",
14125
+ "from": "nodes[].id",
14126
+ "to": "nodes[].id"
14127
+ },
14128
+ {
14129
+ "op": "move",
14130
+ "from": "nodes[].DECIDD",
14131
+ "to": "nodes[].closed"
14132
+ },
14133
+ {
14134
+ "op": "move",
14135
+ "from": "nodes[].geometry_latitude",
14136
+ "to": "nodes[].lat"
14137
+ },
14138
+ {
14139
+ "op": "move",
14140
+ "from": "nodes[].geometry_longitude",
14141
+ "to": "nodes[].lon"
14142
+ },
14143
+ {
14144
+ "op": "move",
14145
+ "from": "nodes[].RECPTD",
14146
+ "to": "nodes[].opened"
14147
+ },
14148
+ {
14149
+ "op": "move",
14150
+ "from": "nodes[].APPTYP",
14151
+ "to": "nodes[].skill"
14152
+ },
14153
+ {
14154
+ "op": "move",
14155
+ "from": "nodes[].DECISION",
14156
+ "to": "nodes[].status"
14157
+ }
14158
+ ],
14159
+ "oneWay": []
13458
14160
  },
13459
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
13460
14161
  "expectedCounts": {},
13461
14162
  "properties": { "surveyId": "or-78" }
13462
14163
  },
@@ -15201,14 +15902,84 @@ var catalogue_default = {
15201
15902
  "url": "https://utility.arcgis.com/usrsvcs/servers/931a175b8eaa4abebf1379743e6d71c1/rest/services/Environmental_Resources/Weed_Abatement/FeatureServer",
15202
15903
  "retrieved": "2026-10-19",
15203
15904
  "status": "live"
15905
+ }, {
15906
+ "url": "https://utility.arcgis.com/usrsvcs/servers/931a175b8eaa4abebf1379743e6d71c1/rest/services/Environmental_Resources/Weed_Abatement/FeatureServer/0",
15907
+ "retrieved": "2026-10-19",
15908
+ "status": "live"
15204
15909
  }],
15205
15910
  "licence": { "kind": "unrecorded" },
15206
15911
  "citations": [],
15207
15912
  "recipe": {
15208
- "status": "not-fetchable",
15209
- "reason": "The data is an ArcGIS feature service that returns GeoJSON in pages of at most 15000 features, and keepset has no GeoJSON parser or paging yet."
15913
+ "status": "fetchable",
15914
+ "source": 1,
15915
+ "paging": {
15916
+ "kind": "arcgis-query",
15917
+ "orderBy": "OBJECTID"
15918
+ },
15919
+ "archive": { "kind": "none" },
15920
+ "parser": {
15921
+ "format": "geojson",
15922
+ "encoding": "utf-8",
15923
+ "idColumn": "OBJECTID",
15924
+ "numericColumns": [{
15925
+ "column": "geometry_latitude",
15926
+ "factor": 1
15927
+ }, {
15928
+ "column": "geometry_longitude",
15929
+ "factor": 1
15930
+ }],
15931
+ "dateColumns": ["created_date"],
15932
+ "columns": [
15933
+ "geometry_latitude",
15934
+ "geometry_longitude",
15935
+ "created_date",
15936
+ "status",
15937
+ "district"
15938
+ ]
15939
+ }
15940
+ },
15941
+ "crosswalk": {
15942
+ "source": "geojson",
15943
+ "target": "or/v1",
15944
+ "rules": [
15945
+ {
15946
+ "op": "move",
15947
+ "from": "meta",
15948
+ "to": "meta"
15949
+ },
15950
+ {
15951
+ "op": "move",
15952
+ "from": "nodes[].id",
15953
+ "to": "nodes[].id"
15954
+ },
15955
+ {
15956
+ "op": "move",
15957
+ "from": "nodes[].geometry_latitude",
15958
+ "to": "nodes[].lat"
15959
+ },
15960
+ {
15961
+ "op": "move",
15962
+ "from": "nodes[].geometry_longitude",
15963
+ "to": "nodes[].lon"
15964
+ },
15965
+ {
15966
+ "op": "move",
15967
+ "from": "nodes[].created_date",
15968
+ "to": "nodes[].opened"
15969
+ },
15970
+ {
15971
+ "op": "move",
15972
+ "from": "nodes[].status",
15973
+ "to": "nodes[].status"
15974
+ },
15975
+ {
15976
+ "op": "move",
15977
+ "from": "nodes[].district",
15978
+ "to": "nodes[].territory"
15979
+ }
15980
+ ],
15981
+ "oneWay": []
15210
15982
  },
15211
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
15212
15983
  "expectedCounts": {},
15213
15984
  "properties": { "surveyId": "or-92" }
15214
15985
  },
@@ -18798,14 +19569,84 @@ var catalogue_default = {
18798
19569
  "url": "https://services3.arcgis.com/vtilYbC3YeF6EBJ1/arcgis/rest/services/service_05f1e63ba1494703b42f0dd606859f0b/FeatureServer",
18799
19570
  "retrieved": "2026-10-19",
18800
19571
  "status": "live"
19572
+ }, {
19573
+ "url": "https://services3.arcgis.com/vtilYbC3YeF6EBJ1/arcgis/rest/services/service_05f1e63ba1494703b42f0dd606859f0b/FeatureServer/0",
19574
+ "retrieved": "2026-10-19",
19575
+ "status": "live"
18801
19576
  }],
18802
19577
  "licence": { "kind": "unrecorded" },
18803
19578
  "citations": [],
18804
19579
  "recipe": {
18805
- "status": "not-fetchable",
18806
- "reason": "The data is an ArcGIS feature service that returns GeoJSON in pages of at most 1000 features, and keepset has no GeoJSON parser or paging yet."
19580
+ "status": "fetchable",
19581
+ "source": 1,
19582
+ "paging": {
19583
+ "kind": "arcgis-query",
19584
+ "orderBy": "objectid"
19585
+ },
19586
+ "archive": { "kind": "none" },
19587
+ "parser": {
19588
+ "format": "geojson",
19589
+ "encoding": "utf-8",
19590
+ "idColumn": "objectid",
19591
+ "numericColumns": [{
19592
+ "column": "geometry_latitude",
19593
+ "factor": 1
19594
+ }, {
19595
+ "column": "geometry_longitude",
19596
+ "factor": 1
19597
+ }],
19598
+ "dateColumns": ["date_towed"],
19599
+ "columns": [
19600
+ "geometry_latitude",
19601
+ "geometry_longitude",
19602
+ "date_towed",
19603
+ "reason",
19604
+ "vehicle_city"
19605
+ ]
19606
+ }
19607
+ },
19608
+ "crosswalk": {
19609
+ "source": "geojson",
19610
+ "target": "or/v1",
19611
+ "rules": [
19612
+ {
19613
+ "op": "move",
19614
+ "from": "meta",
19615
+ "to": "meta"
19616
+ },
19617
+ {
19618
+ "op": "move",
19619
+ "from": "nodes[].id",
19620
+ "to": "nodes[].id"
19621
+ },
19622
+ {
19623
+ "op": "move",
19624
+ "from": "nodes[].geometry_latitude",
19625
+ "to": "nodes[].lat"
19626
+ },
19627
+ {
19628
+ "op": "move",
19629
+ "from": "nodes[].geometry_longitude",
19630
+ "to": "nodes[].lon"
19631
+ },
19632
+ {
19633
+ "op": "move",
19634
+ "from": "nodes[].date_towed",
19635
+ "to": "nodes[].opened"
19636
+ },
19637
+ {
19638
+ "op": "move",
19639
+ "from": "nodes[].reason",
19640
+ "to": "nodes[].skill"
19641
+ },
19642
+ {
19643
+ "op": "move",
19644
+ "from": "nodes[].vehicle_city",
19645
+ "to": "nodes[].territory"
19646
+ }
19647
+ ],
19648
+ "oneWay": []
18807
19649
  },
18808
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
18809
19650
  "expectedCounts": {},
18810
19651
  "properties": { "surveyId": "or-96" }
18811
19652
  },
@@ -18938,14 +19779,91 @@ var catalogue_default = {
18938
19779
  "url": "https://hub.arcgis.com/datasets/b8ac65c653b343739be21cb2773faace",
18939
19780
  "retrieved": "2026-10-19",
18940
19781
  "status": "live"
19782
+ }, {
19783
+ "url": "https://services.arcgis.com/fLeGjb7u4uXqeF9q/arcgis/rest/services/REAL_ESTATE_TAX_DELINQUENCIES/FeatureServer/0",
19784
+ "retrieved": "2026-10-19",
19785
+ "status": "live"
18941
19786
  }],
18942
19787
  "licence": { "kind": "unrecorded" },
18943
19788
  "citations": [],
18944
19789
  "recipe": {
18945
- "status": "not-fetchable",
18946
- "reason": "The source is an ArcGIS feature service that returns GeoJSON in pages of a limited number of features and keepset has no GeoJSON parser or paging yet."
19790
+ "status": "fetchable",
19791
+ "source": 1,
19792
+ "paging": {
19793
+ "kind": "arcgis-query",
19794
+ "orderBy": "OBJECTID"
19795
+ },
19796
+ "archive": { "kind": "none" },
19797
+ "parser": {
19798
+ "format": "geojson",
19799
+ "encoding": "utf-8",
19800
+ "idColumn": "OBJECTID",
19801
+ "numericColumns": [
19802
+ {
19803
+ "column": "geometry_latitude",
19804
+ "factor": 1
19805
+ },
19806
+ {
19807
+ "column": "geometry_longitude",
19808
+ "factor": 1
19809
+ },
19810
+ {
19811
+ "column": "TOTAL_DUE",
19812
+ "factor": 1
19813
+ }
19814
+ ],
19815
+ "dateColumns": [],
19816
+ "columns": [
19817
+ "geometry_latitude",
19818
+ "geometry_longitude",
19819
+ "TOTAL_DUE",
19820
+ "BUILDING_CATEGORY",
19821
+ "ZIP_CODE"
19822
+ ]
19823
+ }
19824
+ },
19825
+ "crosswalk": {
19826
+ "source": "geojson",
19827
+ "target": "or/v1",
19828
+ "rules": [
19829
+ {
19830
+ "op": "move",
19831
+ "from": "meta",
19832
+ "to": "meta"
19833
+ },
19834
+ {
19835
+ "op": "move",
19836
+ "from": "nodes[].id",
19837
+ "to": "nodes[].id"
19838
+ },
19839
+ {
19840
+ "op": "move",
19841
+ "from": "nodes[].geometry_latitude",
19842
+ "to": "nodes[].lat"
19843
+ },
19844
+ {
19845
+ "op": "move",
19846
+ "from": "nodes[].geometry_longitude",
19847
+ "to": "nodes[].lon"
19848
+ },
19849
+ {
19850
+ "op": "move",
19851
+ "from": "nodes[].TOTAL_DUE",
19852
+ "to": "nodes[].prize"
19853
+ },
19854
+ {
19855
+ "op": "move",
19856
+ "from": "nodes[].BUILDING_CATEGORY",
19857
+ "to": "nodes[].skill"
19858
+ },
19859
+ {
19860
+ "op": "move",
19861
+ "from": "nodes[].ZIP_CODE",
19862
+ "to": "nodes[].territory"
19863
+ }
19864
+ ],
19865
+ "oneWay": []
18947
19866
  },
18948
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
18949
19867
  "expectedCounts": {},
18950
19868
  "properties": { "surveyId": "or-40" }
18951
19869
  },
@@ -52253,14 +53171,78 @@ var catalogue_default = {
52253
53171
  "url": "https://services3.arcgis.com/IgR6ay8jzuIj7VSF/arcgis/rest/services/Weed_Abatement_2017/FeatureServer",
52254
53172
  "retrieved": "2026-10-19",
52255
53173
  "status": "live"
53174
+ }, {
53175
+ "url": "https://services3.arcgis.com/IgR6ay8jzuIj7VSF/arcgis/rest/services/Weed_Abatement_2017/FeatureServer/0",
53176
+ "retrieved": "2026-10-19",
53177
+ "status": "live"
52256
53178
  }],
52257
53179
  "licence": { "kind": "unrecorded" },
52258
53180
  "citations": [],
52259
53181
  "recipe": {
52260
- "status": "not-fetchable",
52261
- "reason": "The data is an ArcGIS feature service that returns GeoJSON in pages of at most 1000 features, and keepset has no GeoJSON parser or paging yet."
53182
+ "status": "fetchable",
53183
+ "source": 1,
53184
+ "paging": {
53185
+ "kind": "arcgis-query",
53186
+ "orderBy": "OBJECTID"
53187
+ },
53188
+ "archive": { "kind": "none" },
53189
+ "parser": {
53190
+ "format": "geojson",
53191
+ "encoding": "utf-8",
53192
+ "idColumn": "OBJECTID",
53193
+ "numericColumns": [{
53194
+ "column": "geometry_latitude",
53195
+ "factor": 1
53196
+ }, {
53197
+ "column": "geometry_longitude",
53198
+ "factor": 1
53199
+ }],
53200
+ "dateColumns": ["CreationDate"],
53201
+ "columns": [
53202
+ "geometry_latitude",
53203
+ "geometry_longitude",
53204
+ "CreationDate",
53205
+ "ABATE"
53206
+ ]
53207
+ }
53208
+ },
53209
+ "crosswalk": {
53210
+ "source": "geojson",
53211
+ "target": "or/v1",
53212
+ "rules": [
53213
+ {
53214
+ "op": "move",
53215
+ "from": "meta",
53216
+ "to": "meta"
53217
+ },
53218
+ {
53219
+ "op": "move",
53220
+ "from": "nodes[].id",
53221
+ "to": "nodes[].id"
53222
+ },
53223
+ {
53224
+ "op": "move",
53225
+ "from": "nodes[].geometry_latitude",
53226
+ "to": "nodes[].lat"
53227
+ },
53228
+ {
53229
+ "op": "move",
53230
+ "from": "nodes[].geometry_longitude",
53231
+ "to": "nodes[].lon"
53232
+ },
53233
+ {
53234
+ "op": "move",
53235
+ "from": "nodes[].CreationDate",
53236
+ "to": "nodes[].opened"
53237
+ },
53238
+ {
53239
+ "op": "move",
53240
+ "from": "nodes[].ABATE",
53241
+ "to": "nodes[].status"
53242
+ }
53243
+ ],
53244
+ "oneWay": []
52262
53245
  },
52263
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
52264
53246
  "expectedCounts": {},
52265
53247
  "properties": { "surveyId": "or-93" }
52266
53248
  },
@@ -52671,17 +53653,77 @@ var catalogue_default = {
52671
53653
  "retrieved": "2026-10-19",
52672
53654
  "status": "live"
52673
53655
  }, {
52674
- "url": "https://services1.arcgis.com/eGSDp8lpKe5izqVc/arcgis/rest/services/2024_Sheriff_Evictions_WFL1/FeatureServer/0/query?where=1%3D1&outFields=*&f=json",
53656
+ "url": "https://services1.arcgis.com/eGSDp8lpKe5izqVc/arcgis/rest/services/2024_Sheriff_Evictions_WFL1/FeatureServer/0",
52675
53657
  "retrieved": "2026-10-19",
52676
53658
  "status": "live"
52677
53659
  }],
52678
53660
  "licence": { "kind": "unrecorded" },
52679
53661
  "citations": [],
52680
53662
  "recipe": {
52681
- "status": "not-fetchable",
52682
- "reason": "The source is an ArcGIS feature service that returns Esri JSON in pages of at most 2000 features, and keepset has no ArcGIS JSON parser or paging yet."
53663
+ "status": "fetchable",
53664
+ "source": 1,
53665
+ "paging": {
53666
+ "kind": "arcgis-query",
53667
+ "orderBy": "OBJECTID"
53668
+ },
53669
+ "archive": { "kind": "none" },
53670
+ "parser": {
53671
+ "format": "geojson",
53672
+ "encoding": "utf-8",
53673
+ "idColumn": "OBJECTID",
53674
+ "numericColumns": [{
53675
+ "column": "geometry_latitude",
53676
+ "factor": 1
53677
+ }, {
53678
+ "column": "geometry_longitude",
53679
+ "factor": 1
53680
+ }],
53681
+ "dateColumns": [],
53682
+ "columns": [
53683
+ "geometry_latitude",
53684
+ "geometry_longitude",
53685
+ "Date",
53686
+ "Status_1"
53687
+ ]
53688
+ }
53689
+ },
53690
+ "crosswalk": {
53691
+ "source": "geojson",
53692
+ "target": "or/v1",
53693
+ "rules": [
53694
+ {
53695
+ "op": "move",
53696
+ "from": "meta",
53697
+ "to": "meta"
53698
+ },
53699
+ {
53700
+ "op": "move",
53701
+ "from": "nodes[].id",
53702
+ "to": "nodes[].id"
53703
+ },
53704
+ {
53705
+ "op": "move",
53706
+ "from": "nodes[].geometry_latitude",
53707
+ "to": "nodes[].lat"
53708
+ },
53709
+ {
53710
+ "op": "move",
53711
+ "from": "nodes[].geometry_longitude",
53712
+ "to": "nodes[].lon"
53713
+ },
53714
+ {
53715
+ "op": "move",
53716
+ "from": "nodes[].Date",
53717
+ "to": "nodes[].opened"
53718
+ },
53719
+ {
53720
+ "op": "move",
53721
+ "from": "nodes[].Status_1",
53722
+ "to": "nodes[].status"
53723
+ }
53724
+ ],
53725
+ "oneWay": []
52683
53726
  },
52684
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
52685
53727
  "expectedCounts": {},
52686
53728
  "properties": { "surveyId": "or-103" }
52687
53729
  },
@@ -53968,6 +55010,10 @@ var catalogue_default = {
53968
55010
  "url": "https://hub.arcgis.com/datasets/1b2d03addfaa41bb83c17f9237e1504c",
53969
55011
  "retrieved": "2026-10-19",
53970
55012
  "status": "live"
55013
+ }, {
55014
+ "url": "https://services2.arcgis.com/CyVvlIiUfRBmMQuu/arcgis/rest/services/Delinquent_Real_Estate_Taxes_view/FeatureServer/0",
55015
+ "retrieved": "2026-10-19",
55016
+ "status": "live"
53971
55017
  }],
53972
55018
  "licence": {
53973
55019
  "kind": "custom",
@@ -53976,10 +55022,52 @@ var catalogue_default = {
53976
55022
  },
53977
55023
  "citations": [],
53978
55024
  "recipe": {
53979
- "status": "not-fetchable",
53980
- "reason": "The source is an ArcGIS feature service that returns GeoJSON in pages of a limited number of features and keepset has no GeoJSON parser or paging yet."
55025
+ "status": "fetchable",
55026
+ "source": 1,
55027
+ "paging": {
55028
+ "kind": "arcgis-query",
55029
+ "orderBy": "OBJECTID"
55030
+ },
55031
+ "archive": { "kind": "none" },
55032
+ "parser": {
55033
+ "format": "geojson",
55034
+ "encoding": "utf-8",
55035
+ "idColumn": "OBJECTID",
55036
+ "numericColumns": [{
55037
+ "column": "Total_Delinquent_Amount_Due",
55038
+ "factor": 1
55039
+ }],
55040
+ "dateColumns": [],
55041
+ "columns": ["Total_Delinquent_Amount_Due", "District"]
55042
+ }
55043
+ },
55044
+ "crosswalk": {
55045
+ "source": "geojson",
55046
+ "target": "or/v1",
55047
+ "rules": [
55048
+ {
55049
+ "op": "move",
55050
+ "from": "meta",
55051
+ "to": "meta"
55052
+ },
55053
+ {
55054
+ "op": "move",
55055
+ "from": "nodes[].id",
55056
+ "to": "nodes[].id"
55057
+ },
55058
+ {
55059
+ "op": "move",
55060
+ "from": "nodes[].Total_Delinquent_Amount_Due",
55061
+ "to": "nodes[].prize"
55062
+ },
55063
+ {
55064
+ "op": "move",
55065
+ "from": "nodes[].District",
55066
+ "to": "nodes[].territory"
55067
+ }
55068
+ ],
55069
+ "oneWay": []
53981
55070
  },
53982
- "crosswalk": { "file": "crosswalks/or-v1/nodes.json" },
53983
55071
  "expectedCounts": {},
53984
55072
  "properties": { "surveyId": "or-47" }
53985
55073
  },