API publique

Tous les endpoints avec lesquels l’application mobile communique. Ceux qui exigent un jeton sont signalés sur chaque carte.

VERSION v1 FORMAT JSON AUTH Selon l’endpoint

01URL de base

Tous les endpoints se trouvent sous l’URL ci-dessous et renvoient du application/json. Lorsqu’une authentification est requise, le jeton est transmis dans l’en-tête Authorization: Bearer <token> ; la liste indique quels endpoints en exigent un.

https://priamnetwork.com/api/v1

02Endpoints

Les valeurs des exemples de réponse sont indicatives ; les champs et la structure sont réels. La liste des endpoints est générée à partir du registre du code source, et non écrite à la main.

Authentication

POST /v1/auth/register Sans auth. 10 requêtes / 3600 s

Creates an account. The username doubles as the referral code.

Paramètre Type Obligatoire Description
accept_terms string oui Terms acceptance. Must be <code>1</code>.
username string oui 3–32 chars, letters/digits/underscore
password string oui At least 8 characters
confirm_age string oui Age declaration. Must be <code>1</code>.
referrer string — Referrer username
email string oui Required and unique; the only password recovery path
device_id string oui Stable per-device identifier
locale string — Language code
Exemple de réponse
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse",
            "balance": "0.00000000"
        }
    }
}
Erreurs propres à chaque endpoint username_taken email_taken invalid_username invalid_email weak_password unknown_referrer
POST /v1/auth/check-username Sans auth. 60 requêtes / 60 s

Whether a username is available. Gates the sign-up button.

Paramètre Type Obligatoire Description
username string oui 3–32 chars, letters/digits/underscore
Exemple de réponse
{
    "status": "success",
    "data": {
        "available": true
    }
}
Erreurs propres à chaque endpoint invalid_username
POST /v1/auth/check-email Sans auth. 30 requêtes / 3600 s

Whether an email address is available. ⚠️ Tight limit — this is a user-enumeration surface.

Paramètre Type Obligatoire Description
email string oui Address to check
Exemple de réponse
{
    "status": "success",
    "data": {
        "available": false
    }
}
Erreurs propres à chaque endpoint invalid_email
POST /v1/auth/login Sans auth. 10 requêtes / 60 s

Signs in with username and password, returns an access token.

Paramètre Type Obligatoire Description
username string oui Username
password string oui Password
device_id string oui Device id
Exemple de réponse
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Erreurs propres à chaque endpoint invalid_credentials account_suspended
POST /v1/auth/social-nonce Sans auth. 30 requêtes / 900 s

Issues a single-use nonce for the device account picker (Credential Manager). Valid 5 minutes, bound to the device.

Paramètre Type Obligatoire Description
device_id string oui The nonce is bound to this device.
Exemple de réponse
{
    "status": "success",
    "data": {
        "nonce": "a1b2…",
        "expires_in": 300
    }
}
Erreurs propres à chaque endpoint bad_request rate_limited
POST /v1/auth/social-token Sans auth. 10 requêtes / 900 s

Verifies the Google id_token from the native account picker. Signs in when the account exists. When it does NOT, no account is created — returns `signup_required` with a `pending_token`; the signup finishes via `auth/social-complete`.

Paramètre Type Obligatoire Description
provider string oui Only `google` for now.
id_token string oui The signed token returned by Credential Manager.
nonce string oui The value obtained from `auth/social-nonce`.
device_id string oui The SAME device id used for the nonce.
locale string — Device language code (`tr`, `en`). Used only for a NEW account.
signup_flow string — When non-empty, no account is created; returns `signup_required`.
Exemple de réponse
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        },
        "signup_required": true,
        "pending_token": "…",
        "suggested_username": "ibrahim"
    }
}
Erreurs propres à chaque endpoint bad_request unauthorized forbidden unavailable rate_limited
POST /v1/auth/social-complete Sans auth. 10 requêtes / 900 s

Completes a pending social signup with the chosen username and starts a session. The referral code is optional; without it the account is linked to the system account.

Paramètre Type Obligatoire Description
accept_terms string oui Terms acceptance. Must be <code>1</code>.
confirm_age string oui Age declaration. Must be <code>1</code>.
pending_token string oui The value from `auth/social-token`. Single-use, 30 minutes.
username string oui 3–32 chars; lowercase letters, digits, underscore.
device_id string oui The SAME device id used for `auth/social-token`.
referrer string — Username of the referrer. The account must be `active`.
Exemple de réponse
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        }
    }
}
Erreurs propres à chaque endpoint bad_request invalid_username username_taken unknown_referrer email_taken rate_limited
POST /v1/auth/password-forgot Sans auth. 3 requêtes / 900 s

Sends a password reset link. Returns the same response whether or not the address is registered, to prevent account enumeration. No code is sent to an account that is linked to a social login and whose address is not verified yet (the response is still the same), so the owner of a mistyped address cannot take the account; the real owner can still sign in with the social login.

Paramètre Type Obligatoire Description
email string oui The account email address.
Exemple de réponse
{
    "status": "success",
    "data": {
        "sent": true
    }
}
Erreurs propres à chaque endpoint bad_request rate_limited
POST /v1/auth/password-reset-verify Sans auth. 10 requêtes / 900 s

Verifies the 6-digit code from the email and returns a short-lived ticket, required by step 3 to set the new password.

Paramètre Type Obligatoire Description
email string oui The address the code was sent to.
code string oui Six digits. Valid for 10 minutes, dies after 5 wrong tries.
Exemple de réponse
{
    "status": "success",
    "data": {
        "ticket": "a1b2…",
        "expires_in": 600
    }
}
Erreurs propres à chaque endpoint bad_request rate_limited
POST /v1/auth/password-reset-confirm Sans auth. 5 requêtes / 900 s

Spends the ticket and writes the new password. All of the user's sessions are revoked.

Paramètre Type Obligatoire Description
ticket string oui The ticket returned by step 2.
new_password string oui At least 8 characters.
Exemple de réponse
{
    "status": "success",
    "data": {
        "updated": true
    }
}
Erreurs propres à chaque endpoint bad_request rate_limited
POST /v1/auth/password-change Auth. requise 5 requêtes / 300 s

Changes the password. The current password is required. Sessions on other devices are NOT closed.

Paramètre Type Obligatoire Description
current_password string oui The password in use
new_password string oui At least 8 characters
Exemple de réponse
{
    "status": "success",
    "data": {
        "changed": true
    }
}
Erreurs propres à chaque endpoint invalid_password weak_password same_password
POST /v1/auth/refresh Auth. requise 20 requêtes / 3600 s

Rotates the token. Only tokens within 7 days of expiry rotate; the old one is revoked at once.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-09-28T18:00:00+00:00",
        "rotated": true
    }
}
Erreurs propres à chaque endpoint too_early
POST /v1/auth/logout Auth. requise 30 requêtes / 3600 s

Revokes this device's token.

Paramètre Type Obligatoire Description
all_devices bool — Sign out everywhere
Exemple de réponse
{
    "status": "success",
    "data": {
        "revoked": 1
    }
}

Account

POST /v1/me/avatar Auth. requise 10 requêtes / 3600 s

Uploads a profile photo (multipart, field name `file`). JPEG/PNG, max 5 MB. The server re-encodes to a 512×512 square and stores it as JPEG.

Paramètre Type Obligatoire Description
file file oui JPEG or PNG, max 5 MB.
Exemple de réponse
{
    "status": "success",
    "data": {
        "avatar_url": "https://priamnetwork.com/assets/uploads/avatars/2026/08/a1b2….jpg"
    }
}
Erreurs propres à chaque endpoint bad_request rate_limited
POST /v1/me/avatar-remove Auth. requise 10 requêtes / 3600 s

Removes the profile photo and deletes the file from disk.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "avatar_url": null
    }
}
Erreurs propres à chaque endpoint rate_limited
POST /v1/auth/verify-request Auth. requise 5 requêtes / 3600 s

Sends a 6-digit verification code to the account email address (the code is also in the subject). No email is sent if the address is already verified. Within 60 seconds of the last code no new code is issued and no email is sent: the response is `sent:false`, `already_sent:true` and `retry_after` (seconds); the code already sent stays valid.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "sent": true,
        "already_verified": false,
        "already_sent": false,
        "retry_after": 60,
        "expires_in": 600
    }
}
Erreurs propres à chaque endpoint unavailable
POST /v1/auth/verify-confirm Auth. requise 10 requêtes / 900 s

Verifies the 6-digit code from the email and confirms the address.

Paramètre Type Obligatoire Description
code string oui 6 digits. Whitespace is ignored.
Exemple de réponse
{
    "status": "success",
    "data": {
        "verified": true,
        "already_verified": false
    }
}
Erreurs propres à chaque endpoint bad_request rate_limited
GET /v1/me Auth. requise 120 requêtes / 60 s

Profile, balance, current multiplier and open session state.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "id": 4271,
        "username": "ayse",
        "email": "ayse@example.com",
        "email_verified": false,
        "linked_identities": [
            {
                "provider": "google",
                "email": "ayse@gmail.com"
            }
        ],
        "balance": "12.45000000",
        "multiplier": {
            "referral": "1.30",
            "ad_boost": "0.50",
            "streak": "0.20",
            "total": "2.00",
            "cap": "5.0"
        },
        "referrals": {
            "total": 7,
            "active": 3
        },
        "streak": {
            "enabled": true,
            "days": 16,
            "bonus": "0.20",
            "tier": "silver",
            "next": {
                "key": "gold",
                "days": 30,
                "bonus": "0.35",
                "in": 14
            },
            "expires_at": "2026-08-02T18:00:00+00:00",
            "best": 41
        },
        "session": {
            "status": "active",
            "ends_at": "2026-07-31T18:00:00+00:00"
        },
        "dormancy": {
            "enabled": true,
            "idle_days": 12,
            "warn_days": 150,
            "forfeit_days": 180,
            "days_left": 168,
            "warned": false,
            "forfeited_at": null
        },
        "support": {
            "unread": 1
        }
    }
}
POST /v1/me/profile Auth. requise 20 requêtes / 3600 s

Updates the display name and email address. ⚠️ Changing the email RESETS verification and sends a 6-digit code to the new address. Once the new address is verified, social sign-in links (Google) that do not match it are removed and a `security` notification is written for the user.

Paramètre Type Obligatoire Description
display_name string — Up to 64 characters; empty falls back to the username
email string — New address; verification resets when it changes
referral_nudge_optout string — "1" turns off the inviter reminder, "0" turns it on
locale string — Account language. ⚠️ NOTIFICATION TEXT IS WRITTEN FROM THIS COLUMN and frozen at send time. An inactive code falls back to the default.
Exemple de réponse
{
    "status": "success",
    "data": {
        "display_name": "Ayşe",
        "email": "ayse@example.com",
        "email_verified": false,
        "verification_sent": true
    }
}
Erreurs propres à chaque endpoint email_taken no_changes
POST /v1/me/delete Auth. requise 3 requêtes / 3600 s

Deletes the account from inside the app. ⚠️ The username must be typed to confirm. The account closes immediately, sessions are revoked and after 30 days the identity is erased irreversibly; until then support can undo it.

Paramètre Type Obligatoire Description
username string oui The account username — intent confirmation
Exemple de réponse
{
    "status": "success",
    "data": {
        "deleted": true,
        "revoked_sessions": 2
    }
}
Erreurs propres à chaque endpoint username_mismatch deletion_failed
GET /v1/me/transactions Auth. requise 60 requêtes / 60 s

Balance ledger: every movement, its amount and the balance at that moment. Cursor pagination (`before_id`) — no row is skipped when new entries arrive.

Paramètre Type Obligatoire Description
limit int — 1–100, default 50
before_id int — `next_before_id` from the previous response
Exemple de réponse
{
    "status": "success",
    "data": {
        "total": 128,
        "next_before_id": 4412,
        "items": [
            {
                "id": 4461,
                "direction": "credit",
                "amount": "0.30000000",
                "balance_after": "12.45000000",
                "reference": "mining_session",
                "description": "Oturum ödülü",
                "created_at": "2026-07-31T18:00:00+00:00"
            }
        ]
    }
}

Social login

POST /v1/auth/social-start Sans auth. 10 requêtes / 60 s

Starts a social login flow and returns the URL to open in a browser.

Paramètre Type Obligatoire Description
provider string oui Only `google`.
device_id string oui Device id
handover_challenge string oui PKCE S256 (base64url, 43 chars) — binds the handover code to this app
native_failure string — Why the on-device account picker failed, if it did; only written to the server log
Exemple de réponse
{
    "status": "success",
    "data": {
        "flow_id": "a1b2…",
        "start_url": "https://…/api/v1/oauth/start?f=a1b2…",
        "expires_in": 600
    }
}
Erreurs propres à chaque endpoint bad_request unavailable
POST /v1/auth/handover Sans auth. 10 requêtes / 60 s

Exchanges the handover code from social login for an access token. Single use, valid 60 seconds.

Paramètre Type Obligatoire Description
code string oui Handover code from the deep link
handover_verifier string oui Plain verifier for the challenge sent to social-start
device_id string oui Device id
Exemple de réponse
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Erreurs propres à chaque endpoint invalid_grant account_suspended
GET /v1/oauth/start Sans auth. 20 requêtes / 60 s

Redirects the flow to the provider (302). Opened in a browser; does not return JSON.

Paramètre Type Obligatoire Description
f string oui Flow id returned by auth/social-start
Exemple de réponse
{
    "status": "success",
    "data": {
        "302": "https://accounts.google.com/o/oauth2/v2/auth?…"
    }
}
Erreurs propres à chaque endpoint not_found
GET /v1/oauth/google Sans auth. 20 requêtes / 60 s

Google callback. THIS IS THE URL TO PASTE INTO THE GOOGLE CONSOLE. Not called by the app.

Paramètre Type Obligatoire Description
code string oui Authorization code from Google
state string oui CSRF value identifying the flow
Exemple de réponse
{
    "status": "success",
    "data": {
        "302": "priamnetwork://auth?code=…"
    }
}
Erreurs propres à chaque endpoint not_found

Missions

GET /v1/missions Auth. requise 60 requêtes / 60 s

Published missions and the user's status on each. ⚠️ When the system is off it returns `enabled: false` and an EMPTY list.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "enabled": true,
        "items": [
            {
                "id": 12,
                "kind": "info",
                "reward": "8.00000000",
                "title": "Bizi takip et",
                "summary": "…",
                "steps": [
                    "Profili aç",
                    "Takip et"
                ],
                "field_label": "Kullanıcı adın",
                "target_url": "https://…",
                "quota": 500,
                "quota_used": 340,
                "ends_at": null,
                "status": "submitted",
                "reject_reason": ""
            }
        ]
    }
}
POST /v1/missions/submit Auth. requise 10 requêtes / 3600 s

Submits an entry for a mission. ⚠️ The reward lands on the balance when an admin APPROVES it, not on submission.

Paramètre Type Obligatoire Description
mission_id int oui Mission id
payload string oui The requested value (max 2000 chars)
Exemple de réponse
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Erreurs propres à chaque endpoint missions_disabled not_found already_submitted quota_full payload_too_long image_required
POST /v1/missions/submit-image Auth. requise 5 requêtes / 3600 s

Submits a SCREENSHOT for a mission (multipart). ⚠️ Only missions with `answer_type = image` accept it. The reward lands on the balance when an admin APPROVES it, not on submission.

Paramètre Type Obligatoire Description
mission_id int oui Mission id
file file oui JPEG or PNG, up to 5 MB. ⚠️ PDF and SVG are refused: both can carry executable code. The image is re-encoded on the server (EXIF/GPS is stripped).
Exemple de réponse
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Erreurs propres à chaque endpoint missions_disabled not_found already_submitted quota_full text_required proof_rejected

Support

GET /v1/support Auth. requise 60 requêtes / 60 s

The user's own support tickets. ⚠️ Message BODIES are not returned, only the header; use `support/thread` for the conversation.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "topics": [
            "general",
            "account",
            "mining"
        ],
        "body_max": 2000,
        "subject_max": 120,
        "max_active": 3,
        "items": [
            {
                "id": 4,
                "topic": "mining",
                "subject": "Oturum başlamıyor",
                "status": "open",
                "last_sender": "admin",
                "message_count": 3,
                "unread": 1,
                "last_message_at": "2026-09-26T09:10:00Z",
                "created_at": "2026-09-25T18:00:00Z"
            }
        ]
    }
}
GET /v1/support/thread Auth. requise 120 requêtes / 60 s

Messages of one ticket. ⚠️ Does NOT mark as read — that is `support/read`. If fetching counted as reading, an app opened and closed on a notification would clear the unread mark unseen.

Paramètre Type Obligatoire Description
ticket_id int oui Ticket id
Exemple de réponse
{
    "status": "success",
    "data": {
        "id": 4,
        "topic": "mining",
        "subject": "Oturum başlamıyor",
        "status": "open",
        "messages": [
            {
                "id": 11,
                "sender": "user",
                "body": "Şimşeğe basınca hiçbir şey olmuyor.",
                "has_image": true,
                "created_at": "2026-09-25T18:00:00Z"
            }
        ]
    }
}
Erreurs propres à chaque endpoint not_found
GET /v1/support/image Auth. requise 240 requêtes / 60 s

Returns the attachment (screenshot) of a message as BYTES; only to the ticket owner. Someone else's, missing or attachment-less messages get the SAME `not_found`. The response is `no-store`: it must not be cached or written to disk.

Paramètre Type Obligatoire Description
message_id int oui Message id (`id` in the thread)
Exemple de réponse
image/jpeg | image/png (bayt)
Erreurs propres à chaque endpoint not_found
POST /v1/support/open Auth. requise 5 requêtes / 3600 s

Opens a new support ticket. ⚠️ LINKS ARE REFUSED in the text (it keeps a phishing address from being opened in the admin panel); a screenshot can be attached with `support/reply-image`.

Paramètre Type Obligatoire Description
topic string — Topic code (see `topics` in the `support` response). Empty means `general`.
subject string — Subject (max 120 chars). Empty means the first line of the message.
body string oui Message (max 2000 chars)
Exemple de réponse
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Erreurs propres à chaque endpoint link_not_allowed body_too_long too_many_tickets too_many_messages too_fast
POST /v1/support/open-image Auth. requise 5 requêtes / 3600 s

Opens a new support ticket WITH A SCREENSHOT (multipart). Same rules as `support/open`; a body is still required.

Paramètre Type Obligatoire Description
body string oui Message (max 2000 chars)
file file oui JPEG or PNG, up to 5 MB. Re-encoded on the server.
Exemple de réponse
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Erreurs propres à chaque endpoint link_not_allowed body_too_long image_rejected too_many_tickets too_many_messages too_fast
POST /v1/support/reply Auth. requise 20 requêtes / 3600 s

Replies to an existing ticket. ⚠️ A `solved` ticket REOPENS — otherwise a "no, it did not work" message would fall outside the queue. A `closed` ticket is refused.

Paramètre Type Obligatoire Description
ticket_id int oui Ticket id
body string oui Message (max 2000 chars)
Exemple de réponse
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Erreurs propres à chaque endpoint not_found ticket_closed link_not_allowed body_too_long too_many_messages too_fast
POST /v1/support/reply-image Auth. requise 10 requêtes / 3600 s

Replies to a ticket with a SCREENSHOT (multipart). ⚠️ A body is still REQUIRED: an image-only message does not tell the person in the admin panel what they are looking at.

Paramètre Type Obligatoire Description
ticket_id int oui Ticket id
body string oui Message (max 2000 chars)
file file oui JPEG or PNG, up to 5 MB. ⚠️ PDF and SVG are refused: both can carry executable code. The image is re-encoded on the server (EXIF/GPS is stripped).
Exemple de réponse
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Erreurs propres à chaque endpoint not_found ticket_closed link_not_allowed body_too_long image_rejected too_many_messages too_fast
POST /v1/support/read Auth. requise 60 requêtes / 3600 s

Marks admin replies as read.

Paramètre Type Obligatoire Description
ticket_id int oui Ticket id
Exemple de réponse
{
    "status": "success",
    "data": {
        "status": "ok"
    }
}
Erreurs propres à chaque endpoint not_found

Mining

POST /v1/mining/start Auth. requise 5 requêtes / 60 s

Starts a session. The multiplier is computed now and frozen onto the session; later changes in referral activity do not alter it.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "session_id": 128,
        "ends_at": "2026-07-31T18:00:00+00:00",
        "multiplier": "1.80",
        "expected_amount": "0.54000000"
    }
}
Erreurs propres à chaque endpoint session_already_active mining_disabled account_suspended ad_required
GET /v1/mining/status Auth. requise 120 requêtes / 60 s

Remaining time and expected reward of the open session.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "status": "active",
        "seconds_left": 43200,
        "expected_amount": "0.54000000",
        "claimable": false
    }
}
POST /v1/mining/claim Auth. requise 10 requêtes / 60 s

Credits a finished session. A session is never credited twice.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "credited": "0.54000000",
        "balance": "12.99000000"
    }
}
Erreurs propres à chaque endpoint no_session session_not_finished already_claimed

Referrals

GET /v1/referrals Auth. requise 60 requêtes / 60 s

People you referred and how many are mining right now. Only active ones count. Cursor pagination (`before_id`), ordered by `id DESC` — `mining_now` is live and stays out of the ordering, otherwise rows would repeat or vanish across pages. `total` and `active` come from their own query, not from the page.

Paramètre Type Obligatoire Description
limit int — Max 100 (default 50)
before_id int — `next_before_id` from the previous response
Exemple de réponse
{
    "status": "success",
    "data": {
        "total": 137,
        "active": 3,
        "cap": 40,
        "limit": 50,
        "next_before_id": 812,
        "items": [
            {
                "id": 812,
                "username": "mehmet",
                "mining_now": true,
                "status": "active",
                "joined_at": "2026-06-01T10:00:00+00:00",
                "nudge_after": null
            }
        ]
    }
}
POST /v1/referrals/nudge Auth. requise 20 requêtes / 86400 s

Sends a reminder notification to someone you referred whose mining session is off. Once per 12 hours per target. Only your own referrals can be reached.

Paramètre Type Obligatoire Description
user_id int oui `items[].id` from the `referrals` list.
Exemple de réponse
{
    "status": "success",
    "data": {
        "sent": true,
        "nudge_after": "2026-08-28T06:00:00+00:00"
    }
}
Erreurs propres à chaque endpoint not_eligible rate_limited

Ads

GET /v1/ads/status Auth. requise 60 requêtes / 60 s

Ads watched in the current slice of the running session (the session is split into `slices` equal parts), ads watched across the whole session (`session_watched`, capped by `daily_total`), remaining quota, when the next slice starts and any live boost. Rewards are NOT granted here — Google verifies server-to-server.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "watched_today": 3,
        "daily_limit": 5,
        "remaining": 2,
        "slice_limit": 5,
        "slice_count": 2,
        "daily_total": 10,
        "session_watched": 3,
        "available": true,
        "next_available_at": null,
        "slice_index": 1,
        "next_slice_at": "2026-07-30T14:12:00+00:00",
        "next_slice_seconds": 35520,
        "boost": {
            "active": true,
            "multiplier": "0.6667",
            "prm": "0.2000",
            "expires_at": "2026-07-30T19:00:00+00:00",
            "seconds_left": 61200
        },
        "reward": {
            "multiplier": "0.6667",
            "hours": 24,
            "max_stacks": 1,
            "session_step": "0.6667",
            "prm": "0.2000"
        },
        "ad_unit": "ca-app-pub-…/…",
        "ad_unit_fallback": "",
        "required_to_start": true,
        "test_mode": false
    }
}
POST /v1/ads/fill Auth. requise 30 requêtes / 60 s

Reports the outcome of a rewarded-ad load attempt. Sessions start with an ad, so fill rate is a direct measure of revenue: every unfilled attempt means a session that started without an ad.

Paramètre Type Obligatoire Description
result string oui filled · no_fill · error · consent · offline
unit string — primary · fallback · none (defaults to none)
Exemple de réponse
{
    "status": "success",
    "data": {
        "recorded": true
    }
}

Notifications

POST /v1/push/register Auth. requise 10 requêtes / 60 s

Registers the device FCM token. The app must call this on every <code>onNewToken</code>, independently of the login flow. Safe to call repeatedly for the same device.

Paramètre Type Obligatoire Description
device_id string oui Persistent device id (same as in the login request).
fcm_token string oui Firebase registration token.
lang string — Device language. Notification text is picked by this; the default language is used when empty.
Exemple de réponse
{
    "status": "success",
    "data": {
        "registered": true,
        "lang": "tr"
    }
}
Erreurs propres à chaque endpoint bad_request
GET /v1/push/list Auth. requise 60 requêtes / 60 s

In-app notification list. Push is not lossless (device off, permission denied, dead token) — this list is the durable record, and the text is stored already resolved to the language used at send time. `type` values: `announcement`, `mining` (session closed and reward credited), `kyc`, `withdrawal`, `wallet`.

Paramètre Type Obligatoire Description
limit int — Max rows (default 30, max 100).
Exemple de réponse
{
    "status": "success",
    "data": {
        "unread": 2,
        "items": [
            {
                "id": 12,
                "type": "announcement",
                "title": "Yeni sürüm",
                "body": "v1.4 yayında.",
                "data": {
                    "type": "announcement",
                    "id": "7"
                },
                "read": false,
                "created_at": "2026-08-04T10:00:00+00:00"
            }
        ]
    }
}
POST /v1/push/read Auth. requise 60 requêtes / 60 s

Marks a notification read. Without <code>id</code>, marks all of the user's unread notifications.

Paramètre Type Obligatoire Description
id int — Notification id. All when empty.
Exemple de réponse
{
    "status": "success",
    "data": {
        "marked": 3,
        "unread": 0
    }
}
POST /v1/push/delete Auth. requise 60 requêtes / 60 s

Deletes a notification. Without <code>id</code>, deletes the user's READ notifications — unread ones are kept, because destroying an unseen notification in one tap would lose something the user never saw.

Paramètre Type Obligatoire Description
id int — Notification id. All read ones when empty.
Exemple de réponse
{
    "status": "success",
    "data": {
        "deleted": 3,
        "unread": 0
    }
}

Content

GET /v1/config Sans auth. 120 requêtes / 60 s

Startup configuration — which sign-in methods are ENABLED. <b>No auth</b>: social buttons are drawn before sign-in, when no token exists yet. ⚠️ Returns only availability; never a key, app id or secret.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "oauth": {
            "google": true,
            "google_client_id": "…"
        },
        "min_app_version": "",
        "mining_enabled": true
    }
}
Erreurs propres à chaque endpoint unavailable
GET /v1/content/languages Sans auth. 60 requêtes / 60 s

Languages enabled for the app, and the default.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "default": "en",
        "items": [
            {
                "code": "tr",
                "name": "Türkçe",
                "dir": "ltr"
            }
        ]
    }
}
GET /v1/content/translations Sans auth. 60 requêtes / 60 s

The app language pack. Returns an `ETag`; send `If-None-Match` and get **304** when unchanged. Editing a string in the panel changes the stamp immediately — no app release needed to fix wording.

Paramètre Type Obligatoire Description
lang string — Language code; default if omitted
Exemple de réponse
{
    "status": "success",
    "data": {
        "lang": "tr",
        "version": "2026-07-30T18:00:00+00:00",
        "strings": {
            "auth": {
                "sign_in": "Giriş yap"
            }
        }
    }
}
Erreurs propres à chaque endpoint unknown_language
GET /v1/content/announcements Sans auth. 60 requêtes / 60 s

Published announcements.

Paramètre Type Obligatoire Description
lang string — Language code
Exemple de réponse
{
    "status": "success",
    "data": {
        "lang": "tr",
        "items": [
            {
                "id": 4,
                "slug": "v2-lansman",
                "title": "V2 geliyor",
                "body": "…",
                "image_url": "/assets/uploads/2026/07/4fb3b4fddb59d0b05cec86de8aded35a.jpg",
                "link_url": "https://priamnetwork.com/tr/yol-haritasi",
                "published_at": "2026-07-01T09:00:00+00:00"
            }
        ]
    }
}
GET /v1/content/social Sans auth. 60 requêtes / 60 s

Social media accounts. An account left empty or `#` in the panel is OMITTED from the response, so the app never draws a dead button.

Aucun paramètre.

Exemple de réponse
{
    "status": "success",
    "data": {
        "items": [
            {
                "key": "twitter",
                "label": "X / Twitter",
                "url": "https://…"
            }
        ]
    }
}
GET /v1/content/partners Sans auth. 60 requêtes / 60 s

Published partners. No pagination by design: the list is entered by hand and is dozens of rows, not thousands. Rows with `is_active = 0` are never returned. Unlike blog, this endpoint DOES fall back to the default language — a partner name is a proper noun and hiding an untranslated row would drop the organisation from the list. `link_url` is raw; the client filters the scheme.

Paramètre Type Obligatoire Description
lang string — Language code
Exemple de réponse
{
    "status": "success",
    "data": {
        "lang": "tr",
        "items": [
            {
                "id": 3,
                "title": "Örnek Kurum",
                "body": "Ödeme altyapısı sağlayıcısı.",
                "logo_url": "/assets/uploads/2026/08/ornek.png",
                "link_url": "https://ornek.test"
            }
        ]
    }
}
GET /v1/content/faq Sans auth. 60 requêtes / 60 s

Frequently asked questions and their categories.

Paramètre Type Obligatoire Description
lang string — Language code
Exemple de réponse
{
    "status": "success",
    "data": {
        "lang": "tr",
        "groups": [
            {
                "key": "general",
                "label": "Genel"
            }
        ],
        "items": [
            {
                "id": 12,
                "question": "Priam Network tam olarak nedir?",
                "answer": "Android için topluluk destekli bir madencilik ağı.\\nKatkı, cihazın ağda **düzenli ve doğrulanabilir biçimde bulunması** üzerinden ölçülür.",
                "group": "general",
                "group_label": "Genel"
            }
        ]
    }
}
GET /v1/content/whitepaper Sans auth. 60 requêtes / 60 s

Protocol whitepaper, section by section.

Paramètre Type Obligatoire Description
lang string — Language code
Exemple de réponse
{
    "status": "success",
    "data": {
        "lang": "tr",
        "title": "Priam Network Whitepaper",
        "lead": "Ağın nasıl çalıştığı…",
        "updated": "2026-07-01",
        "sections": [
            {
                "title": "Genel bakış",
                "body": "Priam Network, mobil cihazların…"
            }
        ]
    }
}

Blog

GET /v1/blog/list Sans auth. 60 requêtes / 60 s

Published blog posts. Pagination uses a TWO-PART cursor: `before_published_at` + `before_id`, ordered by `published_at DESC, id DESC` — an id-only cursor is not enough because publish dates can be scheduled. `featured` is NOT part of the ordering. No language fallback: a post without text in the requested language does not appear at all.

Paramètre Type Obligatoire Description
lang string — Language code; unknown values fall back to the default
limit int — 1–50, default 20
before_published_at string — `next_before_published_at` from the previous response — send WITH `before_id`
before_id int — `next_before_id` from the previous response
Exemple de réponse
{
    "status": "success",
    "data": {
        "lang": "tr",
        "total": 5,
        "limit": 20,
        "next_before_published_at": "2026-07-19 08:00:00",
        "next_before_id": 3,
        "items": [
            {
                "id": 3,
                "slug": "madencilik-nasil-calisir",
                "title": "Madencilik nasıl çalışır",
                "excerpt": "Cihazın hesaplama yapmıyor…",
                "cover_url": "/assets/uploads/2026/07/4fb3b4fddb59d0b05cec86de8aded35a.jpg",
                "featured": false,
                "published_at": "2026-07-19T08:00:00+00:00"
            }
        ]
    }
}
GET /v1/blog/post Sans auth. 60 requêtes / 60 s

Full body of one post, addressed by SLUG (slug is per-language and is the post identity in that language). Unpublished posts also return `post_not_found` — saying "exists but draft" would leak draft titles. Body is `blocks` format: newline-separated lines in a markdown subset. The server emits no HTML; parsing is the client's job.

Paramètre Type Obligatoire Description
lang string — Language code
slug string oui Post slug in that language
Exemple de réponse
{
    "status": "success",
    "data": {
        "lang": "tr",
        "id": 3,
        "slug": "madencilik-nasil-calisir",
        "title": "Madencilik nasıl çalışır",
        "excerpt": "Cihazın hesaplama yapmıyor…",
        "body": "Giriş paragrafı.\n### Alt başlık\n- madde",
        "cover_url": null,
        "featured": false,
        "published_at": "2026-07-19T08:00:00+00:00"
    }
}
Erreurs propres à chaque endpoint post_not_found

03Erreurs

Les erreurs utilisent les codes d’état HTTP standard ; le champ error.code du corps de la réponse est lisible par machine et indépendant de la langue. Les clients doivent se baser sur le code, pas sur le message — les messages suivent Accept-Language.

Codes d’erreur courants

Code HTTP Signification
bad_request 400 Malformed request or missing parameter.
unauthorized 401 Missing, expired or revoked token.
forbidden 403 Account suspended.
not_found 404 No such endpoint.
method_not_allowed 405 Method not accepted by this endpoint.
rate_limited 429 Rate limit exceeded. Retry after retry_after seconds.
app_outdated 426 App version too old, update required.
server_error 500 Unexpected server error.
unavailable 503 Service temporarily unavailable.

04Limites de débit

Les limites sont définies par endpoint et indiquées sur chaque carte. Pour les requêtes authentifiées, le compteur est lié à l’utilisateur ; pour les requêtes anonymes, à l’IP. Le dépassement d’une limite renvoie 429 avec Retry-After ; chaque réponse contient aussi X-RateLimit-Limit, X-RateLimit-Remaining et X-RateLimit-Reset.

Si vous avez besoin d’un quota plus élevé, écrivez-nous via l’assistance.

Toujours bloqué ?

Écrivez-nous — nous répondons sous deux jours ouvrés.