Skip to content

Preference Inference

Infer a user's attraction preferences, lifestyle traits, and short bio from their photos and (optionally) their existing self-written bio.

POST /v1/profile/infer-preferences

Request

json
{
  "user_id": "usr_abc",
  "photos": [
    "https://cdn.your-app.com/photos/usr_abc/1.jpg",
    "https://cdn.your-app.com/photos/usr_abc/2.jpg",
    "https://cdn.your-app.com/photos/usr_abc/3.jpg"
  ],
  "bio": "optional existing bio text",
  "name": "optional user display name",
  "age": 28
}
FieldTypeRequiredNotes
user_idstringyesYour stable identifier; opaque to us
photosstring[]yes1–5 publicly-accessible HTTPS URLs
biostringnoUp to 2,000 characters
namestringnoFirst name only is fine
agenumbernoUsed to weight peer-context in inference

Response

json
{
  "request_id": "req_01H…",
  "user_id": "usr_abc",
  "preferences": {
    "lifestyle": ["outdoorsy", "creative", "metropolitan"],
    "personality_traits_sought": ["curious", "expressive"],
    "interests": ["live music", "hiking", "indie film"]
  },
  "bio": "Outdoorsy creative who'd rather be at the trailhead than the office. Wants someone curious enough to show me their favorite indie film and patient enough to enjoy the slow drive there.",
  "gender": "female"
}
FieldTypeNotes
preferencesobjectThree short arrays — lifestyle, traits-sought, interests
biostringPolished bio, 1-2 sentences, ready for direct display
genderstringfemale, male, or unknown if confidence < 0.8

Latency

P50 ~ 4–6 seconds, P95 ~ 8–12 seconds. The endpoint runs vision analysis on each photo plus a final synthesis call, so latency scales with photo count.

For a real-time UX, call this from a background worker after onboarding completes rather than blocking the user on it.

Common errors

CodeWhy
invalid_photosFewer than 1 or more than 5 URLs, or a URL returned non-2xx
unsafe_contentOne or more photos failed our content safety filter
quota_exceededFree tier monthly cap reached — see Pricing

Released under the proprietary GemInHay license.