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-preferencesRequest
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
}| Field | Type | Required | Notes |
|---|---|---|---|
| user_id | string | yes | Your stable identifier; opaque to us |
| photos | string[] | yes | 1–5 publicly-accessible HTTPS URLs |
| bio | string | no | Up to 2,000 characters |
| name | string | no | First name only is fine |
| age | number | no | Used 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"
}| Field | Type | Notes |
|---|---|---|
| preferences | object | Three short arrays — lifestyle, traits-sought, interests |
| bio | string | Polished bio, 1-2 sentences, ready for direct display |
| gender | string | female, 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
| Code | Why |
|---|---|
invalid_photos | Fewer than 1 or more than 5 URLs, or a URL returned non-2xx |
unsafe_content | One or more photos failed our content safety filter |
quota_exceeded | Free tier monthly cap reached — see Pricing |
