Developers

API documentation

One endpoint, every modality. Send an image, an audio file, text — or all three in the same request — and get structured JSON back. No separate services to wire up, no per-modality SDKs.

API version v1 · Last updated July 26, 2026

1. Quickstart

Every capability in the platform is reached through a single HTTPS endpoint. You do not choose a model or a service — you send content, and the API detects the modality and returns the analysis appropriate to it.

Your first request
# Analyze an image — the modality is detected from the payload
curl -X POST https://api.visibilityzone.com/v1/analyze \
  -H "Authorization: Bearer $VZ_API_KEY" \
  -F file=@product.jpg

Base URL. All requests go to https://api.visibilityzone.com over HTTPS. Plain HTTP requests are rejected, not redirected. Requests must include a valid API key.

2. Authentication

Authenticate with a bearer token in the Authorization header. Keys are issued per environment (test and live) and can be rotated at any time from your account without downtime — old and new keys stay valid together during a rotation window you control.

Authorization header
Authorization: Bearer vz_live_<your-key>

Treat keys as secrets: never embed one in a browser, mobile app or public repository. Client-side calls should go through your own backend. You are responsible for all usage under your keys — see the Terms of Service.

3. The analyze endpoint

POST/v1/analyze

Accepts either multipart/form-data (for files) or application/json (for text-only requests). The modality is inferred from what you send; you can override it with the type parameter when you need to be explicit.

ParameterTypeDescription
filefileImage or audio to analyze. Images: JPEG, PNG, WebP, HEIC, up to 20 MB. Audio: MP3, WAV, M4A, FLAC, OGG, up to 50 MB or 10 minutes.
urlstringAlternative to file — a publicly reachable URL we fetch server-side. Must respond within 10 seconds.
textstringText to analyze, or the language part of a multimodal query. Up to 8,000 characters.
typestringOptional override: image, audio, text or multimodal. Omit to auto-detect.
indexstringName of the catalog to search against when you want matches back. Omit for pure analysis with no retrieval.
top_kintegerNumber of matches to return. Default 10, maximum 100.
filtersobjectMetadata constraints applied to retrieval, e.g. {"in_stock": true, "color": "navy"}.
featuresarrayRestrict the analysis to specific outputs, e.g. ["labels","colors"]. Fewer features means lower latency and cost.

4. Image analysis

Returns labels, dominant colors, detected attributes and a technical quality score. Add an index to also get visually similar items from your own catalog in the same round trip.

Image + visual similarity
curl -X POST https://api.visibilityzone.com/v1/analyze \
  -H "Authorization: Bearer $VZ_API_KEY" \
  -F file=@product.jpg \
  -F index=catalog_ss26 \
  -F top_k=5

{
  "type": "image",
  "labels": ["sneaker", "running", "mesh upper"],
  "attributes": { "category": "footwear", "pattern": "solid" },
  "colors": [{ "hex": "#1a2b3c", "ratio": 0.61 }],
  "quality": 0.94,
  "matches": [{ "id": "sku_8841", "score": 0.97 }],
  "latency_ms": 41
}

5. Sound analysis

Classifies audio, fingerprints it against your library, flags duplicates and returns the nearest acoustic matches. Useful for rights management, jingle and voice matching, and de-duplicating large sound libraries.

Audio fingerprint and match
curl -X POST https://api.visibilityzone.com/v1/analyze \
  -H "Authorization: Bearer $VZ_API_KEY" \
  -F file=@jingle.mp3 \
  -F index=audio_library

{
  "type": "audio",
  "duration_s": 28.4,
  "classification": ["jingle", "upbeat"],
  "match": { "id": "track_2210", "confidence": 0.97 },
  "duplicates": 2,
  "latency_ms": 120
}

6. Text analysis

Returns intent, sentiment and entities, and — with an index — semantic matches that understand meaning rather than exact keywords. Synonyms, misspellings and morphological variants are handled without configuration.

JSON request
curl -X POST https://api.visibilityzone.com/v1/analyze \
  -H "Authorization: Bearer $VZ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"best wireless earbuds for running","index":"catalog_ss26"}'

{
  "type": "text",
  "intent": "purchase_research",
  "sentiment": "neutral",
  "entities": ["wireless earbuds", "running"],
  "matches": [{ "id": "sku_1207", "score": 0.95 }],
  "latency_ms": 22
}

7. Multimodal search

Send a file and text together and the query is interpreted as one intent: the image supplies the visual reference, the text supplies the modification. This is the same endpoint — you are not calling a different service.

Image + language in one call
curl -X POST https://api.visibilityzone.com/v1/analyze \
  -H "Authorization: Bearer $VZ_API_KEY" \
  -F file=@street-style.jpg \
  -F text="same jacket but in navy" \
  -F index=catalog_ss26

{
  "type": "multimodal",
  "matches": [
    { "id": "sku_1207", "score": 0.96, "color": "navy" }
  ],
  "latency_ms": 38
}

8. Indexing your catalog

Retrieval requires an index. You create one, push items to it, and reference it by name in any analyze call. Items can carry arbitrary metadata, which becomes available for filtering.

Create and populate an index
POST /v1/indexes            # create
POST /v1/indexes/:name/items # upsert items (batch up to 1,000)
GET  /v1/indexes/:name       # status and item count

# Upsert example
curl -X POST https://api.visibilityzone.com/v1/indexes/catalog_ss26/items \
  -H "Authorization: Bearer $VZ_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"items":[{"id":"sku_8841","image_url":"https://…/1.jpg","metadata":{"color":"navy","in_stock":true}}]}'

Indexing is asynchronous. Items become searchable within seconds for small batches; large initial imports are processed in the background and report progress on the index status endpoint.

9. Response format

Every successful response is JSON and always contains type, request_id and latency_ms. Modality-specific fields are added on top of that base. Fields are additive across versions: we add keys, we do not silently remove or repurpose them.

FieldAlways presentDescription
typeYesDetected or requested modality.
request_idYesOpaque identifier — quote it in any support request.
latency_msYesServer-side processing time, excluding network transit.
matchesNoPresent only when index was supplied. Sorted by descending score in the range 0–1.

10. Errors

Errors use conventional HTTP status codes and return a JSON body with a stable machine-readable code, a human-readable message and the request_id.

StatusCodeMeaning
400invalid_requestMalformed parameters, or no analyzable content supplied.
401unauthorizedMissing, malformed or revoked API key.
413payload_too_largeFile exceeds the size limit for its modality.
415unsupported_media_typeFile format not supported.
422unprocessable_contentFile was readable but could not be analyzed, e.g. a corrupt or silent audio file.
429rate_limitedRate limit exceeded. Honor the Retry-After header.
500internal_errorUnexpected server error. Safe to retry with backoff.
503temporarily_unavailableCapacity or maintenance. Retry with backoff.

Retry 429, 500 and 503 with exponential backoff and jitter. Do not retry 4xx validation errors — they will fail identically.

11. Rate limits

Limits apply per API key and are returned on every response so you can adapt without guessing.

Rate limit headers
X-RateLimit-Limit: 600
X-RateLimit-Remaining: 574
X-RateLimit-Reset: 1785000000
Retry-After: 12          # only on 429

Default limits depend on your plan; see Pricing. Sustained higher throughput and burst allowances are configured per account — contact us before you launch a large migration so we can raise limits in advance.

12. Versioning and deprecation

The version is pinned in the URL path (/v1/). Within a major version we make only backward-compatible changes: new endpoints, new optional parameters and new response fields. Your integration will not break because we shipped a feature.

Breaking changes ship as a new major version. When a version is deprecated we announce it by email to account owners, mark it in these docs, and continue serving it for at least 12 months from the announcement. Security issues are the only exception, and we will contact affected customers directly.

Need an API key? Access is granted per account. Talk to us and tell us the modalities and volume you expect, and we will size limits and pricing before you write any code.