API Reference

Build on Rodeo Recruiting

Search, export, and reveal licensed insurance agents from your own tools. Authenticated with a bearer key — no OAuth required.

curl -s -H "Authorization: Bearer rk_live_…" \
  "https://app.rodeorecruiting.com/api/v1/agents/search?state=FL&state=TX"

Authentication

Every request to /api/v1/* requires an API key passed as a bearer token in the Authorization header.

Authorization: Bearer rk_live_…

Generate a key in Settings → API & webhooks. Keys are workspace-scoped — they can search, export, and reveal agents for your workspace. They cannot change workspace settings.

Store keys securely. A key is shown only once at creation and cannot be recovered — generate a new one if you lose it. Never commit keys to version control.

Base URL

https://app.rodeorecruiting.com/api/v1

All endpoints are versioned under /api/v1. The spec is available as a machine-readable OpenAPI 3.1 document.

GET /agents/export

Export agents in bulk — up to 200 agents per page (default 200). Identical filtering to search; the same masking and 10k ceiling apply. Use for bulk data pulls to your own systems.

Export is rate-limited to 30 requests/min (tighter than search's 120/min).

Example

curl -s \
  -H "Authorization: Bearer rk_live_…" \
  "https://app.rodeorecruiting.com/api/v1/agents/export?state=FL&category=life&pageSize=200"

Additional parameters

ParamTypeDescription
pageSizeintegerRows per page. Min 1, max 200. Default 200.

All search parameters are also accepted. See Search agents for the full list.

Response

{
  "ok": true,
  "data": {
    "data": [ ...AgentRow ],
    "page": 1,
    "pageSize": 200,
    "total": 1432,
    "hasMore": true
  }
}

POST /agents/{id}/reveal

Unlock the full contact details (phone, email) for an agent. Spends one reveal credit from your workspace balance on the first reveal. Re-revealing an already-unlocked agent spends no credit (creditsSpent: 0).

The agent must be within your covered states. Returns 402 Payment Required when your workspace has no active subscription or no remaining reveal credits.

Example

curl -s -X POST \
  -H "Authorization: Bearer rk_live_…" \
  "https://app.rodeorecruiting.com/api/v1/agents/cm1abc123/reveal"

Response

{
  "ok": true,
  "data": {
    "revealed": true,
    "phone": "(305) 555-0100",
    "email": "jane.smith@example.com",
    "credits": {
      "used": 51,
      "total": 300,
      "topUp": 0
    },
    "creditsSpent": 1
  }
}

revealed is always true on success. phone and email are the real unmasked values. The credits meter reflects your workspace balance after this reveal: total is null for unlimited (National) plans. creditsSpent is 0 when the agent was already unlocked by your workspace (a no-cost re-view) or when your plan is unlimited.

Rate limits

All /api/v1/* responses carry IETF draft rate-limit headers so you can adapt your request pace without hitting a 429:

HeaderDescription
RateLimit-LimitMaximum requests allowed in the current window.
RateLimit-RemainingRequests remaining in the current window.
RateLimit-ResetSeconds until the window resets (a new slot opens).
Retry-AfterOn 429 — seconds to wait before retrying.

Limits per endpoint

EndpointLimitWindow
GET /agents/search120 requests1 minute
GET /agents/export30 requests1 minute
POST /agents/{id}/reveal60 requests1 minute

Limits are per workspace (keyed on your API key's org).

Response format

Every response is JSON. Successful responses:

{ "ok": true, "data": { ... } }

Error responses:

{
  "ok": false,
  "error": {
    "code": "UNAUTHENTICATED",       // machine-readable code
    "message": "Invalid or missing API key — pass Authorization: Bearer rk_live_…",
    "fields": { ... },              // only on VALIDATION (400)
    "retryAfterSec": 42             // only on RATE_LIMITED (429)
  }
}

Error codes

CodeHTTPMeaning
UNAUTHENTICATED401Missing or invalid API key.
FORBIDDEN403Key lacks access to this action.
VALIDATION400Invalid query parameters. See fields for details.
NOT_FOUND404Agent not found or outside your covered states.
RATE_LIMITED429Too many requests. Retry after Retry-After seconds.
PAYMENT_REQUIRED402No active subscription or no reveal credits.
INTERNAL500Server error. Try again shortly.

Webhooks

Register an HTTPS endpoint in Settings → API & webhooks to receive signed POST deliveries when events occur in your workspace (e.g. agent revealed, pipeline stage changed).

Request headers

HeaderDescription
X-RR-Webhook-IdStable delivery ID — idempotency key across retries.
X-RR-Webhook-TimestampUnix timestamp (seconds) of the delivery attempt.
X-RR-SignatureHMAC-SHA256 signature. Format: sha256=<hex>.
X-RR-Signature-PreviousPresent during key rotation grace window. Accept either header to verify (rotation tolerance).

Verifying a delivery

Compute HMAC-SHA256 over the pre-image ${X-RR-Webhook-Timestamp}.${rawBody} using your endpoint's signing secret. The timestamp is inside the MAC so a replayed (body, signature) pair under a different timestamp will not match.

  1. Read X-RR-Webhook-Timestamp from the request headers.
  2. Concatenate: "${X-RR-Webhook-Timestamp}." + rawBody
  3. Compute HMAC-SHA256(secret, preImage) and hex-encode the digest.
  4. Compare to the value after sha256= in X-RR-Signature.
  5. During key rotation, also accept X-RR-Signature-Previous.

Node.js example

const crypto = require('node:crypto')

function verify(secret, timestamp, rawBody, signature) {
  const preImage = `${timestamp}.${rawBody}`
  const expected = 'sha256=' + crypto
    .createHmac('sha256', secret)
    .update(preImage)
    .digest('hex')
  return crypto.timingSafeEqual(
    Buffer.from(expected),
    Buffer.from(signature)
  )
}

// In your webhook handler:
const ts  = req.headers['x-rr-webhook-timestamp']
const sig = req.headers['x-rr-signature']
if (!verify(SIGNING_SECRET, ts, req.rawBody, sig)) {
  return res.status(401).send('Invalid signature')
}
Use crypto.timingSafeEqual (or equivalent) for the comparison — a plain === is vulnerable to timing attacks.

OpenAPI spec

The full machine-readable OpenAPI 3.1 spec is available at:

https://app.rodeorecruiting.com/api/v1/openapi.json
curl -s "https://app.rodeorecruiting.com/api/v1/openapi.json" | jq '.openapi, (.paths | keys)'

No authentication required — the spec is public. Import it into Postman, Insomnia, or any OpenAPI-compatible client to get auto-complete and inline docs for every endpoint.

Ready to build on Rodeo?

Create your API key in Settings → API & webhooks and start querying agents in minutes.