Start: search site
For a site where a person sets filters and opens a page of profiles. Turning the page is not a rejection. A one-by-one deck is the swipe app start.
The API key lives only on your server.
What to store
| Field | Why |
|---|---|
network_id |
the PUT /v1/members/{your id} response |
match_id |
a conversation with someone from the network |
next_after |
if you pull events yourself |
| the viewer’s filters | age, intent, language, height, radius — on your side, sent with every feed request |
Filters in the query do not rewrite the profile. The profile still decides whom the person can see. The query can only narrow that.
Consent and profile
Same as a swipe app: the toggle is off by default, PUT when it is turned on and when the profile changes, consent.network: false when it is turned off, DELETE on erasure. Texts are in Members and consent.
Age on the profile (age_min, age_max) is a mutual range. A search filter does not widen it.
A page of results
curl "https://api.pereval.dating/v1/members/user-123/feed?limit=20&age_min=28&age_max=35&intent=serious&language=ru" \
-H "Authorization: Bearer $PEREVAL_API_KEY"
| Parameter | What happens |
|---|---|
age_min, age_max |
The intersection with the profile range. An empty intersection is an empty page and 200, not an error. age_min greater than age_max in the query is 422 |
intent |
One intent from the viewer’s profile: serious, casual, friendship, arrangement. An intent they don’t have is 422 |
language |
An ISO 639-1 code, two letters. A shared language, or both consents to other languages, is still required |
gender |
Only the opposite of the viewer. The viewer’s own gender is 422 |
radius_km, height_min, height_max, verified_only, lat, lon |
As in the feed |
Mark the profile as coming from the Pereval network. Label a translated bio and offer the original. videos[].poster is the clip’s still: show it without downloading the file. Playback from url is optional and silent until the visitor turns sound on for every clip at once.
The next page
The response includes next_cursor while the page may not be the last. The next request uses the same filters and cursor=<next_cursor>. No cursor in the response means the pages are over. A bad cursor is 422.
Repeating the same request without a cursor returns the same people and does not spend the limit.
A dislike is not part of this flow. It hides a person for 30 days and is only for an explicit rejection (“don’t show again”). Scrolling and “next page” are not dislikes.
The limit
200 distinct people a day (UTC) per user of yours, shared with the Worldwide feed if you have one. How many new people can still be shown is remaining_today. People already shown today come back and do not decrease the remainder. At zero, new people stop and people already shown today remain, so the grid can refresh.
The network does not accept a message without a mutual like. A like from the card is POST /v1/likes. The match and the chat then work as in the swipe app.
Done when
- Filters on the site go into the feed request and are no wider than the viewer’s profile.
- Pages follow
next_cursor. Repeating a page does not decreaseremaining_today. - Scrolling does not send a dislike. A dislike exists only for an explicit rejection.
- At zero, new people do not appear, and people already opened today open again.
- Like, match and messages work. There is no message without a match.
- The card shows the person’s app. A translation is labeled.
Your own profiles are not in this feed: you show them with your own search. Before production, use the test environment.