How the network works
Who is who
| Term | What it is |
|---|---|
| Platform | A dating app, website or bot connected to the network. In the API, a platform is called partner |
| Environment | Each platform has two: test and live. Each has its own API key, signing secret and webhook URL. The test environment sees only other test platforms and the sandbox |
| Member | A platform’s user who turned on “show me in the network”. The platform knows them by their external_id; the network, by their network_id |
| Feed | Profiles of members from other platforms who are a good fit for your user |
| Like, dislike, match | A like means “I like them”; a dislike means “saw them and didn’t like”. A mutual like creates a match and opens chat |
| Event | A notification from the network to your server: a like arrived, a match was created, a new message, a message was read. It arrives as a webhook, or you pull it yourself with GET /v1/events |
How data flows
Anna uses your app, and John has an account on another platform. They meet through their own apps. The platform servers call the Pereval network API.
- Profiles. Anna and John opt in to the network. Each platform’s server sends its user’s profile with
PUT /v1/members/{external_id}. - Feed. Anna opens her feed. Your server calls
GET /v1/members/{external_id}/feedfor Anna. If John meets the feed criteria, the network returns his profile. - Like. Anna likes John. Your server calls
POST /v1/likes, and the network delivers alike.receivedevent to John’s platform server. - Match. John likes Anna back. His server calls
POST /v1/likes. The network creates a match and delivers amatch.createdevent to both servers. - Message. Anna writes to John. Your server calls
POST /v1/matches/{match_id}/messages. The network delivers the message to John’s platform server in amessage.createdevent and adds a translation when needed.
Who the feed shows
A person appears in your user’s feed if all of the following are true:
- they are of the opposite gender;
- each person’s age is within the other’s range;
- they are within 50 km or the viewer’s
radius_kmfilter (or in the same city and country if there are no coordinates) — in the Worldwide feed distance doesn’t matter, but both turned Worldwide on; - they share a language, or both agreed to chat in other languages;
- they share an intent;
- they were active in the last 30 days;
- your user has not liked them and has not disliked them in the last 30 days, and neither has blocked the other.
Recently active people come first. The network does not return your own users in the feed: you show them yourself, as before.
Pages are returned with a next_cursor. Repeating the same request returns the same people. A member gets at most 200 distinct people a day: showing them again does not spend the limit. Details are in Feed, likes, matches. Which request to send from a swipe app, a search site and a bot is in the starts.
Translation
Each member has a primary language — the first one in languages. The member speaks every language in languages, and the network never translates from them. If a text — a profile bio or a message — is in a language the reader doesn’t speak, the network translates it into the reader’s primary language and returns the original alongside it:
- in the feed and profiles —
bio,bio_original,bio_translated; - in messages —
text,text_original,translated.
Translation runs in the background. A bio is translated into the languages of the people reading it: when a reader with a new primary language appears, they get the original on first view, and the translation is prepared for their next feeds. A message is delivered to the other person once its translation is ready.
The network detects the language of the text itself. Short replies (“ok”, “hi!”) can’t be detected reliably, so the language is picked among the author’s languages — keep them accurate, primary first.
Show an “AI-translated” label and let the user see the original. If translation fails, the message is still delivered — in the original, with translated: false.
Since version 0.5 the network translates into 38 languages: ru, en, uk, be, kk, de, fr, es, it, pt, nl, pl, cs, sk, ro, hu, bg, sr, hr, el, tr, sv, da, fi, he, ar, fa, hi, ja, ko, zh, vi, th, id, ka, hy, az, uz. GET /v1/languages returns the list. Other languages may be listed in languages — the person speaks them, but there is no translation into them.
What the network stores and what it doesn’t
| Stores | Does not store |
|---|---|
| The member’s profile, while they are in the network | Email, phone number, documents |
| The time and version of the consent text | Exact coordinates — rounds them to ~1 km |
| Likes and matches | |
| Messages within matches — up to 90 days from sending | |
| Events — 7 days, dislikes — 30 days |
When a member is removed from the live network database, their profile, likes, dislikes and blocks are erased; the other person’s conversation history remains without the name and photos. If an erased chat has a report, a moderation copy is retained in the live database for 90 days from erasure. Separately, reports and personal photo-check materials, including unresolved disputes, are kept for up to 60 days in the live database from original report submission or check creation, then up to 30 days in closed backups. Appeals, updates and decisions do not extend the period. Deleting materials does not approve photos or lift a block; seek review before the 60-day deadline. Turned-off participation is not removal: the person is hidden and their chats go on. All retention periods, separate backup retention and platform obligations are in the network rules.
Reliability
- Each change and its events are written together — an event is not lost even if your server was unavailable.
- Undelivered webhooks are retried for up to 3 days. You can also pull what you missed:
GET /v1/eventsreturns events from the last 7 days. - All write requests are idempotent wherever possible: a repeated profile
PUT, a repeated like and a repeated block break nothing.