Skip to content

Validate places in bulk

POST /v1/jobs/validate

https://api.voygr.tech/v1/jobs/validate

Open in playground

Overview

Submit 1 to 10,000 places for asynchronous validation. Each downloaded JSON Lines row follows the POST /v1/validate response contract. Save batch_id and poll GET /v1/jobs/{batch_id} after acceptance. For an uncertain submission, retry promptly with the same Idempotency-Key and identical body. Replay only applies while the idempotency record is retained and the job is not cancelled. Reusing a key after cancellation or retention expiry can create new work and charges. While replay applies, a different body returns 409 IDEMPOTENCY_CONFLICT. Use a new key for intentional new work.

Authentication

  • API key in header X-API-Key: Your customer API key (pk_live_...), sent on every request. Self-serve at https://api.voygr.tech/checkout.

Parameters

NameLocationRequiredTypeDescription and constraints
Idempotency-Keyheaderoptionalstring | null

Request body

required

application/json

Schema: ValidateJobSubmit

Responses

200

Successful Response

application/json

Schema: ValidationJobSubmitResponse

400

Invalid request. Correct the fields before retrying.

application/json

Schema: object | object

Option 1 fields

FieldTypeRequiredDescription and constraints
successbooleanrequiredconstant False
errorstringrequired
error_codestringrequiredconstant VALIDATION_ERROR
request_idstring | nullrequired
validation_timestampstringrequired
detailarray of objectrequired

Item fields

FieldTypeRequiredDescription and constraints
fieldstringrequired
messagestringrequired
typestringrequired

Option 2 fields

FieldTypeRequiredDescription and constraints
detailobjectrequiredGateway rejection, for example an invalid Idempotency-Key header.

Fields

FieldTypeRequiredDescription and constraints
errorstringrequired
error_codestringoptional

One of

  • Option 1: requires success, error, error_code, request_id, validation_timestamp, detail
  • Option 2: requires detail

invalidinput

{
  "success": false,
  "error": "Invalid input provided",
  "error_code": "VALIDATION_ERROR",
  "request_id": "example-request-id",
  "validation_timestamp": "2026-09-16T12:00:00Z",
  "detail": [
    {
      "field": "pois.0.poi_name",
      "message": "Field required",
      "type": "missing"
    }
  ]
}

Schemas

ValidateJobSubmit

Type: object

Submit 1 to 10,000 places for validation.

FieldTypeRequiredDescription and constraints
poisarray of POIValidateRequestrequiredInline POIs to validate
1 to 10000 items

Example

{
  "pois": [
    {
      "id": "bakery-001",
      "poi_name": "Example Bakery",
      "address": "123 Example Street",
      "country": "US",
      "latitude": 37.7749,
      "longitude": -122.4194
    },
    {
      "id": "cafe-002",
      "poi_name": "Example Cafe",
      "address": "456 Sample Avenue",
      "country": "US",
      "latitude": 37.7755,
      "longitude": -122.4183
    }
  ]
}

ValidationJobSubmitResponse

Type: object

Accepted validation or enrichment job submission.

FieldTypeRequiredDescription and constraints
batch_idstringrequired
typestring (one of validate, enrich) | nulloptional
statusstringrequiredone of queued, running, completed, failed, cancelled
created_atstringrequired
total_itemsintegerrequired
eta_secondsintegerrequired
eta_completion_atstringrequired

POIValidateRequest

Type: object

Request model for single POI validation.

FieldTypeRequiredDescription and constraints
idstring (max length 100) | nulloptionalClient-provided identifier
poi_namestringrequiredPOI name
length 1 to 200
streetstring (max length 300) | nulloptionalStreet address
citystring (max length 200) | nulloptionalCity
regionstring (max length 200) | nulloptionalState/province
postcodestring (max length 40) | nulloptionalPostal/ZIP code
countrystring | nulloptional2-letter ISO country code
addressstring (max length 500) | nulloptionalUnstructured address string. May also be sent as freeform_address (input-only alias).
latitudenumber (-90.0 to 90.0) | nulloptionalLatitude in decimal degrees (WGS84). Optional but recommended.
longitudenumber (-180.0 to 180.0) | nulloptionalLongitude in decimal degrees (WGS84). Optional but recommended.

Example

{
  "id": "bakery-001",
  "poi_name": "Example Bakery",
  "address": "123 Example Street",
  "country": "US",
  "latitude": 37.7749,
  "longitude": -122.4194
}