Skip to main content

Build with the API

This page is the API contract

The API itself is built in MVP 1, Phase 3 (see the roadmap). This page defines the contract it follows, so integrations can be designed now. Full endpoint definitions, request and response schemas, and interactive examples will be published in the Vora Swagger documentation.

Quickstart​

  1. Step 1
    Get an API key

    Create one in the Vora dashboard. Production keys start with vora_live_.

  2. Step 2
    Make a request

    Call any endpoint with your key in the Authorization header.

  3. Step 3
    Read the JSON

    Records come back in a data array, with pagination details alongside.

Your first request​

Search enforcement actions for a company:

curl "https://api.withvora.com/v1/enforcement?query=acme+bank&limit=5" \
-H "Authorization: Bearer $VORA_API_KEY"

What you get back​

Every list endpoint returns the same envelope:

{
"data": [],
"pagination": {
"total": 843,
"limit": 20,
"offset": 40,
"has_more": true
}
}

All responses use Content-Type: application/json. Request bodies, where applicable, should be sent as JSON with the same header.

Authentication​

Vora uses API key authentication. Every request must include a valid key as a Bearer token in the Authorization header:

GET /v1/enforcement
Authorization: Bearer vora_live_xxxxxxxxxxxxxxxxxxxx

Key format​

PrefixMeaning
vora_live_Production key
vora_test_Sandbox key, once a sandbox environment is introduced

Managing keys​

API keys are created and managed in the Vora dashboard. You can create, rotate, and revoke keys at any time. Rotating a key immediately invalidates the previous one.

Keep your key secret
  • Never expose your API key in client-side code or public repositories.
  • Rotate your key immediately if you believe it has been compromised.
  • Each key is tied to your account, and all usage is logged against it.

Authentication errors​

StatusCodeMeaning
401unauthorizedAPI key is missing or invalid
403forbiddenAPI key is valid but does not have access to this resource

Pagination​

All list endpoints return paginated results, using offset-based pagination.

ParameterTypeRequiredDefaultDescription
limitintegerNo20Number of records to return. Maximum 100.
offsetintegerNo0Number of records to skip before returning results
GET /v1/enforcement?limit=20&offset=40
Authorization: Bearer vora_live_xxxxxxxxxxxx
FieldTypeDescription
dataarrayThe records on this page
totalintegerTotal number of matching records
limitintegerThe limit applied to this request
offsetintegerThe offset applied to this request
has_morebooleanWhether more records exist beyond this page

Filtering and sorting​

These parameters apply across the API. Each endpoint's Swagger definition lists which filters it supports.

ParameterTypeDescriptionExample
date_fromISO 8601 dateRecords on or after this datedate_from=2024-01-01
date_toISO 8601 dateRecords on or before this datedate_to=2024-12-31
querystringSearch by entity name. Partial matches supported.query=acme+bank
enum filtersstringA single value or a comma-separated listsource=cfpb,occ
sort_bystringField to sort by. Default: action_datesort_by=action_date
sort_orderenumasc or desc. Default: descsort_order=asc

All filters can be combined in one request:

GET /v1/enforcement?query=acme+bank&source=cfpb,occ&date_from=2024-01-01&sort_order=asc

Errors​

Every error has the same shape, whatever the endpoint or error type:

{
"error": {
"code": "rate_limit_exceeded",
"message": "You have exceeded your rate limit. Please retry after 1714480800.",
"details": {}
}
}
FieldTypeDescription
codestringMachine-readable error code
messagestringHuman-readable description of the error
detailsobjectExtra context where applicable, otherwise empty
StatusCodeWhat it means
400bad_requestMissing or invalid query parameters
401unauthorizedAPI key is missing or invalid
403forbiddenAPI key does not have access to this resource
404not_foundThe requested record does not exist
429rate_limit_exceededRate limit reached for the current window
500internal_server_errorSomething went wrong on Vora's end

Rate limiting​

Rate limits are enforced per API key, to protect infrastructure stability and keep performance consistent across all integrations.

Limits are still being set

A single global rate limit applies to all customers until the pricing tiers are finalized after customer validation. See pricing.

TierPer minutePer day
Global (today)TBDTBD
StarterTBDTBD
ProTBDTBD
EnterpriseCustomCustom

Every response includes these headers, so your integration can track its usage:

HeaderDescription
X-RateLimit-LimitTotal requests allowed in the current window
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the current window resets

Going over the limit returns 429 Too Many Requests. Pause until the time in X-RateLimit-Reset, then retry.

Versioning​

The API version is part of the base URL, so breaking changes never reach existing integrations without notice.

VersionStatusReleasedBase URL
V1Active2026https://api.withvora.com/v1

V1 includes:

  • Enforcement action search and lookup: /v1/enforcement, /v1/enforcement/:id
  • License record search and lookup: /v1/licenses, /v1/licenses/:id
  • Data source listing: /v1/sources
  • Health check: /v1/health
  • API key authentication
What counts as a breaking change?

Non-breaking changes can be added to any version at any time, without notice:

  • New optional query parameters
  • New fields in existing response schemas
  • New endpoints
  • New enum values

Breaking changes always ship as a new version, with a deprecation notice and a migration guide before the previous version is retired:

  • Removed or renamed fields
  • Changed response shapes
  • Modified authentication behavior
  • Removed endpoints