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.

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 decrease remaining_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.

Unclear? Ask a developer

Read the reply and continue the conversation on this site using the private link you receive after sending. Incoming email is not accepted.