Skip to content

Save where this run's tracts sit

PUT
/v1/runs/{reference}/placements
curl --request PUT \
--url 'https://example.com/v1/runs/example/placements?document=' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{ "tracts": [ { "lat": 36.0726, "lon": -80.2442, "rotation_deg": 0, "tract_index": 0 } ] }'

Replace the positions named, and leave the rest alone.

Placing a tract again moves it: the second click corrects the first rather than adding to a list of places the parcel has been. Tracts left out of the body keep whatever they had, so a surface can save the one parcel somebody just placed.

The document name is checked against the run rather than trusted. A name the reference does not cover is a 404, because a position filed under a document that does not exist would be saved where nothing will look for it.

reference
required
Reference
string
document
Document

Which document of the run, required when the reference is a batch. A single extraction has one document and needs no name.

string
""

Which document of the run, required when the reference is a batch. A single extraction has one document and needs no name.

Media typeapplication/json
PlacementRequest

Where the operator put each tract of one run.

Sent by whichever surface did the placing, and read back by the other. A tract left out of tracts keeps whatever position it already had, so a surface may save the one parcel somebody just placed without asserting anything about the other four in the deed.

This is not part of the attested extraction and is never folded into it. The signature covers claims the service made and can defend; where a parcel sits on the earth is the operator’s claim, and nothing verified it.

object
tracts
Tracts

One entry per tract placed, indexed as the extraction indexes them.

Array<object>
<= 200 items
PlacedTract

One tract’s position on the earth, as both the wire and the table carry it.

The bounds are the point of the model. A longitude of 200 is not a place, and a rotation of 4,000 degrees is a client that forgot to take a modulus, so both are refused at the edge rather than stored and puzzled over later.

object
document
Document

The document this tract came from.

string
""
tract_index
required
Tract Index

Which tract of the document, by its index.

integer
lon
required
Lon

WGS 84 longitude of the point of beginning.

number
>= -180 <= 180
lat
required
Lat

WGS 84 latitude of the point of beginning.

number
>= -90 <= 90
rotation_deg
Rotation Deg

Clockwise from north, as the placement tool reports it.

number
0 >= -360 <= 360

Successful Response

Media typeapplication/json
PlacementListResponse

Every position this run has, in tract order.

Empty means the run exists and nothing has been placed yet, which is the same answer a run whose tracts were never put on a map should give.

object
reference
required
Reference
string
placements
required
Placements
Array<object>
PlacedTract

One tract’s position on the earth, as both the wire and the table carry it.

The bounds are the point of the model. A longitude of 200 is not a place, and a rotation of 4,000 degrees is a client that forgot to take a modulus, so both are refused at the edge rather than stored and puzzled over later.

object
document
Document

The document this tract came from.

string
""
tract_index
required
Tract Index

Which tract of the document, by its index.

integer
lon
required
Lon

WGS 84 longitude of the point of beginning.

number
>= -180 <= 180
lat
required
Lat

WGS 84 latitude of the point of beginning.

number
>= -90 <= 90
rotation_deg
Rotation Deg

Clockwise from north, as the placement tool reports it.

number
0 >= -360 <= 360
Example
{
"placements": [
{
"lat": 36.0726,
"lon": -80.2442,
"rotation_deg": 0,
"tract_index": 0
}
],
"reference": "job_1a2b3c"
}

Missing, unknown, or revoked API key

Media typeapplication/json
ErrorResponse
object
error
required
ErrorDetail
object
type
required
Type
string
message
required
Message
string
key
additional properties
any
Example
{
"error": {
"documents_used": 200,
"message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.",
"monthly_cap": 200,
"resets_on": "2026-08-01",
"type": "quota_exceeded"
}
}

No such resource under this caller

Media typeapplication/json
ErrorResponse
object
error
required
ErrorDetail
object
type
required
Type
string
message
required
Message
string
key
additional properties
any
Example
{
"error": {
"documents_used": 200,
"message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.",
"monthly_cap": 200,
"resets_on": "2026-08-01",
"type": "quota_exceeded"
}
}

Body was empty, or was not a PDF, TIFF, PNG, or JPEG

Media typeapplication/json
ErrorResponse
object
error
required
ErrorDetail
object
type
required
Type
string
message
required
Message
string
key
additional properties
any
Example
{
"error": {
"documents_used": 200,
"message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.",
"monthly_cap": 200,
"resets_on": "2026-08-01",
"type": "quota_exceeded"
}
}

Extraction temporarily unavailable

Media typeapplication/json
ErrorResponse
object
error
required
ErrorDetail
object
type
required
Type
string
message
required
Message
string
key
additional properties
any
Example
{
"error": {
"documents_used": 200,
"message": "Monthly document quota reached: 200 of 200 documents used this month. The cap resets on 2026-08-01. Email sales@easting.ai to raise it.",
"monthly_cap": 200,
"resets_on": "2026-08-01",
"type": "quota_exceeded"
}
}