Skip to content

Enrich up to 10 places

POST /v1/enrich-batch

https://api.voygr.tech/v1/enrich-batch

Open in playground

Overview

Enrich up to 10 places in one request. Each item behaves like /v1/enrich and is billed when it returns a billable result. Requires a key permitted to use enrichment.

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.

Request body

required

application/json

Schema: POIEnrichBatchRequest

Responses

200

Successful Response

application/json

Schema: POIEnrichBatchResponse

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

POIEnrichBatchRequest

Type: object

Enrich up to 10 places. Each item has the same request and response behavior as a single enrichment call.

FieldTypeRequiredDescription and constraints
poisarray of POIEnrichRequestrequiredPlaces to enrich (max 10); each item carries its own attributes list, exactly like a single /v1/enrich call
max items 10

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"
      ]
    }
  ]
}

POIEnrichBatchResponse

Type: object

Response model for batch enrichment.

FieldTypeRequiredDescription and constraints
successbooleanrequiredWhether the batch request ran (individual items may still fail)
resultsarray of POIEnrichResponserequiredPer-item results; results[i] corresponds to pois[i]
statsobjectrequiredBatch statistics (total/successful/failed)
enrichment_timestampstring | nulloptionalUTC timestamp (ISO 8601)

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"
  ]
}

POIEnrichResponse

Type: object

Response model for place attribute enrichment.

FieldTypeRequiredDescription and constraints
successbooleanrequiredWhether enrichment ran (individual attributes may still be null)
idstring | nulloptionalClient-provided ID (pass-through)
attributesobject mapping names to EnrichedAttribute | ResultCell | nulloptionalRequested web-extracted attribute -> result (opening_hours, phone, website, facebook, instagram, tiktok, email). EnrichedAttribute by default; the unified ResultCell when the request sets response_format='cell'.
statusEnrichStatus | nulloptionalExistence and closure information; see EnrichStatus. Present when requested; null if validation is unavailable.
operational_statusOperationalStatusBlock | nulloptionalOperating-status result. Use operational_status.status for the decision.
place_summarystring | nulloptionalShort factual description of the place. Present only with include_summary=true; null when unavailable.
enrichment_timestampstring | nulloptionalUTC timestamp (ISO 8601)
errorstring | nulloptionalError message if success=false
error_codestring | nulloptionalError category code
request_idstring | nulloptionalRequest ID for tracing

Example 1

{
  "success": true,
  "id": "poi-12345",
  "attributes": {
    "opening_hours": {
      "value": {
        "days": {
          "monday": "closed",
          "tuesday": [
            {
              "open": "11:30",
              "close": "22:00"
            }
          ],
          "wednesday": [
            {
              "open": "11:30",
              "close": "22:00"
            }
          ],
          "thursday": [
            {
              "open": "11:30",
              "close": "22:00"
            }
          ],
          "friday": [
            {
              "open": "11:30",
              "close": "23:00"
            }
          ],
          "saturday": [
            {
              "open": "11:30",
              "close": "23:00"
            }
          ],
          "sunday": [
            {
              "open": "11:00",
              "close": "22:00"
            }
          ]
        }
      },
      "confidence": "high"
    },
    "phone": {
      "value": {
        "number": "+14155551234"
      },
      "confidence": "medium"
    },
    "website": {
      "value": {
        "url": "https://www.zunicafe.com"
      },
      "confidence": "high"
    },
    "facebook": {
      "value": {
        "url": "https://www.facebook.com/zunicafe",
        "handle": "zunicafe"
      },
      "confidence": "high"
    },
    "email": {
      "value": {
        "email": "info@zunicafe.com"
      },
      "confidence": "medium"
    }
  },
  "status": {
    "existence_confidence": 0.98
  },
  "place_summary": "A Californian restaurant on Market Street serving a seasonal menu, open since 1979.",
  "enrichment_timestamp": "2026-06-29T12:34:56Z",
  "request_id": "ad33009a-fdfe-4e25-9650-4a49099c3d4a",
  "operational_status": {
    "status": "open",
    "closure_confidence": 0.02,
    "closure_reason": null
  }
}

EnrichedAttribute

Type: object

One attribute's value, confidence, and as_of date. Unavailable values are null.

FieldTypeRequiredDescription and constraints
valueobject | nulloptionalAttribute payload (shape depends on the attribute); null if not found
as_ofstring | nulloptionalMost recent date carried by the cited evidence (ISO); null when sources are undated (most are)
confidencestring | nulloptionalConfidence tier: high | medium | low. Null when the value is null.

Example 1

{
  "value": {
    "days": {
      "monday": "closed",
      "tuesday": [
        {
          "open": "11:30",
          "close": "22:00"
        }
      ],
      "wednesday": [
        {
          "open": "11:30",
          "close": "22:00"
        }
      ],
      "thursday": [
        {
          "open": "11:30",
          "close": "22:00"
        }
      ],
      "friday": [
        {
          "open": "11:30",
          "close": "23:00"
        }
      ],
      "saturday": [
        {
          "open": "11:30",
          "close": "23:00"
        }
      ],
      "sunday": [
        {
          "open": "11:00",
          "close": "22:00"
        }
      ]
    }
  },
  "confidence": "high"
}

ResultCell

Type: object

One returned value, confidence tier, and status, returned by enrichment in cell format. Unavailable values are null.

FieldTypeRequiredDescription and constraints
valueany | nulloptionalThe field value; null when unconfirmed
confidencestring | nulloptionalTrust tier: high | medium | low; null when value is null
statusstringrequiredconfirmed | estimated | unconfirmed | cost_capped | rejected. Estimated values have low confidence; filter by status if you need confirmed values only.

EnrichStatus

Type: object

Existence results returned alongside enriched attributes. Interpret closure only when existence is established; read operational_status.status for the decision. Unavailable validation can return null fields. An operational-status failure can return HTTP 503 with operational_status_unavailable; retry the request.

FieldTypeRequiredDescription and constraints
existence_confidencenumber | nulloptionalConfidence (0-1) that a matching place ever existed at this address. A closed place can still have high existence confidence. This does not describe whether it is operating today. Interpret closure only when existence is established; use operational_status.status for the decision.
Example: 0.94

OperationalStatusBlock

Type: object

Operational status for a place. Use operational_status.status for the decision. A closed verdict is evidence-backed, not a decision based on score alone. Confidence is not a cross-status decision threshold. 'unknown' means undetermined; null means no closure assessment, not zero confidence.

FieldTypeRequiredDescription and constraints
statusstringrequiredOperational status: 'open' means assessed as operating; 'closed' means evidence supports closure; 'unknown' means undetermined and worth re-checking; 'not_exists' means the place was not judged to exist and no closure assessment was made. closure_confidence and closure_reason are null for 'not_exists'.
one of open, closed, unknown, not_exists
closure_confidencenumber | nullrequiredConfidence in a closed verdict (0-1). Use operational_status.status for the decision; do not use confidence as a cross-status threshold or rank non-closed places by it. Null for 'not_exists' means no closure assessment, not zero confidence.
closure_reasonstring (one of permanent, temporary, relocated, replaced, dissolved, unspecified) | nulloptionalWhat kind of evidence closed the place: permanent, temporary, relocated, replaced, dissolved, or unspecified. Null whenever status is not 'closed' - an open or unknown verdict has no closure to attribute.