Skip to content

Enrich places in bulk

POST /v1/jobs/enrich

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

Open in playground

Overview

Enrich up to 10,000 places asynchronously using /v1/enrich request bodies. Poll GET /v1/jobs/{batch_id} until completed, then download result.jsonl.gz: one result per input row, in order. One credit per row is held at submission; only rows with a billable value or non-null status are charged, and unused credits are released. Failed rows are free. 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: EnrichJobSubmit

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

EnrichJobSubmit

Type: object

Submit body for POST /v1/jobs/enrich.

Rows are the exact /v1/enrich request model, so a batch row behaves identically to a single call by construction - same validation, same attribute set, same limits.

FieldTypeRequiredDescription and constraints
poisarray of POIEnrichRequestrequiredInline POIs to enrich
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,
      "attributes": [
        "opening_hours",
        "phone",
        "website"
      ]
    },
    {
      "id": "cafe-002",
      "poi_name": "Example Cafe",
      "address": "456 Sample Avenue",
      "country": "US",
      "latitude": 37.7755,
      "longitude": -122.4183,
      "attributes": [
        "opening_hours",
        "phone",
        "website"
      ]
    }
  ]
}

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

POIEnrichRequest

Type: object

Request model for place attribute enrichment.

FieldTypeRequiredDescription and constraints
idstring (max length 100) | nulloptionalClient-provided identifier
poi_namestringrequiredPlace name
length 1 to 200
streetstring | nulloptionalStreet address
citystring | nulloptionalCity
regionstring | nulloptionalState/province
postcodestring | nulloptionalPostal/ZIP code
countrystring | nulloptional2-letter ISO country code (e.g. US) locating the place.
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).
longitudenumber (-180.0 to 180.0) | nulloptionalLongitude in decimal degrees (WGS84). Provide with latitude.
attributesarray of stringoptionalAttributes to return: opening_hours, phone, website, facebook, instagram, tiktok, email. Existence and open_closed are returned under status. Defaults to opening_hours, phone, website, existence, open_closed.
1 to 9 items; default ['opening_hours', 'phone', 'website', 'existence', 'open_closed']
include_summarybooleanoptionalAlso return a short factual place_summary. Default false. Does not change billing: still 1 credit.
default False
response_formatstringoptionalResponse shape: 'attributes' (default, EnrichedAttribute) or 'cell' (the unified ResultCell shape).
one of attributes, cell; default attributes

Example

{
  "id": "bakery-001",
  "poi_name": "Example Bakery",
  "address": "123 Example Street",
  "country": "US",
  "latitude": 37.7749,
  "longitude": -122.4194,
  "attributes": [
    "opening_hours",
    "phone",
    "website"
  ]
}