{"apiVersion":"1.0.0","schemaVersion":1,"generatedAt":"2026-08-25T07:46:36.735Z","resource":{"id":"4e159a65b99f375e442a455d","key":"POST https://api.geoprimitives.dev/v1/geometry/difference","method":"POST","resourceUrl":"https://api.geoprimitives.dev/v1/geometry/difference","alternateResourceUrls":["https://api.geoprimitives.dev/v1/geometry/difference"],"canonicalUrl":"https://api.geoprimitives.dev/v1/geometry/difference","origin":"https://api.geoprimitives.dev","hostname":"api.geoprimitives.dev","groupId":"api-geoprimitives-dev-a3da827b","providerName":"geoprimitives","title":"geoprimitives: POST /v1/geometry/difference","description":"Cut holes out of a polygon: the buildable part of a parcel once setbacks are removed, the land outside a protected area, the part of a route not already covered. Order is significant, so this is the one overlay op where swapping the operands gives a different answer. Subtracting everything answers geojson:null with empty:true, a real answer rather than an error. Send a FeatureCollection of Polygons or MultiPolygons; the first member in document order has every later member subtracted from it. The answer is a single Feature, or null with empty:true when nothing survives. Clipping is planar in longitude/latitude, so edges are straight in degrees rather than geodesics. The 2000-position cap is CPU rather than bandwidth: the sweep-line overlay is quadratic on self-intersecting input. Input is ","tags":["difference","geometry","overlay","polygon","turf"],"type":"http","x402Version":2,"routeTemplate":null,"input":{"type":"http","method":"POST","bodyType":"json","bodyFieldNames":["geojson"],"pathParamNames":[],"queryParamNames":[]},"iconUrl":null,"payment":{"networks":["eip155:8453"],"schemes":["exact"],"assets":["0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"],"options":[{"network":"eip155:8453","scheme":"exact","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913","amountAtomic":"10000","payTo":"0x76A51b5Dd3729950B3b60c17f19252d221968FCe","maxTimeoutSeconds":300,"tokenName":"USD Coin","tokenVersion":"2"}],"acceptedPaymentCount":1,"priceUsd":null},"quality":{"l30DaysTotalCalls":1,"l30DaysUniquePayers":1,"lastCalledAt":"2026-08-21T17:25:59.175Z"},"registry":null,"sources":[{"id":"cdp-bazaar","sourceUrl":"https://api.cdp.coinbase.com/platform/v2/x402/discovery/resources","observedAt":"2026-08-25T05:19:49.445Z","lastUpdated":"2026-08-21T17:25:59.287Z","recordKey":"POST https://api.geoprimitives.dev/v1/geometry/difference"}],"verification":{"level":"origin-reachable","checkedAt":"2026-08-25T05:20:56.671Z","structural":{"ok":true,"normalized":true,"publicHttpUrl":true},"sourceConfirmed":true,"crossSource":false,"registryPaymentValid":null,"originCheck":{"scope":"origin","reachable":true,"statusCode":200,"method":"HEAD","checkedAt":"2026-08-25T05:20:21.676Z","latencyMs":727,"error":null},"quoteCheck":{"scope":"exact-route","outcome":"not-safely-testable","attempted":false,"requestedMethod":null,"statusCode":null,"finalUrl":"https://api.geoprimitives.dev/v1/geometry/difference","redirectCount":0,"checkedAt":"2026-08-25T05:20:56.671Z","latencyMs":null,"reason":"potentially-mutating-method:POST","requirementCount":0},"quote":null,"paidCall":{"verified":false,"checkedAt":null,"network":null,"receiptReference":null,"outputReviewed":false}},"curation":{"status":"discovered","basis":"discovery-only","matchScope":null,"listingSlug":null,"providerListingSlug":null,"listingName":null,"kind":null,"categories":[],"editorialDescription":null,"docsUrl":null,"sourceUrl":null}}}