API publik

Setiap endpoint yang dihubungi aplikasi seluler. Endpoint yang memerlukan token ditandai di setiap kartu.

VERSI v1 FORMAT JSON AUTENTIKASI Tergantung endpoint

01URL dasar

Semua endpoint berada pada URL berikut dan mengembalikan application/json. Jika autentikasi diperlukan, token dikirim di header Authorization: Bearer <token>; daftar ini menandai endpoint mana yang memerlukannya.

https://priamnetwork.com/api/v1

02Endpoint

Nilai dalam contoh respons hanya ilustrasi; kolom dan strukturnya nyata. Daftar endpoint dihasilkan dari registri di kode sumber, bukan ditulis manual.

Authentication

POST /v1/auth/register Tanpa autentikasi 10 permintaan / 3600 detik

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

Parameter Tipe Wajib Deskripsi
accept_terms string ya Terms acceptance. Must be <code>1</code>.
username string ya 3–32 chars, letters/digits/underscore
password string ya At least 8 characters
confirm_age string ya Age declaration. Must be <code>1</code>.
referrer string — Referrer username
email string ya Required and unique; the only password recovery path
device_id string ya Stable per-device identifier
locale string — Language code
Contoh respons
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse",
            "balance": "0.00000000"
        }
    }
}
Kesalahan khusus endpoint username_taken email_taken invalid_username invalid_email weak_password unknown_referrer
POST /v1/auth/check-username Tanpa autentikasi 60 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
username string ya 3–32 chars, letters/digits/underscore
Contoh respons
{
    "status": "success",
    "data": {
        "available": true
    }
}
Kesalahan khusus endpoint invalid_username
POST /v1/auth/check-email Tanpa autentikasi 30 permintaan / 3600 detik

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

Parameter Tipe Wajib Deskripsi
email string ya Address to check
Contoh respons
{
    "status": "success",
    "data": {
        "available": false
    }
}
Kesalahan khusus endpoint invalid_email
POST /v1/auth/login Tanpa autentikasi 10 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
username string ya Username
password string ya Password
device_id string ya Device id
Contoh respons
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Kesalahan khusus endpoint invalid_credentials account_suspended
POST /v1/auth/social-nonce Tanpa autentikasi 30 permintaan / 900 detik

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

Parameter Tipe Wajib Deskripsi
device_id string ya The nonce is bound to this device.
Contoh respons
{
    "status": "success",
    "data": {
        "nonce": "a1b2…",
        "expires_in": 300
    }
}
Kesalahan khusus endpoint bad_request rate_limited
POST /v1/auth/social-token Tanpa autentikasi 10 permintaan / 900 detik

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`.

Parameter Tipe Wajib Deskripsi
provider string ya Only `google` for now.
id_token string ya The signed token returned by Credential Manager.
nonce string ya The value obtained from `auth/social-nonce`.
device_id string ya 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`.
Contoh respons
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        },
        "signup_required": true,
        "pending_token": "…",
        "suggested_username": "ibrahim"
    }
}
Kesalahan khusus endpoint bad_request unauthorized forbidden unavailable rate_limited
POST /v1/auth/social-complete Tanpa autentikasi 10 permintaan / 900 detik

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.

Parameter Tipe Wajib Deskripsi
accept_terms string ya Terms acceptance. Must be <code>1</code>.
confirm_age string ya Age declaration. Must be <code>1</code>.
pending_token string ya The value from `auth/social-token`. Single-use, 30 minutes.
username string ya 3–32 chars; lowercase letters, digits, underscore.
device_id string ya The SAME device id used for `auth/social-token`.
referrer string — Username of the referrer. The account must be `active`.
Contoh respons
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        }
    }
}
Kesalahan khusus endpoint bad_request invalid_username username_taken unknown_referrer email_taken rate_limited
POST /v1/auth/password-forgot Tanpa autentikasi 3 permintaan / 900 detik

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.

Parameter Tipe Wajib Deskripsi
email string ya The account email address.
Contoh respons
{
    "status": "success",
    "data": {
        "sent": true
    }
}
Kesalahan khusus endpoint bad_request rate_limited
POST /v1/auth/password-reset-verify Tanpa autentikasi 10 permintaan / 900 detik

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

Parameter Tipe Wajib Deskripsi
email string ya The address the code was sent to.
code string ya Six digits. Valid for 10 minutes, dies after 5 wrong tries.
Contoh respons
{
    "status": "success",
    "data": {
        "ticket": "a1b2…",
        "expires_in": 600
    }
}
Kesalahan khusus endpoint bad_request rate_limited
POST /v1/auth/password-reset-confirm Tanpa autentikasi 5 permintaan / 900 detik

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

Parameter Tipe Wajib Deskripsi
ticket string ya The ticket returned by step 2.
new_password string ya At least 8 characters.
Contoh respons
{
    "status": "success",
    "data": {
        "updated": true
    }
}
Kesalahan khusus endpoint bad_request rate_limited
POST /v1/auth/password-change Perlu autentikasi 5 permintaan / 300 detik

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

Parameter Tipe Wajib Deskripsi
current_password string ya The password in use
new_password string ya At least 8 characters
Contoh respons
{
    "status": "success",
    "data": {
        "changed": true
    }
}
Kesalahan khusus endpoint invalid_password weak_password same_password
POST /v1/auth/refresh Perlu autentikasi 20 permintaan / 3600 detik

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

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-09-28T18:00:00+00:00",
        "rotated": true
    }
}
Kesalahan khusus endpoint too_early
POST /v1/auth/logout Perlu autentikasi 30 permintaan / 3600 detik

Revokes this device's token.

Parameter Tipe Wajib Deskripsi
all_devices bool — Sign out everywhere
Contoh respons
{
    "status": "success",
    "data": {
        "revoked": 1
    }
}

Account

POST /v1/me/avatar Perlu autentikasi 10 permintaan / 3600 detik

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.

Parameter Tipe Wajib Deskripsi
file file ya JPEG or PNG, max 5 MB.
Contoh respons
{
    "status": "success",
    "data": {
        "avatar_url": "https://priamnetwork.com/assets/uploads/avatars/2026/08/a1b2….jpg"
    }
}
Kesalahan khusus endpoint bad_request rate_limited
POST /v1/me/avatar-remove Perlu autentikasi 10 permintaan / 3600 detik

Removes the profile photo and deletes the file from disk.

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "avatar_url": null
    }
}
Kesalahan khusus endpoint rate_limited
POST /v1/auth/verify-request Perlu autentikasi 5 permintaan / 3600 detik

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.

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "sent": true,
        "already_verified": false,
        "already_sent": false,
        "retry_after": 60,
        "expires_in": 600
    }
}
Kesalahan khusus endpoint unavailable
POST /v1/auth/verify-confirm Perlu autentikasi 10 permintaan / 900 detik

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

Parameter Tipe Wajib Deskripsi
code string ya 6 digits. Whitespace is ignored.
Contoh respons
{
    "status": "success",
    "data": {
        "verified": true,
        "already_verified": false
    }
}
Kesalahan khusus endpoint bad_request rate_limited
GET /v1/me Perlu autentikasi 120 permintaan / 60 detik

Profile, balance, current multiplier and open session state.

Tidak menerima parameter.

Contoh respons
{
    "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 Perlu autentikasi 20 permintaan / 3600 detik

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.

Parameter Tipe Wajib Deskripsi
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.
Contoh respons
{
    "status": "success",
    "data": {
        "display_name": "Ayşe",
        "email": "ayse@example.com",
        "email_verified": false,
        "verification_sent": true
    }
}
Kesalahan khusus endpoint email_taken no_changes
POST /v1/me/delete Perlu autentikasi 3 permintaan / 3600 detik

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.

Parameter Tipe Wajib Deskripsi
username string ya The account username — intent confirmation
Contoh respons
{
    "status": "success",
    "data": {
        "deleted": true,
        "revoked_sessions": 2
    }
}
Kesalahan khusus endpoint username_mismatch deletion_failed
GET /v1/me/transactions Perlu autentikasi 60 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
limit int — 1–100, default 50
before_id int — `next_before_id` from the previous response
Contoh respons
{
    "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 Tanpa autentikasi 10 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
provider string ya Only `google`.
device_id string ya Device id
handover_challenge string ya 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
Contoh respons
{
    "status": "success",
    "data": {
        "flow_id": "a1b2…",
        "start_url": "https://…/api/v1/oauth/start?f=a1b2…",
        "expires_in": 600
    }
}
Kesalahan khusus endpoint bad_request unavailable
POST /v1/auth/handover Tanpa autentikasi 10 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
code string ya Handover code from the deep link
handover_verifier string ya Plain verifier for the challenge sent to social-start
device_id string ya Device id
Contoh respons
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Kesalahan khusus endpoint invalid_grant account_suspended
GET /v1/oauth/start Tanpa autentikasi 20 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
f string ya Flow id returned by auth/social-start
Contoh respons
{
    "status": "success",
    "data": {
        "302": "https://accounts.google.com/o/oauth2/v2/auth?…"
    }
}
Kesalahan khusus endpoint not_found
GET /v1/oauth/google Tanpa autentikasi 20 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
code string ya Authorization code from Google
state string ya CSRF value identifying the flow
Contoh respons
{
    "status": "success",
    "data": {
        "302": "priamnetwork://auth?code=…"
    }
}
Kesalahan khusus endpoint not_found

Missions

GET /v1/missions Perlu autentikasi 60 permintaan / 60 detik

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

Tidak menerima parameter.

Contoh respons
{
    "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 Perlu autentikasi 10 permintaan / 3600 detik

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

Parameter Tipe Wajib Deskripsi
mission_id int ya Mission id
payload string ya The requested value (max 2000 chars)
Contoh respons
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Kesalahan khusus endpoint missions_disabled not_found already_submitted quota_full payload_too_long image_required
POST /v1/missions/submit-image Perlu autentikasi 5 permintaan / 3600 detik

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.

Parameter Tipe Wajib Deskripsi
mission_id int ya Mission id
file file ya 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).
Contoh respons
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Kesalahan khusus endpoint missions_disabled not_found already_submitted quota_full text_required proof_rejected

Support

GET /v1/support Perlu autentikasi 60 permintaan / 60 detik

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

Tidak menerima parameter.

Contoh respons
{
    "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 Perlu autentikasi 120 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
ticket_id int ya Ticket id
Contoh respons
{
    "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"
            }
        ]
    }
}
Kesalahan khusus endpoint not_found
GET /v1/support/image Perlu autentikasi 240 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
message_id int ya Message id (`id` in the thread)
Contoh respons
image/jpeg | image/png (bayt)
Kesalahan khusus endpoint not_found
POST /v1/support/open Perlu autentikasi 5 permintaan / 3600 detik

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`.

Parameter Tipe Wajib Deskripsi
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 ya Message (max 2000 chars)
Contoh respons
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Kesalahan khusus endpoint link_not_allowed body_too_long too_many_tickets too_many_messages too_fast
POST /v1/support/open-image Perlu autentikasi 5 permintaan / 3600 detik

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

Parameter Tipe Wajib Deskripsi
body string ya Message (max 2000 chars)
file file ya JPEG or PNG, up to 5 MB. Re-encoded on the server.
Contoh respons
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Kesalahan khusus endpoint link_not_allowed body_too_long image_rejected too_many_tickets too_many_messages too_fast
POST /v1/support/reply Perlu autentikasi 20 permintaan / 3600 detik

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.

Parameter Tipe Wajib Deskripsi
ticket_id int ya Ticket id
body string ya Message (max 2000 chars)
Contoh respons
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Kesalahan khusus endpoint not_found ticket_closed link_not_allowed body_too_long too_many_messages too_fast
POST /v1/support/reply-image Perlu autentikasi 10 permintaan / 3600 detik

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.

Parameter Tipe Wajib Deskripsi
ticket_id int ya Ticket id
body string ya Message (max 2000 chars)
file file ya 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).
Contoh respons
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Kesalahan khusus endpoint not_found ticket_closed link_not_allowed body_too_long image_rejected too_many_messages too_fast
POST /v1/support/read Perlu autentikasi 60 permintaan / 3600 detik

Marks admin replies as read.

Parameter Tipe Wajib Deskripsi
ticket_id int ya Ticket id
Contoh respons
{
    "status": "success",
    "data": {
        "status": "ok"
    }
}
Kesalahan khusus endpoint not_found

Mining

POST /v1/mining/start Perlu autentikasi 5 permintaan / 60 detik

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

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "session_id": 128,
        "ends_at": "2026-07-31T18:00:00+00:00",
        "multiplier": "1.80",
        "expected_amount": "0.54000000"
    }
}
Kesalahan khusus endpoint session_already_active mining_disabled account_suspended ad_required
GET /v1/mining/status Perlu autentikasi 120 permintaan / 60 detik

Remaining time and expected reward of the open session.

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "status": "active",
        "seconds_left": 43200,
        "expected_amount": "0.54000000",
        "claimable": false
    }
}
POST /v1/mining/claim Perlu autentikasi 10 permintaan / 60 detik

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

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "credited": "0.54000000",
        "balance": "12.99000000"
    }
}
Kesalahan khusus endpoint no_session session_not_finished already_claimed

Referrals

GET /v1/referrals Perlu autentikasi 60 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
limit int — Max 100 (default 50)
before_id int — `next_before_id` from the previous response
Contoh respons
{
    "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 Perlu autentikasi 20 permintaan / 86400 detik

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.

Parameter Tipe Wajib Deskripsi
user_id int ya `items[].id` from the `referrals` list.
Contoh respons
{
    "status": "success",
    "data": {
        "sent": true,
        "nudge_after": "2026-08-28T06:00:00+00:00"
    }
}
Kesalahan khusus endpoint not_eligible rate_limited

Ads

GET /v1/ads/status Perlu autentikasi 60 permintaan / 60 detik

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.

Tidak menerima parameter.

Contoh respons
{
    "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 Perlu autentikasi 30 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
result string ya filled · no_fill · error · consent · offline
unit string — primary · fallback · none (defaults to none)
Contoh respons
{
    "status": "success",
    "data": {
        "recorded": true
    }
}

Notifications

POST /v1/push/register Perlu autentikasi 10 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
device_id string ya Persistent device id (same as in the login request).
fcm_token string ya Firebase registration token.
lang string — Device language. Notification text is picked by this; the default language is used when empty.
Contoh respons
{
    "status": "success",
    "data": {
        "registered": true,
        "lang": "tr"
    }
}
Kesalahan khusus endpoint bad_request
GET /v1/push/list Perlu autentikasi 60 permintaan / 60 detik

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`.

Parameter Tipe Wajib Deskripsi
limit int — Max rows (default 30, max 100).
Contoh respons
{
    "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 Perlu autentikasi 60 permintaan / 60 detik

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

Parameter Tipe Wajib Deskripsi
id int — Notification id. All when empty.
Contoh respons
{
    "status": "success",
    "data": {
        "marked": 3,
        "unread": 0
    }
}
POST /v1/push/delete Perlu autentikasi 60 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
id int — Notification id. All read ones when empty.
Contoh respons
{
    "status": "success",
    "data": {
        "deleted": 3,
        "unread": 0
    }
}

Content

GET /v1/config Tanpa autentikasi 120 permintaan / 60 detik

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.

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "oauth": {
            "google": true,
            "google_client_id": "…"
        },
        "min_app_version": "",
        "mining_enabled": true
    }
}
Kesalahan khusus endpoint unavailable
GET /v1/content/languages Tanpa autentikasi 60 permintaan / 60 detik

Languages enabled for the app, and the default.

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "default": "en",
        "items": [
            {
                "code": "tr",
                "name": "Türkçe",
                "dir": "ltr"
            }
        ]
    }
}
GET /v1/content/translations Tanpa autentikasi 60 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
lang string — Language code; default if omitted
Contoh respons
{
    "status": "success",
    "data": {
        "lang": "tr",
        "version": "2026-07-30T18:00:00+00:00",
        "strings": {
            "auth": {
                "sign_in": "Giriş yap"
            }
        }
    }
}
Kesalahan khusus endpoint unknown_language
GET /v1/content/announcements Tanpa autentikasi 60 permintaan / 60 detik

Published announcements.

Parameter Tipe Wajib Deskripsi
lang string — Language code
Contoh respons
{
    "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 Tanpa autentikasi 60 permintaan / 60 detik

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

Tidak menerima parameter.

Contoh respons
{
    "status": "success",
    "data": {
        "items": [
            {
                "key": "twitter",
                "label": "X / Twitter",
                "url": "https://…"
            }
        ]
    }
}
GET /v1/content/partners Tanpa autentikasi 60 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
lang string — Language code
Contoh respons
{
    "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 Tanpa autentikasi 60 permintaan / 60 detik

Frequently asked questions and their categories.

Parameter Tipe Wajib Deskripsi
lang string — Language code
Contoh respons
{
    "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 Tanpa autentikasi 60 permintaan / 60 detik

Protocol whitepaper, section by section.

Parameter Tipe Wajib Deskripsi
lang string — Language code
Contoh respons
{
    "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 Tanpa autentikasi 60 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
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
Contoh respons
{
    "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 Tanpa autentikasi 60 permintaan / 60 detik

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.

Parameter Tipe Wajib Deskripsi
lang string — Language code
slug string ya Post slug in that language
Contoh respons
{
    "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"
    }
}
Kesalahan khusus endpoint post_not_found

03Kesalahan

Kesalahan menggunakan kode status HTTP standar; kolom error.code di badan respons dapat dibaca mesin dan tidak bergantung pada bahasa. Klien sebaiknya bercabang berdasarkan kode, bukan pesannya; pesan mengikuti Accept-Language.

Kode kesalahan umum

Kode HTTP Arti
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.

04Batas laju

Batas berlaku per endpoint dan tercantum di setiap kartu. Untuk permintaan terautentikasi, penghitung didasarkan pada pengguna, untuk permintaan anonim pada IP. Melampaui batas akan mengembalikan 429 dengan Retry-After; setiap respons juga menyertakan X-RateLimit-Limit, X-RateLimit-Remaining, dan X-RateLimit-Reset.

Jika kamu membutuhkan kuota yang lebih tinggi, tulis ke kami melalui dukungan.

Masih bingung?

Tulis pesan ke kami. Kami membalas dalam dua hari kerja.