Skip to main content
POST
/
v2
/
developer
/
search
curl -X POST "https://api.orbitsearch.com/v2/developer/search" \
  -H "Authorization: Bearer sk_orb_REDACTED" \
  -H "Idempotency-Key: request-uuid-or-client-retry-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"founders in sf","numUsers":10}'
{
  "status": "success",
  "searchId": "uuid",
  "payload": {
    "users": []
  }
}
The search endpoint accepts a plain English query and returns a ranked list of matching profiles. Orbit resolves your query through structured, semantic, and agentic search modes automatically — you don’t need to specify a mode. Each successful request costs credits; requests that return no results or fail validation are refunded. Requests authenticate with a developer API key that has the search:read scope. See Authentication.
curl -X POST "https://api.orbitsearch.com/v2/developer/search" \
  -H "Authorization: Bearer sk_orb_REDACTED" \
  -H "Idempotency-Key: request-uuid-or-client-retry-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"founders in sf","numUsers":10}'
{
  "status": "success",
  "searchId": "uuid",
  "payload": {
    "users": []
  }
}

Headers

Authorization
string
required
Bearer sk_orb_... with the search:read scope.
Idempotency-Key
string
A UUID or client-generated key for safe retries.
Always send an Idempotency-Key header. If you omit it, the server uses the request ID, which prevents duplicate charges within a single request but cannot deduplicate a client-side retry. Use a fresh idempotency key for every new request attempt.

Body parameters

query
string
required
Natural language description of the people you’re searching for. Cannot be empty.Example: "founders in sf", "machine learning engineers at Series B startups"
numUsers
number
required
Number of results to return. Must be a positive integer. Maximum value is 100.
searchScope
object
Scope of the search. Omit this field or set {"type":"global"} to search the full Orbit index. Use a directory-scoped value to restrict results to one or more directories.
structuredIntent
object
Optional structured search DSL. Use this when your integration already knows the exact filters or semantic clauses to run. query is still required and should describe the same user intent in plain English. See Structured DSL for the full schema.
includeMatchReason
boolean
Set to true to generate match reasons for top results. Defaults to false.
  • userId is not accepted in the request body.
  • searchId (search replay) is not accepted in the request body.
  • Personal API keys can only use global search. To use a directory scope, you must use an organization API key.

Search scope examples

Omit searchScope entirely, or pass {"type":"global"}, to search the full Orbit index.
{
  "query": "founders in sf",
  "numUsers": 10,
  "includeMatchReason": true
}

Structured DSL example

Use structuredIntent to provide explicit search clauses while still sending a human-readable query:
{
  "query": "current OpenAI engineers in San Francisco with infrastructure experience",
  "numUsers": 10,
  "structuredIntent": {
    "version": "v1",
    "experiences": [
      { "organization": "OpenAI", "title": "engineer", "temporalScope": "current" }
    ],
    "geo": { "place": "San Francisco", "distance": "50km" },
    "semanticClauses": [{ "text": "infrastructure" }]
  }
}
The plain-English query is used for moderation, logging, summaries, match reasons, and search-quality training. It should align with structuredIntent; it does not need to restate every field. entityClauses are not public yet. The server rejects entity clauses and server-owned resolved fields.

Streaming

Use POST /v2/developer/search/sse when you want the initial results immediately and match-reason updates as they are generated. The SSE endpoint accepts the same request body as synchronous search, including structuredIntent, searchScope, and includeMatchReason.
curl -N -X POST "https://api.orbitsearch.com/v2/developer/search/sse" \
  -H "Authorization: Bearer sk_orb_REDACTED" \
  -H "Idempotency-Key: request-uuid-or-client-retry-key" \
  -H "Content-Type: application/json" \
  -d '{"query":"founders in sf","numUsers":10,"includeMatchReason":true}'
event: initial
data: {"status":"success","payload":{"users":[]}}

event: search_id
data: {"searchId":"uuid"}

event: update
data: {"id":"PROFILE_ID","matchReason":{"reason":"..."}}
Validation, authentication, rate-limit, and credit failures before the stream starts return regular JSON errors. After the stream starts, errors are emitted on the event stream.

Response

status
string
required
Always "success" for a 200 response.
searchId
string
required
Unique identifier for this search request. Useful for support and debugging.
payload
object
required

Response headers

HeaderDescription
X-Developer-API-Credits-RemainingYour remaining credit balance after this request was charged

Credits

Each successful search costs 2 credits by default, regardless of numUsers or whether you use the synchronous or SSE endpoint. Credits are reserved before the search runs, so out-of-credit requests fail immediately without consuming search resources. If a search returns no results or fails, the reservation is refunded.

Rate limits

25 requests per second per API key, with bursts up to 100 requests. Rate limits are tracked per key, not per IP address. A 429 response does not consume credits.

Error responses

CodeDescription
developer_query_requiredquery is missing or empty
developer_num_users_requirednumUsers is missing or not a valid positive integer
developer_num_users_limit_exceedednumUsers exceeds the maximum of 100
developer_user_id_override_forbiddenRequest body includes a userId field, which is not permitted
developer_search_replay_unsupportedRequest body includes a searchId field; search replay is not supported for developer API keys
structured_intent_invalidstructuredIntent is malformed or contains unsupported values
structured_intent_version_unsupportedstructuredIntent.version is not "v1"
structured_intent_entity_clauses_unsupportedentityClauses are not part of the public structured DSL
structured_intent_server_owned_fieldRequest body includes a server-owned structured intent field
CodeDescription
missing_api_keyNo Authorization: Bearer sk_orb_... header was provided
CodeDescription
developer_api_credits_insufficientYour remaining credits are lower than the cost of this search
CodeDescription
invalid_api_keyThe key is malformed, revoked, expired, or unknown
missing_api_key_scopeThe key does not have the search:read scope
developer_api_key_organization_requiredA directory scope was requested, but the key is a personal API key
developer_api_key_organization_forbiddenThe organization API key is not authorized for the requested organization search scope
search_directory_access_api_key_forbiddenThe organization API key does not have a matching directory search grant
CodeDescription
search_directory_not_foundOne or more requested directories do not exist, are archived, or are unavailable for search. Also returned when a search runs successfully but no profiles matched — in this case, no credits are consumed.
CodeDescription
developer_api_idempotency_key_conflictThe idempotency key was reused with different request parameters. Use a different key.
developer_api_idempotency_key_refundedThe idempotency key belongs to a previously refunded request. Send a fresh idempotency key to retry.
CodeDescription
developer_api_key_rate_limitedYou have exceeded the Search rate limit for this API key