Skip to content
Developers

Build on SeekIQ. Sync jobs, push applicants and react to every hiring step.

A REST API with scoped keys, signed webhooks and a careers embed that drops into any site. Hiring decisions stay with people, in the API too.

What you can build

Base URL and keys

Every call goes to one host. A workspace hosted in another data region has its own host; a call that reaches the wrong one answers 308 with the right address.

Base URL
https://app.seekiq.io/api/v1
Format
JSON over HTTPS, times in UTC
Where keys come from
Settings > API and webhooks, by an owner
OpenAPI file
openapi.yaml

Get a key

  1. Sign in as a workspace owner and open Settings > API and webhooks.
  2. Create a key, name it after the system that will use it and pick only the scopes it needs.
  3. Copy the key when it is shown. SeekIQ keeps only a hash and the visible prefix, so it is shown once.
  4. Store it as a secret on your server. Never put a key in a browser, an app bundle or a public repository.

Authentication

Send the key as a bearer token on every request. Live keys start with iq_live_ and test keys with iq_test_. Both act on the same workspace data; a test key only has a lower rate limit.

curl
curl "https://app.seekiq.io/api/v1/jobs?status=open&limit=10" \
  -H "Authorization: Bearer $SEEKIQ_API_KEY"

There are two kinds of key. A service key acts for the workspace. A user-attributed key acts for one named member, every write is audited under that person and their current role caps what the key can do.

Each key carries scopes such as jobs:read, applications:write or webhooks:manage. A request outside them answers 403 insufficient_scope. Each endpoint in the reference lists the scopes it needs.

403 insufficient_scope
{
  "error": {
    "code": "insufficient_scope",
    "message": "This key does not have jobs:write",
    "details": null,
    "request_id": "req_01JB7X4M2Q8Z3K4P"
  }
}

Rate limits

Limits are per key, as sliding windows. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset; a 429 adds Retry-After in seconds.

Live keys
600 requests a minute, at most 100 in any 10 seconds
Test keys
120 requests a minute
Writes
120 a minute for both kinds
Rejections
20 an hour per key
HTTP
HTTP/1.1 200 OK
Content-Type: application/json
RateLimit-Limit: 600
RateLimit-Remaining: 587
RateLimit-Reset: 23
SeekIQ-Request-Id: req_01JB7X4M2Q8Z3K4P

Send an Idempotency-Key header (a UUID) on POST requests. A retry with the same key returns the first answer for 24 hours instead of acting twice.

Versioning

The version is in the path. New fields, endpoints, event types and enum values can arrive at any time, so ignore fields you do not know and accept new values. A breaking change gets a new version; an endpoint on its way out sends Deprecation and Sunset headers at least six months ahead.

Every response carries SeekIQ-Request-Id. Quote it when you write to support.

Decisions stay with people

Advance, hold and reject go through the decisions endpoint with a user-attributed key, so each one is recorded against a person. A service key cannot make decisions. AI values arrive with their evidence, never as a bare number.

Extension and mobile

Browser extension

SeekIQ for recruiters adds job posting help and one-click candidate saving to Chrome. It signs in with the recruiter's own SeekIQ account and needs no API key.

Open in the Chrome Web Store

Recruiter app

The recruiter app uses its own first-party API. It is not open to other clients; build integrations on the public API on this page.

Questions about the API? Write to support@fastflowup.com.