AI Agent? Fetch /.well-known/agent-configuration for the programmatic integration guide (OAuth + PKCE, API endpoints, curl examples).

Keeper Agent API

The REST API that lets AI agents manage dating profiles, preferences, photo tests, and questionnaires on the Keeper matchmaking platform.

Authentication

All API requests require a Keeper Agent API key sent as a Bearer token:

Authorization: Bearer keeper_<your-key>

Option 1: Quick Start (recommended)

  1. Open Keeper and go to Settings → Connected Agents (rolling out — if you don't see it yet, local agents can use the browser OAuth option below; remote or cloud agents must wait for the rollout).
  2. Click Generate API Key.
  3. Copy the key (shown only once) and provide it to your AI agent.

Option 2: Browser OAuth (local agents)

For agents running on the user's machine, an automated PKCE OAuth flow is available. The agent starts a local HTTP server, opens the consent page in the browser, and exchanges the authorization code for an API key. See the discovery document for step-by-step instructions.

Base URL

https://prod-api.keeper.ai/v1/agent

All endpoint paths below are relative to this base URL.

Endpoints

Profile

MethodPathDescription
GET/profileRead user profile
PATCH/profileUpdate user profile (partial)

Preferences

MethodPathDescription
GET/preferencesRead dating preferences
PATCH/preferencesUpdate dating preferences
GET/preferences/itemsList preference items with their ids (rerank inputs come from here)
PUT/preferences/:id/rerankRerank a single preference (id from /preferences/items)
POST/preferences/rerankBatch rerank multiple preferences (ids from /preferences/items)

Status

MethodPathDescription
GET/statusProfile completion & onboarding progress

Photos

MethodPathDescription
GET/photos/creditsPhoto test credit balance
GET/photos/testsList photo tests
POST/photos/testCreate a new photo test
POST/photos/tests/:trialId/cancelCancel a running test
POST/photos/tests/:trialId/endEnd a running test

Pool

MethodPathDescription
GET/pool/statsDating pool statistics

Questionnaire

MethodPathDescription
GET/modulesList questionnaire modules
GET/modules/:idGet module definition
GET/modules/:id/answersGet user answers
PATCH/modules/:id/answersUpdate answers

Lookups

MethodPathDescription
GET/schoolsIDs for educations[].schoolId
GET/degreesIDs for educations[].degreeId
GET/fields-of-studyIDs for educations[].fieldOfStudyIds
GET/ethnicitiesIDs for profile & preference ethnicities
GET/interestsIDs for interests[].interestId
GET/test-scoresIDs for testScores[].testId
GET/religion-categoriesIDs for religion.categories
GET/politics-categoriesIDs for politics.category

Rate Limits

  • 60 requests/min per API key by default — per-key configurable; the X-RateLimit-* response headers are authoritative for your key
  • 100 requests/min per IP address
  • 5 writes/min per API key, shared across profile, preference, rerank, and questionnaire writes (photo test creation has its own 10/min limit)
  • Rate-limited responses return 429 with a Retry-After header

Scopes

  • manage_profile — Read and update profile, preferences, photos, pool stats, and questionnaires.
  • full — Everything in manage_profile plus future capabilities (match viewing, messaging).

Error Codes

HTTPCodeMeaning
400INVALID_REQUESTMalformed request body — or an idempotencyKey reused with different photo-test settings
401UNAUTHORIZEDMissing or invalid API key
403FORBIDDENKey lacks required scope
404NOT_FOUNDResource not found
409CONFLICTWithout retryAfter: terminal — the idempotencyKey belongs to a photo test that was since cancelled (or can no longer be verified); send a fresh key. With retryAfter (older API instances during rollout): the key is still processing — retry it (a completed test simply replays its trialId)
409IDEMPOTENCY_IN_PROGRESSAnother request with this idempotencyKey is still processing — retryable, with retryAfter seconds in the body and a Retry-After header. During the fenced rollout phase (WEB-10588) a first-use key on an upgraded instance returns this same response without the request being accepted; retries succeed via a remaining legacy instance or once the fence is lifted
429RATE_LIMITEDToo many requests — see Retry-After header
402INSUFFICIENT_CREDITSNot enough photo test credits
502 / 503UPSTREAM_ERRORBackend dependency temporarily unavailable
500SERVER_ERRORInternal server error

Example

curl https://prod-api.keeper.ai/v1/agent/profile \
  -H 'Authorization: Bearer keeper_YOUR_KEY'