Skip to main content
v3 reduces the people API to two concepts:
  • Search finds people from plain-English queries, structured criteria, or identity signals, optionally discovers additional candidates, and builds every result to a requested depth.
  • Enrich operates on an existing profile by canonical Orbit ID or profile slug: return a partial profile, return a full profile, or regenerate a fresh full profile.
This migration changes request shapes and response lifecycles. Treat it as a client-contract migration, not an endpoint rename.

Endpoint map

Before

After

v3 keeps the raw query field and removes match reasons. Orbit sends plain-English queries through its normal model router and derives structured intent internally when candidate discovery needs it. If your application already has exact filters, send intent alone. You can also keep query and add intent when the plain-English request provides useful context but exact fields must take precedence: When both are present, Orbit derives a base intent from query and overlays your intent. At each supplied field, arrays, scalar values, and null replace the derived value; nested objects merge field by field. Known-profile Search uses the original query plus the merged intent. Candidate Discovery uses the merged intent. query, intent, or both can be combined with identity signals.

Replace workflow stages with three knobs

Known search always runs. limit caps existing Orbit index matches and accepts values from 1–100. Candidate Discovery results append outside that quota. candidate_discovery_limit defaults to 10 and accepts values from 1–50. A lower value reduces downstream profile-generation fanout, although source discovery and clustering can still dominate initial discovery time. include_profile changes only the response; it does not skip profile building.

Move identity signals

Field renames: Remove structuredIntent.version; Orbit owns it. With candidate_discovery: true, address, email, and phone signals can each return multiple associated people. Profile IDs do not belong in Search.

Migrate profile upgrades to Enrich

regenerate builds toward full for level 1 and 2 profiles. For an existing level 3 profile, it forces a fresh full build.

Migrate profile reads

Read the current public profile directly by Orbit profile ID, known alias ID, or public profile slug. An Enrich request_id is not required.
The response returns the canonical profile ID, generation level, and complete v3 developer profile object. Follow an Enrich response’s links.profile value when one is available. See Read a profile for the response schema. Profile read is read-only. To build a level 1 profile to level 2, call POST /v3/enrich/{profile_id} with operation: partial. The POST can return 202 Accepted with status: running. Poll links.status until the operation is completed or failed. It returns 200 OK immediately when the existing profile already satisfies the operation. The response names the canonical Orbit ID profile_id; that is the API field name, not a second ID type.

Update lifecycle handling

  • A Search POST can return 202 with results already becoming ready. Poll links.status until completed, completed_with_errors, or failed.
  • An Enrich POST can return 200 immediately when the existing profile satisfies the operation, or 202 when work is running.
  • Treat completed_with_errors as usable partial success and inspect each result.
  • Batch Enrich has no aggregate GET. Poll each running child using its own links.status.
  • Persist the returned request_id for status polling. If you send an Idempotency-Key header, reuse it only for the same logical request.

Update scopes and billing assumptions

  • Search and Enrich start/status require search:read.
  • Any request that embeds profiles also requires profile:read.
  • Direct Enrich profile reads require profile:read.
  • v3 Search and Enrich do not consume credits. Continue handling 429 rate limits.

Cutover checklist

  • Keep free-form people searches in query. Use structured intent alone for fully structured requests, or add it to query when exact fields must override Orbit’s interpretation.
  • Remove legacy fields and internal workflow terminology from requests.
  • Cap limit at 100.
  • Store returned request_id and search_id values where applicable.
  • Poll the correct status endpoint with backoff and jitter.
  • Handle completed_with_errors separately from failed.
  • Read profiles by canonical Orbit ID or slug, or follow the returned Enrich links.profile URL.
  • Run old and new clients side by side on representative inputs before switching production traffic.
  • Log v3 IDs and error codes so support can trace a request without its API key.
See Error handling and Rate limits before production cutover.