API gbangba

Gbogbo endpoint tí ìṣàfilọ́lẹ̀ orí fóònù ń bá sọ̀rọ̀. A ti sàmì sí àwọn tí ó nílò token lórí káàdì kọ̀ọ̀kan.

Ẹ̀DÀ v1 FỌ́Ọ̀MÁÀTÌ JSON ÌJẸ́RÌÍSÍ Fún endpoint kọ̀ọ̀kan

01URL ìpìlẹ̀

Gbogbo àwọn endpoint wà lábẹ́ URL ìsàlẹ̀ yìí, wọ́n sì ń dá application/json padà. Níbi tí a ti nílò ìjẹ́rìísí, token náà ń lọ sínú header Authorization: Bearer <token>; àtòjọ náà sàmì sí àwọn endpoint tí ó nílò rẹ̀.

https://priamnetwork.com/api/v1

02Àwọn endpoint

Àwọn iye inú àwọn àpẹẹrẹ ìdáhùn wà fún àpèjúwe; àwọn pápá àti ìrísí jẹ́ òótọ́. Àtòjọ endpoint ni a ṣe jáde láti inú àkọsílẹ̀ tó wà nínú kóòdù orísun, kì í ṣe pé a fi ọwọ́ kọ ọ́.

Authentication

POST /v1/auth/register Kò sí ìjẹ́rìísí 10 ìbéèrè / 3600 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
accept_terms string bẹ́ẹ̀ ni Terms acceptance. Must be <code>1</code>.
username string bẹ́ẹ̀ ni 3–32 chars, letters/digits/underscore
password string bẹ́ẹ̀ ni At least 8 characters
confirm_age string bẹ́ẹ̀ ni Age declaration. Must be <code>1</code>.
referrer string — Referrer username
email string bẹ́ẹ̀ ni Required and unique; the only password recovery path
device_id string bẹ́ẹ̀ ni Stable per-device identifier
locale string — Language code
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse",
            "balance": "0.00000000"
        }
    }
}
Àwọn àṣìṣe pàtó sí endpoint username_taken email_taken invalid_username invalid_email weak_password unknown_referrer
POST /v1/auth/check-username Kò sí ìjẹ́rìísí 60 ìbéèrè / 60 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
username string bẹ́ẹ̀ ni 3–32 chars, letters/digits/underscore
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "available": true
    }
}
Àwọn àṣìṣe pàtó sí endpoint invalid_username
POST /v1/auth/check-email Kò sí ìjẹ́rìísí 30 ìbéèrè / 3600 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
email string bẹ́ẹ̀ ni Address to check
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "available": false
    }
}
Àwọn àṣìṣe pàtó sí endpoint invalid_email
POST /v1/auth/login Kò sí ìjẹ́rìísí 10 ìbéèrè / 60 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
username string bẹ́ẹ̀ ni Username
password string bẹ́ẹ̀ ni Password
device_id string bẹ́ẹ̀ ni Device id
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Àwọn àṣìṣe pàtó sí endpoint invalid_credentials account_suspended
POST /v1/auth/social-nonce Kò sí ìjẹ́rìísí 30 ìbéèrè / 900 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
device_id string bẹ́ẹ̀ ni The nonce is bound to this device.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "nonce": "a1b2…",
        "expires_in": 300
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request rate_limited
POST /v1/auth/social-token Kò sí ìjẹ́rìísí 10 ìbéèrè / 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`.

Pàrámítà Irú Pọndandan Àpèjúwe
provider string bẹ́ẹ̀ ni Only `google` for now.
id_token string bẹ́ẹ̀ ni The signed token returned by Credential Manager.
nonce string bẹ́ẹ̀ ni The value obtained from `auth/social-nonce`.
device_id string bẹ́ẹ̀ ni 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`.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        },
        "signup_required": true,
        "pending_token": "…",
        "suggested_username": "ibrahim"
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request unauthorized forbidden unavailable rate_limited
POST /v1/auth/social-complete Kò sí ìjẹ́rìísí 10 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
accept_terms string bẹ́ẹ̀ ni Terms acceptance. Must be <code>1</code>.
confirm_age string bẹ́ẹ̀ ni Age declaration. Must be <code>1</code>.
pending_token string bẹ́ẹ̀ ni The value from `auth/social-token`. Single-use, 30 minutes.
username string bẹ́ẹ̀ ni 3–32 chars; lowercase letters, digits, underscore.
device_id string bẹ́ẹ̀ ni The SAME device id used for `auth/social-token`.
referrer string — Username of the referrer. The account must be `active`.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        }
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request invalid_username username_taken unknown_referrer email_taken rate_limited
POST /v1/auth/password-forgot Kò sí ìjẹ́rìísí 3 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
email string bẹ́ẹ̀ ni The account email address.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "sent": true
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request rate_limited
POST /v1/auth/password-reset-verify Kò sí ìjẹ́rìísí 10 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
email string bẹ́ẹ̀ ni The address the code was sent to.
code string bẹ́ẹ̀ ni Six digits. Valid for 10 minutes, dies after 5 wrong tries.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "ticket": "a1b2…",
        "expires_in": 600
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request rate_limited
POST /v1/auth/password-reset-confirm Kò sí ìjẹ́rìísí 5 ìbéèrè / 900 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
ticket string bẹ́ẹ̀ ni The ticket returned by step 2.
new_password string bẹ́ẹ̀ ni At least 8 characters.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "updated": true
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request rate_limited
POST /v1/auth/password-change Ìjẹ́rìísí pọndandan 5 ìbéèrè / 300 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
current_password string bẹ́ẹ̀ ni The password in use
new_password string bẹ́ẹ̀ ni At least 8 characters
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "changed": true
    }
}
Àwọn àṣìṣe pàtó sí endpoint invalid_password weak_password same_password
POST /v1/auth/refresh Ìjẹ́rìísí pọndandan 20 ìbéèrè / 3600 s

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

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-09-28T18:00:00+00:00",
        "rotated": true
    }
}
Àwọn àṣìṣe pàtó sí endpoint too_early
POST /v1/auth/logout Ìjẹ́rìísí pọndandan 30 ìbéèrè / 3600 s

Revokes this device's token.

Pàrámítà Irú Pọndandan Àpèjúwe
all_devices bool — Sign out everywhere
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "revoked": 1
    }
}

Account

POST /v1/me/avatar Ìjẹ́rìísí pọndandan 10 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
file file bẹ́ẹ̀ ni JPEG or PNG, max 5 MB.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "avatar_url": "https://priamnetwork.com/assets/uploads/avatars/2026/08/a1b2….jpg"
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request rate_limited
POST /v1/me/avatar-remove Ìjẹ́rìísí pọndandan 10 ìbéèrè / 3600 s

Removes the profile photo and deletes the file from disk.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "avatar_url": null
    }
}
Àwọn àṣìṣe pàtó sí endpoint rate_limited
POST /v1/auth/verify-request Ìjẹ́rìísí pọndandan 5 ìbéèrè / 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.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "sent": true,
        "already_verified": false,
        "already_sent": false,
        "retry_after": 60,
        "expires_in": 600
    }
}
Àwọn àṣìṣe pàtó sí endpoint unavailable
POST /v1/auth/verify-confirm Ìjẹ́rìísí pọndandan 10 ìbéèrè / 900 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
code string bẹ́ẹ̀ ni 6 digits. Whitespace is ignored.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "verified": true,
        "already_verified": false
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request rate_limited
GET /v1/me Ìjẹ́rìísí pọndandan 120 ìbéèrè / 60 s

Profile, balance, current multiplier and open session state.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "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 Ìjẹ́rìísí pọndandan 20 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
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.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "display_name": "Ayşe",
        "email": "ayse@example.com",
        "email_verified": false,
        "verification_sent": true
    }
}
Àwọn àṣìṣe pàtó sí endpoint email_taken no_changes
POST /v1/me/delete Ìjẹ́rìísí pọndandan 3 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
username string bẹ́ẹ̀ ni The account username — intent confirmation
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "deleted": true,
        "revoked_sessions": 2
    }
}
Àwọn àṣìṣe pàtó sí endpoint username_mismatch deletion_failed
GET /v1/me/transactions Ìjẹ́rìísí pọndandan 60 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
limit int — 1–100, default 50
before_id int — `next_before_id` from the previous response
Àpẹẹrẹ ìdáhùn
{
    "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 Kò sí ìjẹ́rìísí 10 ìbéèrè / 60 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
provider string bẹ́ẹ̀ ni Only `google`.
device_id string bẹ́ẹ̀ ni Device id
handover_challenge string bẹ́ẹ̀ ni 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
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "flow_id": "a1b2…",
        "start_url": "https://…/api/v1/oauth/start?f=a1b2…",
        "expires_in": 600
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request unavailable
POST /v1/auth/handover Kò sí ìjẹ́rìísí 10 ìbéèrè / 60 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
code string bẹ́ẹ̀ ni Handover code from the deep link
handover_verifier string bẹ́ẹ̀ ni Plain verifier for the challenge sent to social-start
device_id string bẹ́ẹ̀ ni Device id
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Àwọn àṣìṣe pàtó sí endpoint invalid_grant account_suspended
GET /v1/oauth/start Kò sí ìjẹ́rìísí 20 ìbéèrè / 60 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
f string bẹ́ẹ̀ ni Flow id returned by auth/social-start
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "302": "https://accounts.google.com/o/oauth2/v2/auth?…"
    }
}
Àwọn àṣìṣe pàtó sí endpoint not_found
GET /v1/oauth/google Kò sí ìjẹ́rìísí 20 ìbéèrè / 60 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
code string bẹ́ẹ̀ ni Authorization code from Google
state string bẹ́ẹ̀ ni CSRF value identifying the flow
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "302": "priamnetwork://auth?code=…"
    }
}
Àwọn àṣìṣe pàtó sí endpoint not_found

Missions

GET /v1/missions Ìjẹ́rìísí pọndandan 60 ìbéèrè / 60 s

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

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "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 Ìjẹ́rìísí pọndandan 10 ìbéèrè / 3600 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
mission_id int bẹ́ẹ̀ ni Mission id
payload string bẹ́ẹ̀ ni The requested value (max 2000 chars)
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Àwọn àṣìṣe pàtó sí endpoint missions_disabled not_found already_submitted quota_full payload_too_long image_required
POST /v1/missions/submit-image Ìjẹ́rìísí pọndandan 5 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
mission_id int bẹ́ẹ̀ ni Mission id
file file bẹ́ẹ̀ ni 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).
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Àwọn àṣìṣe pàtó sí endpoint missions_disabled not_found already_submitted quota_full text_required proof_rejected

Support

GET /v1/support Ìjẹ́rìísí pọndandan 60 ìbéèrè / 60 s

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

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "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 Ìjẹ́rìísí pọndandan 120 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
ticket_id int bẹ́ẹ̀ ni Ticket id
Àpẹẹrẹ ìdáhùn
{
    "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"
            }
        ]
    }
}
Àwọn àṣìṣe pàtó sí endpoint not_found
GET /v1/support/image Ìjẹ́rìísí pọndandan 240 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
message_id int bẹ́ẹ̀ ni Message id (`id` in the thread)
Àpẹẹrẹ ìdáhùn
image/jpeg | image/png (bayt)
Àwọn àṣìṣe pàtó sí endpoint not_found
POST /v1/support/open Ìjẹ́rìísí pọndandan 5 ìbéèrè / 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`.

Pàrámítà Irú Pọndandan Àpèjúwe
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 bẹ́ẹ̀ ni Message (max 2000 chars)
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Àwọn àṣìṣe pàtó sí endpoint link_not_allowed body_too_long too_many_tickets too_many_messages too_fast
POST /v1/support/open-image Ìjẹ́rìísí pọndandan 5 ìbéèrè / 3600 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
body string bẹ́ẹ̀ ni Message (max 2000 chars)
file file bẹ́ẹ̀ ni JPEG or PNG, up to 5 MB. Re-encoded on the server.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Àwọn àṣìṣe pàtó sí endpoint link_not_allowed body_too_long image_rejected too_many_tickets too_many_messages too_fast
POST /v1/support/reply Ìjẹ́rìísí pọndandan 20 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
ticket_id int bẹ́ẹ̀ ni Ticket id
body string bẹ́ẹ̀ ni Message (max 2000 chars)
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Àwọn àṣìṣe pàtó sí endpoint not_found ticket_closed link_not_allowed body_too_long too_many_messages too_fast
POST /v1/support/reply-image Ìjẹ́rìísí pọndandan 10 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
ticket_id int bẹ́ẹ̀ ni Ticket id
body string bẹ́ẹ̀ ni Message (max 2000 chars)
file file bẹ́ẹ̀ ni 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).
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Àwọn àṣìṣe pàtó sí endpoint not_found ticket_closed link_not_allowed body_too_long image_rejected too_many_messages too_fast
POST /v1/support/read Ìjẹ́rìísí pọndandan 60 ìbéèrè / 3600 s

Marks admin replies as read.

Pàrámítà Irú Pọndandan Àpèjúwe
ticket_id int bẹ́ẹ̀ ni Ticket id
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "status": "ok"
    }
}
Àwọn àṣìṣe pàtó sí endpoint not_found

Mining

POST /v1/mining/start Ìjẹ́rìísí pọndandan 5 ìbéèrè / 60 s

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

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "session_id": 128,
        "ends_at": "2026-07-31T18:00:00+00:00",
        "multiplier": "1.80",
        "expected_amount": "0.54000000"
    }
}
Àwọn àṣìṣe pàtó sí endpoint session_already_active mining_disabled account_suspended ad_required
GET /v1/mining/status Ìjẹ́rìísí pọndandan 120 ìbéèrè / 60 s

Remaining time and expected reward of the open session.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "status": "active",
        "seconds_left": 43200,
        "expected_amount": "0.54000000",
        "claimable": false
    }
}
POST /v1/mining/claim Ìjẹ́rìísí pọndandan 10 ìbéèrè / 60 s

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

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "credited": "0.54000000",
        "balance": "12.99000000"
    }
}
Àwọn àṣìṣe pàtó sí endpoint no_session session_not_finished already_claimed

Referrals

GET /v1/referrals Ìjẹ́rìísí pọndandan 60 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
limit int — Max 100 (default 50)
before_id int — `next_before_id` from the previous response
Àpẹẹrẹ ìdáhùn
{
    "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 Ìjẹ́rìísí pọndandan 20 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
user_id int bẹ́ẹ̀ ni `items[].id` from the `referrals` list.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "sent": true,
        "nudge_after": "2026-08-28T06:00:00+00:00"
    }
}
Àwọn àṣìṣe pàtó sí endpoint not_eligible rate_limited

Ads

GET /v1/ads/status Ìjẹ́rìísí pọndandan 60 ìbéèrè / 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.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "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 Ìjẹ́rìísí pọndandan 30 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
result string bẹ́ẹ̀ ni filled · no_fill · error · consent · offline
unit string — primary · fallback · none (defaults to none)
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "recorded": true
    }
}

Notifications

POST /v1/push/register Ìjẹ́rìísí pọndandan 10 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
device_id string bẹ́ẹ̀ ni Persistent device id (same as in the login request).
fcm_token string bẹ́ẹ̀ ni Firebase registration token.
lang string — Device language. Notification text is picked by this; the default language is used when empty.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "registered": true,
        "lang": "tr"
    }
}
Àwọn àṣìṣe pàtó sí endpoint bad_request
GET /v1/push/list Ìjẹ́rìísí pọndandan 60 ìbéèrè / 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`.

Pàrámítà Irú Pọndandan Àpèjúwe
limit int — Max rows (default 30, max 100).
Àpẹẹrẹ ìdáhùn
{
    "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 Ìjẹ́rìísí pọndandan 60 ìbéèrè / 60 s

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

Pàrámítà Irú Pọndandan Àpèjúwe
id int — Notification id. All when empty.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "marked": 3,
        "unread": 0
    }
}
POST /v1/push/delete Ìjẹ́rìísí pọndandan 60 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
id int — Notification id. All read ones when empty.
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "deleted": 3,
        "unread": 0
    }
}

Content

GET /v1/config Kò sí ìjẹ́rìísí 120 ìbéèrè / 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.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "oauth": {
            "google": true,
            "google_client_id": "…"
        },
        "min_app_version": "",
        "mining_enabled": true
    }
}
Àwọn àṣìṣe pàtó sí endpoint unavailable
GET /v1/content/languages Kò sí ìjẹ́rìísí 60 ìbéèrè / 60 s

Languages enabled for the app, and the default.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "default": "en",
        "items": [
            {
                "code": "tr",
                "name": "Türkçe",
                "dir": "ltr"
            }
        ]
    }
}
GET /v1/content/translations Kò sí ìjẹ́rìísí 60 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
lang string — Language code; default if omitted
Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "lang": "tr",
        "version": "2026-07-30T18:00:00+00:00",
        "strings": {
            "auth": {
                "sign_in": "Giriş yap"
            }
        }
    }
}
Àwọn àṣìṣe pàtó sí endpoint unknown_language
GET /v1/content/announcements Kò sí ìjẹ́rìísí 60 ìbéèrè / 60 s

Published announcements.

Pàrámítà Irú Pọndandan Àpèjúwe
lang string — Language code
Àpẹẹrẹ ìdáhùn
{
    "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 Kò sí ìjẹ́rìísí 60 ìbéèrè / 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.

Kò gba pàrámítà kankan.

Àpẹẹrẹ ìdáhùn
{
    "status": "success",
    "data": {
        "items": [
            {
                "key": "twitter",
                "label": "X / Twitter",
                "url": "https://…"
            }
        ]
    }
}
GET /v1/content/partners Kò sí ìjẹ́rìísí 60 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
lang string — Language code
Àpẹẹrẹ ìdáhùn
{
    "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 Kò sí ìjẹ́rìísí 60 ìbéèrè / 60 s

Frequently asked questions and their categories.

Pàrámítà Irú Pọndandan Àpèjúwe
lang string — Language code
Àpẹẹrẹ ìdáhùn
{
    "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 Kò sí ìjẹ́rìísí 60 ìbéèrè / 60 s

Protocol whitepaper, section by section.

Pàrámítà Irú Pọndandan Àpèjúwe
lang string — Language code
Àpẹẹrẹ ìdáhùn
{
    "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 Kò sí ìjẹ́rìísí 60 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
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
Àpẹẹrẹ ìdáhùn
{
    "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 Kò sí ìjẹ́rìísí 60 ìbéèrè / 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.

Pàrámítà Irú Pọndandan Àpèjúwe
lang string — Language code
slug string bẹ́ẹ̀ ni Post slug in that language
Àpẹẹrẹ ìdáhùn
{
    "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"
    }
}
Àwọn àṣìṣe pàtó sí endpoint post_not_found

03Àwọn àṣìṣe

Àwọn àṣìṣe ń lo àwọn kóòdù ipò HTTP àgbáyé; pápá error.code nínú ara ìdáhùn jẹ́ èyí tí ẹ̀rọ lè kà, kò sì sinmi lé èdè. Ó yẹ kí àwọn client pinnu ní ìbámu pẹ̀lú kóòdù náà, kì í ṣe ìfiránṣẹ́ — àwọn ìfiránṣẹ́ ń tẹ̀lé Accept-Language.

Àwọn kóòdù àṣìṣe tó wọ́pọ̀

Kóòdù HTTP Ìtumọ̀
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.

04Ìdíwọ̀n ìbéèrè

Àwọn ìdíwọ̀n wà fún endpoint kọ̀ọ̀kan, a sì kọ wọ́n sórí gbogbo káàdì. Fún àwọn ìbéèrè tí a ti jẹ́rìísí, òǹkà náà ń tẹ̀lé olùmúlò; fún àwọn aláìlórúkọ, ó ń tẹ̀lé IP. Ìkọjá ìdíwọ̀n yóò dá 429 padà pẹ̀lú Retry-After; gbogbo ìdáhùn tún ní X-RateLimit-Limit, X-RateLimit-Remaining àti X-RateLimit-Reset.

Tí ẹ bá nílò ìpín tó ga jù, ẹ kọ̀wé sí wa nípasẹ̀ ìrànlọ́wọ́.

Ṣé ẹ ṣì ní ìṣòro?

Ẹ kọ̀wé sí wa — a máa ń fèsì láàárín ọjọ́ iṣẹ́ méjì.