{"api":"v1","generated_at":"2026-09-15T22:51:05.483Z","licence":{"name":"CC BY 4.0","url":"https://creativecommons.org/licenses/by/4.0/","attribution":"TOLL, with a link to the page cited"},"page":"https://tollindex.com/e/api-geoprimitives-dev-v1-transform-5d8c29","pinned_page":"https://tollindex.com/e/api-geoprimitives-dev-v1-transform-5d8c29/at/2026-09-15T21-20Z","pinned":false,"method":"https://tollindex.com/ledger/method","snapshot_at":"2026-09-15T21:20:12.737Z","snapshot_stamp":"2026-09-15T21-20Z","endpoint":{"slug":"api-geoprimitives-dev-v1-transform-5d8c29","canonical_url":"https://api.geoprimitives.dev/v1/transform","resource":"https://api.geoprimitives.dev/v1/transform","http_method":"POST","type":"http","x402_version":2,"registries":["cdp"],"primary_registry":"cdp","curated_by_coinbase":false,"description":"Reproject coordinates between EPSG coordinate reference systems, with the datum shift applied. Accepts a bare position, an array of positions at any nesting depth, or a GeoJSON Feature, FeatureCollection or Geometry, and answers in whichever shape it was given, preserving properties, ids and foreign members. Covers 1380 codes: WGS 84, ITRF2020, NAD27 and every NAD83 realization as geographic, Web Mercator, all 120 WGS 84 UTM zones north and south, the NAD27 and NAD83 UTM zones, and the NAD27 and NAD83 State Plane and low-distortion zones, Oregon and Alaska included. Reach for it before calling /v1/geometry, /v1/h3/index, /v1/h3/polyfill or /v1/pip, which take EPSG:4326 only and refuse anything outside -180..180 and -90..90. One price per call whatever the payload: 10000 positions cost exactly what one position costs, so batch rather than sending a position at a time. Horizontal only: elevations pass through untouched. Datum shifts, and read this before buying: two mechanisms run between the two sides and the response names every step. Between NAD27 and the NAD83 realizations (NAD83, HARN, NSRS2007, 2011, PA11) the NOAA NGS NADCON 5.0 grids are applied, 2016-09-01 release, public domain, biquadratic interpolation as NGS specifies, covering the conterminous United States, Alaska, Hawaii and Puerto Rico with the US Virgin Islands; a position outside that coverage is refused with outside_datum_grid rather than answered without the shift. Between WGS 84 and NAD83(2011) or NAD83(PA11) the EPSG time-dependent Helmert transformations 10334 and 10336 are applied with WGS 84 read as ITRF2020, which the current WGS 84 (G2296) realizes to a few centimetres. That transformation depends on when the coordinates were observed, because the North American plate moves about 2 cm a year against ITRF2020: send \"epoch\" as a decimal year (2024.5) to say when, or it is evaluated at 2010.0, the NAD83(2011) reference epoch, and the response says which. Every response carries datumShiftApplied and a datumShift object listing the grids or Helmert that ran, the region, the epoch and the data provenance; when both sides share a datum it says so and applies nothing. Accuracy was measured against PROJ 9.5.1 running the same grids and the same EPSG operations: the projection arithmetic agrees to under 1e-8 m and the shifted result to under 1e-6 m, so the 1.29 m gap this route carried before the grids is closed to the limit of the source data, which NGS states as a few centimetres for the realization grids and decimetres for NAD27. If a grid cannot be read the request is answered 503 and not charged; it is never answered without the shift. A position that lands outside the target projection's valid domain is rejected with its index, never returned as a null or infinite coordinate. Limits: 10000 positions per call across the whole request, 512 datum-grid tiles per call (about one degree square per grid step; a state-sized batch is well under), and a 1 MiB request body.","service_name":"geoprimitives","declared_category":null,"declared_tags":["transform","reprojection","datum","nadcon5","epsg"],"route_template":null,"registry_updated":"2026-08-21T17:26:12.678Z"},"derived":{"note":"fields no registry supplies; TOLL derives them and marks them derived on the page","title":"transform","category":"market-data","first_observed_by_toll":"2026-09-10T19:08:24.178Z","last_observed_by_toll":"2026-09-15T21:20:12.737Z","observation_began":"2026-09-10"},"presence":{"listed_now":true,"first_absent_at":null,"delisting_confirmed_at":null,"events":[{"registry":"cdp","at":"2026-09-10T19:08:24.178Z","event":"listed"}]},"accepts":[{"registry":"cdp","ordinal":0,"network":"eip155:8453","asset":"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913","asset_name":"USD Coin","symbol":"USDC","decimals":6,"amount_display":"0.005 USDC","amount_units":0.005,"decimals_known":true,"pay_to":"0x76A51b5Dd3729950B3b60c17f19252d221968FCe","scheme":"exact"}],"counters":{"observed_at":"2026-09-15T21:20:12.737Z","calls_30d":1,"unique_payers_30d":1,"last_called_at":"2026-08-21T17:26:12.573Z"},"validation":{"latest":{"observed_at":"2026-09-15T04:52:51.779Z","state":"pass","failed_checks":[],"endpoint_http_status":402,"run_id":"daily-2026-09-15"},"uptime":[{"days":7,"observed":5,"passed":5,"ratio":1},{"days":30,"observed":5,"passed":5,"ratio":1},{"days":90,"observed":5,"passed":5,"ratio":1}],"history_90d":[{"observed_at":"2026-09-15T04:52:51.779Z","state":"pass","failed_checks":[],"run_id":"daily-2026-09-15","state_changed":false},{"observed_at":"2026-09-14T04:48:00.806Z","state":"pass","failed_checks":[],"run_id":"daily-2026-09-14","state_changed":false},{"observed_at":"2026-09-13T04:45:26.435Z","state":"pass","failed_checks":[],"run_id":"daily-2026-09-13","state_changed":false},{"observed_at":"2026-09-12T07:02:30.618Z","state":"pass","failed_checks":[],"run_id":"daily-2026-09-12","state_changed":false},{"observed_at":"2026-09-11T10:40:08.702Z","state":"pass","failed_checks":[],"run_id":"daily-2026-09-11","state_changed":true}]},"seller":{"wallet":"0x76A51b5Dd3729950B3b60c17f19252d221968FCe","page":"https://tollindex.com/seller/0x76A51b5Dd3729950B3b60c17f19252d221968FCe","endpoints":21,"hosts":1},"reports":0,"registry_record":{"cdp":[{"tags":["transform","reprojection","datum","nadcon5","epsg"],"type":"http","accepts":[{"asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","extra":{"name":"USD Coin","version":"2"},"payTo":"0x76A51b5Dd3729950B3b60c17f19252d221968FCe","amount":"5000","scheme":"exact","network":"eip155:8453","maxTimeoutSeconds":300}],"quality":{"lastCalledAt":"2026-08-21T17:26:12.573Z","l30DaysTotalCalls":1,"l30DaysUniquePayers":1},"resource":"https://api.geoprimitives.dev/v1/transform","extensions":{"bazaar":{"info":{"input":{"body":{"to":"EPSG:3645","from":"EPSG:4326","coordinates":[[-122.6765,45.5231],[-123.0351,44.9429]]},"type":"http","method":"POST","bodyType":"json"},"output":{"type":"json","example":{"to":{"id":"EPSG:3645","code":3645,"name":"NAD83(NSRS2007) / Oregon North","unit":"m","datum":"NAD83(NSRS2007)","ellipsoid":"GRS80"},"from":{"id":"EPSG:4326","code":4326,"name":"WGS 84","unit":"degree","datum":"WGS 84","ellipsoid":"WGS84"},"count":2,"notes":["WGS 84 was treated as ITRF2020, which the current realization WGS 84 (G2296) agrees with to a few centimetres. EPSG:4326 is an ensemble whose older realizations differ by up to about a metre; send EPSG:9990 to say ITRF2020 explicitly.","The time-dependent Helmert was evaluated at epoch 2010, the NAD83(2011) reference epoch, because no \"epoch\" was sent. The North American plate moves about 2 cm a year relative to ITRF2020, so coordinates observed at another epoch want that epoch here.","Output coordinates are in m."],"datumShift":{"to":"NAD83(NSRS2007)","from":"WGS 84","epoch":2010,"grids":{"url":"https://geodesy.noaa.gov/pub/nadcon5/20160901release/","source":"NOAA National Geodetic Survey, NADCON 5.0","licence":"Public domain (US government work, 17 U.S.C. 105)","release":"20160901","interpolation":"biquadratic"},"paths":[{"steps":[{"to":"NAD83(2011)","from":"WGS 84","name":"ITRF2020 to NAD83(2011) (1)","epoch":2010,"method":"helmert","direction":"forward","operation":"EPSG:10334"},{"to":"NAD83(NSRS2007)","from":"NAD83(2011)","grid":"nad83_2007_nad83_2011_conus","method":"nadcon5","direction":"inverse"}],"region":"conus","positions":2}],"applied":true,"epochSource":"default"},"coordinates":[[2329995.078037299,208581.08988551795],[2299970.59809049,144954.7501244871]],"datumShiftApplied":true}}},"schema":{"type":"object","$schema":"https://json-schema.org/draft/2020-12/schema","required":["input"],"properties":{"input":{"type":"object","required":["type","method","bodyType","body"],"properties":{"body":{"type":"object","oneOf":[{"required":["coordinates"]},{"required":["geojson"]}],"required":["from","to"],"properties":{"to":{"type":"string","pattern":"^(?:EPSG:)?[0-9]{4,6}$","examples":["EPSG:3857","EPSG:3644","EPSG:26931","EPSG:32145","EPSG:6318"],"description":"Target CRS as an EPSG reference, e.g. \"EPSG:3857\". A bare code such as \"3857\" is also accepted."},"from":{"type":"string","pattern":"^(?:EPSG:)?[0-9]{4,6}$","examples":["EPSG:4326","EPSG:3857","EPSG:32610","EPSG:3645","EPSG:4267"],"description":"Source CRS as an EPSG reference, e.g. \"EPSG:4326\". A bare code such as \"4326\" is also accepted."},"epoch":{"type":"number","maximum":2100,"minimum":1980,"description":"Decimal year the coordinates were observed, e.g. 2024.5. Used by the time-dependent Helmert between WGS 84 (read as ITRF2020) and NAD83(2011) or NAD83(PA11); about 2 cm a year of difference. Defaults to 2010.0, the NAD83(2011) reference epoch, and the response states the epoch used either way. Ignored, and said to be, when no Helmert runs."},"geojson":{"type":"object","description":"A GeoJSON Feature, FeatureCollection or Geometry. Returned as GeoJSON with the same structure, properties and foreign members, with coordinates reprojected. bbox members are dropped because they describe the source CRS. Send this or coordinates, never both. At most 10000 positions across the whole document."},"coordinates":{"type":"array","maxItems":10000,"description":"A single position [x, y] or [x, y, z], or an array of positions at any nesting depth. The response mirrors the nesting exactly. Send this or geojson, never both. Across the whole request at most 10000 positions; a larger batch is rejected."}},"additionalProperties":false},"type":{"type":"string","const":"http"},"method":{"enum":["POST"],"type":"string"},"bodyType":{"enum":["json","form-data","text"],"type":"string"}},"additionalProperties":false},"output":{"type":"object","required":["type"],"properties":{"type":{"type":"string"},"example":{"type":"object"}}}}}}},"description":"Reproject coordinates between EPSG coordinate reference systems, with the datum shift applied. Accepts a bare position, an array of positions at any nesting depth, or a GeoJSON Feature, FeatureCollection or Geometry, and answers in whichever shape it was given, preserving properties, ids and foreign members. Covers 1380 codes: WGS 84, ITRF2020, NAD27 and every NAD83 realization as geographic, Web Mercator, all 120 WGS 84 UTM zones north and south, the NAD27 and NAD83 UTM zones, and the NAD27 and NAD83 State Plane and low-distortion zones, Oregon and Alaska included. Reach for it before calling /v1/geometry, /v1/h3/index, /v1/h3/polyfill or /v1/pip, which take EPSG:4326 only and refuse anything outside -180..180 and -90..90. One price per call whatever the payload: 10000 positions cost exactly what one position costs, so batch rather than sending a position at a time. Horizontal only: elevations pass through untouched. Datum shifts, and read this before buying: two mechanisms run between the two sides and the response names every step. Between NAD27 and the NAD83 realizations (NAD83, HARN, NSRS2007, 2011, PA11) the NOAA NGS NADCON 5.0 grids are applied, 2016-09-01 release, public domain, biquadratic interpolation as NGS specifies, covering the conterminous United States, Alaska, Hawaii and Puerto Rico with the US Virgin Islands; a position outside that coverage is refused with outside_datum_grid rather than answered without the shift. Between WGS 84 and NAD83(2011) or NAD83(PA11) the EPSG time-dependent Helmert transformations 10334 and 10336 are applied with WGS 84 read as ITRF2020, which the current WGS 84 (G2296) realizes to a few centimetres. That transformation depends on when the coordinates were observed, because the North American plate moves about 2 cm a year against ITRF2020: send \"epoch\" as a decimal year (2024.5) to say when, or it is evaluated at 2010.0, the NAD83(2011) reference epoch, and the response says which. Every response carries datumShiftApplied and a datumShift object listing the grids or Helmert that ran, the region, the epoch and the data provenance; when both sides share a datum it says so and applies nothing. Accuracy was measured against PROJ 9.5.1 running the same grids and the same EPSG operations: the projection arithmetic agrees to under 1e-8 m and the shifted result to under 1e-6 m, so the 1.29 m gap this route carried before the grids is closed to the limit of the source data, which NGS states as a few centimetres for the realization grids and decimetres for NAD27. If a grid cannot be read the request is answered 503 and not charged; it is never answered without the shift. A position that lands outside the target projection's valid domain is rejected with its index, never returned as a null or infinite coordinate. Limits: 10000 positions per call across the whole request, 512 datum-grid tiles per call (about one degree square per grid step; a state-sized batch is well under), and a 1 MiB request body.","lastUpdated":"2026-08-21T17:26:12.678Z","serviceName":"geoprimitives","x402Version":2}]}}