Öffentliche API

Jeder Endpunkt, mit dem die mobile App kommuniziert. Welche davon ein Token benötigen, ist auf jeder Karte markiert.

VERSION v1 FORMAT JSON AUTH Je Endpunkt

01Basis-URL

Alle Endpunkte liegen unter der unten stehenden URL und liefern application/json zurück. Wo eine Authentifizierung erforderlich ist, gehört das Token in den Header Authorization: Bearer <token>; die Liste zeigt, welche Endpunkte eines benötigen.

https://priamnetwork.com/api/v1

02Endpunkte

Die Werte in den Beispielantworten dienen nur zur Veranschaulichung; die Felder und die Struktur sind echt. Die Endpunktliste wird aus der Registry im Quellcode erzeugt, nicht von Hand geschrieben.

Authentication

POST /v1/auth/register Ohne Auth 10 Anfragen / 3600 s

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

Parameter Typ Erforderlich Beschreibung
accept_terms string ja Terms acceptance. Must be <code>1</code>.
username string ja 3–32 chars, letters/digits/underscore
password string ja At least 8 characters
confirm_age string ja Age declaration. Must be <code>1</code>.
referrer string — Referrer username
email string ja Required and unique; the only password recovery path
device_id string ja Stable per-device identifier
locale string — Language code
Beispielantwort
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse",
            "balance": "0.00000000"
        }
    }
}
Endpunktspezifische Fehler username_taken email_taken invalid_username invalid_email weak_password unknown_referrer
POST /v1/auth/check-username Ohne Auth 60 Anfragen / 60 s

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

Parameter Typ Erforderlich Beschreibung
username string ja 3–32 chars, letters/digits/underscore
Beispielantwort
{
    "status": "success",
    "data": {
        "available": true
    }
}
Endpunktspezifische Fehler invalid_username
POST /v1/auth/check-email Ohne Auth 30 Anfragen / 3600 s

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

Parameter Typ Erforderlich Beschreibung
email string ja Address to check
Beispielantwort
{
    "status": "success",
    "data": {
        "available": false
    }
}
Endpunktspezifische Fehler invalid_email
POST /v1/auth/login Ohne Auth 10 Anfragen / 60 s

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

Parameter Typ Erforderlich Beschreibung
username string ja Username
password string ja Password
device_id string ja Device id
Beispielantwort
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Endpunktspezifische Fehler invalid_credentials account_suspended
POST /v1/auth/social-nonce Ohne Auth 30 Anfragen / 900 s

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

Parameter Typ Erforderlich Beschreibung
device_id string ja The nonce is bound to this device.
Beispielantwort
{
    "status": "success",
    "data": {
        "nonce": "a1b2…",
        "expires_in": 300
    }
}
Endpunktspezifische Fehler bad_request rate_limited
POST /v1/auth/social-token Ohne Auth 10 Anfragen / 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`.

Parameter Typ Erforderlich Beschreibung
provider string ja Only `google` for now.
id_token string ja The signed token returned by Credential Manager.
nonce string ja The value obtained from `auth/social-nonce`.
device_id string ja 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`.
Beispielantwort
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        },
        "signup_required": true,
        "pending_token": "…",
        "suggested_username": "ibrahim"
    }
}
Endpunktspezifische Fehler bad_request unauthorized forbidden unavailable rate_limited
POST /v1/auth/social-complete Ohne Auth 10 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
accept_terms string ja Terms acceptance. Must be <code>1</code>.
confirm_age string ja Age declaration. Must be <code>1</code>.
pending_token string ja The value from `auth/social-token`. Single-use, 30 minutes.
username string ja 3–32 chars; lowercase letters, digits, underscore.
device_id string ja The SAME device id used for `auth/social-token`.
referrer string — Username of the referrer. The account must be `active`.
Beispielantwort
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "…",
        "user": {
            "username": "ibrahim"
        }
    }
}
Endpunktspezifische Fehler bad_request invalid_username username_taken unknown_referrer email_taken rate_limited
POST /v1/auth/password-forgot Ohne Auth 3 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
email string ja The account email address.
Beispielantwort
{
    "status": "success",
    "data": {
        "sent": true
    }
}
Endpunktspezifische Fehler bad_request rate_limited
POST /v1/auth/password-reset-verify Ohne Auth 10 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
email string ja The address the code was sent to.
code string ja Six digits. Valid for 10 minutes, dies after 5 wrong tries.
Beispielantwort
{
    "status": "success",
    "data": {
        "ticket": "a1b2…",
        "expires_in": 600
    }
}
Endpunktspezifische Fehler bad_request rate_limited
POST /v1/auth/password-reset-confirm Ohne Auth 5 Anfragen / 900 s

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

Parameter Typ Erforderlich Beschreibung
ticket string ja The ticket returned by step 2.
new_password string ja At least 8 characters.
Beispielantwort
{
    "status": "success",
    "data": {
        "updated": true
    }
}
Endpunktspezifische Fehler bad_request rate_limited
POST /v1/auth/password-change Auth erforderlich 5 Anfragen / 300 s

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

Parameter Typ Erforderlich Beschreibung
current_password string ja The password in use
new_password string ja At least 8 characters
Beispielantwort
{
    "status": "success",
    "data": {
        "changed": true
    }
}
Endpunktspezifische Fehler invalid_password weak_password same_password
POST /v1/auth/refresh Auth erforderlich 20 Anfragen / 3600 s

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

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-09-28T18:00:00+00:00",
        "rotated": true
    }
}
Endpunktspezifische Fehler too_early
POST /v1/auth/logout Auth erforderlich 30 Anfragen / 3600 s

Revokes this device's token.

Parameter Typ Erforderlich Beschreibung
all_devices bool — Sign out everywhere
Beispielantwort
{
    "status": "success",
    "data": {
        "revoked": 1
    }
}

Account

POST /v1/me/avatar Auth erforderlich 10 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
file file ja JPEG or PNG, max 5 MB.
Beispielantwort
{
    "status": "success",
    "data": {
        "avatar_url": "https://priamnetwork.com/assets/uploads/avatars/2026/08/a1b2….jpg"
    }
}
Endpunktspezifische Fehler bad_request rate_limited
POST /v1/me/avatar-remove Auth erforderlich 10 Anfragen / 3600 s

Removes the profile photo and deletes the file from disk.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "avatar_url": null
    }
}
Endpunktspezifische Fehler rate_limited
POST /v1/auth/verify-request Auth erforderlich 5 Anfragen / 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.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "sent": true,
        "already_verified": false,
        "already_sent": false,
        "retry_after": 60,
        "expires_in": 600
    }
}
Endpunktspezifische Fehler unavailable
POST /v1/auth/verify-confirm Auth erforderlich 10 Anfragen / 900 s

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

Parameter Typ Erforderlich Beschreibung
code string ja 6 digits. Whitespace is ignored.
Beispielantwort
{
    "status": "success",
    "data": {
        "verified": true,
        "already_verified": false
    }
}
Endpunktspezifische Fehler bad_request rate_limited
GET /v1/me Auth erforderlich 120 Anfragen / 60 s

Profile, balance, current multiplier and open session state.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "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 erforderlich 20 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
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.
Beispielantwort
{
    "status": "success",
    "data": {
        "display_name": "Ayşe",
        "email": "ayse@example.com",
        "email_verified": false,
        "verification_sent": true
    }
}
Endpunktspezifische Fehler email_taken no_changes
POST /v1/me/delete Auth erforderlich 3 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
username string ja The account username — intent confirmation
Beispielantwort
{
    "status": "success",
    "data": {
        "deleted": true,
        "revoked_sessions": 2
    }
}
Endpunktspezifische Fehler username_mismatch deletion_failed
GET /v1/me/transactions Auth erforderlich 60 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
limit int — 1–100, default 50
before_id int — `next_before_id` from the previous response
Beispielantwort
{
    "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 Ohne Auth 10 Anfragen / 60 s

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

Parameter Typ Erforderlich Beschreibung
provider string ja Only `google`.
device_id string ja Device id
handover_challenge string ja 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
Beispielantwort
{
    "status": "success",
    "data": {
        "flow_id": "a1b2…",
        "start_url": "https://…/api/v1/oauth/start?f=a1b2…",
        "expires_in": 600
    }
}
Endpunktspezifische Fehler bad_request unavailable
POST /v1/auth/handover Ohne Auth 10 Anfragen / 60 s

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

Parameter Typ Erforderlich Beschreibung
code string ja Handover code from the deep link
handover_verifier string ja Plain verifier for the challenge sent to social-start
device_id string ja Device id
Beispielantwort
{
    "status": "success",
    "data": {
        "token": "…",
        "expires_at": "2026-08-29T18:00:00+00:00",
        "user": {
            "username": "ayse"
        }
    }
}
Endpunktspezifische Fehler invalid_grant account_suspended
GET /v1/oauth/start Ohne Auth 20 Anfragen / 60 s

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

Parameter Typ Erforderlich Beschreibung
f string ja Flow id returned by auth/social-start
Beispielantwort
{
    "status": "success",
    "data": {
        "302": "https://accounts.google.com/o/oauth2/v2/auth?…"
    }
}
Endpunktspezifische Fehler not_found
GET /v1/oauth/google Ohne Auth 20 Anfragen / 60 s

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

Parameter Typ Erforderlich Beschreibung
code string ja Authorization code from Google
state string ja CSRF value identifying the flow
Beispielantwort
{
    "status": "success",
    "data": {
        "302": "priamnetwork://auth?code=…"
    }
}
Endpunktspezifische Fehler not_found

Missions

GET /v1/missions Auth erforderlich 60 Anfragen / 60 s

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

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "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 erforderlich 10 Anfragen / 3600 s

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

Parameter Typ Erforderlich Beschreibung
mission_id int ja Mission id
payload string ja The requested value (max 2000 chars)
Beispielantwort
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Endpunktspezifische Fehler missions_disabled not_found already_submitted quota_full payload_too_long image_required
POST /v1/missions/submit-image Auth erforderlich 5 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
mission_id int ja Mission id
file file ja 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).
Beispielantwort
{
    "status": "success",
    "data": {
        "status": "submitted"
    }
}
Endpunktspezifische Fehler missions_disabled not_found already_submitted quota_full text_required proof_rejected

Support

GET /v1/support Auth erforderlich 60 Anfragen / 60 s

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

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "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 erforderlich 120 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
ticket_id int ja Ticket id
Beispielantwort
{
    "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"
            }
        ]
    }
}
Endpunktspezifische Fehler not_found
GET /v1/support/image Auth erforderlich 240 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
message_id int ja Message id (`id` in the thread)
Beispielantwort
image/jpeg | image/png (bayt)
Endpunktspezifische Fehler not_found
POST /v1/support/open Auth erforderlich 5 Anfragen / 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`.

Parameter Typ Erforderlich Beschreibung
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 ja Message (max 2000 chars)
Beispielantwort
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Endpunktspezifische Fehler link_not_allowed body_too_long too_many_tickets too_many_messages too_fast
POST /v1/support/open-image Auth erforderlich 5 Anfragen / 3600 s

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

Parameter Typ Erforderlich Beschreibung
body string ja Message (max 2000 chars)
file file ja JPEG or PNG, up to 5 MB. Re-encoded on the server.
Beispielantwort
{
    "status": "success",
    "data": {
        "ticket_id": 4,
        "status": "open"
    }
}
Endpunktspezifische Fehler link_not_allowed body_too_long image_rejected too_many_tickets too_many_messages too_fast
POST /v1/support/reply Auth erforderlich 20 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
ticket_id int ja Ticket id
body string ja Message (max 2000 chars)
Beispielantwort
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Endpunktspezifische Fehler not_found ticket_closed link_not_allowed body_too_long too_many_messages too_fast
POST /v1/support/reply-image Auth erforderlich 10 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
ticket_id int ja Ticket id
body string ja Message (max 2000 chars)
file file ja 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).
Beispielantwort
{
    "status": "success",
    "data": {
        "status": "open"
    }
}
Endpunktspezifische Fehler not_found ticket_closed link_not_allowed body_too_long image_rejected too_many_messages too_fast
POST /v1/support/read Auth erforderlich 60 Anfragen / 3600 s

Marks admin replies as read.

Parameter Typ Erforderlich Beschreibung
ticket_id int ja Ticket id
Beispielantwort
{
    "status": "success",
    "data": {
        "status": "ok"
    }
}
Endpunktspezifische Fehler not_found

Mining

POST /v1/mining/start Auth erforderlich 5 Anfragen / 60 s

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

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "session_id": 128,
        "ends_at": "2026-07-31T18:00:00+00:00",
        "multiplier": "1.80",
        "expected_amount": "0.54000000"
    }
}
Endpunktspezifische Fehler session_already_active mining_disabled account_suspended ad_required
GET /v1/mining/status Auth erforderlich 120 Anfragen / 60 s

Remaining time and expected reward of the open session.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "status": "active",
        "seconds_left": 43200,
        "expected_amount": "0.54000000",
        "claimable": false
    }
}
POST /v1/mining/claim Auth erforderlich 10 Anfragen / 60 s

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

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "credited": "0.54000000",
        "balance": "12.99000000"
    }
}
Endpunktspezifische Fehler no_session session_not_finished already_claimed

Referrals

GET /v1/referrals Auth erforderlich 60 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
limit int — Max 100 (default 50)
before_id int — `next_before_id` from the previous response
Beispielantwort
{
    "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 erforderlich 20 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
user_id int ja `items[].id` from the `referrals` list.
Beispielantwort
{
    "status": "success",
    "data": {
        "sent": true,
        "nudge_after": "2026-08-28T06:00:00+00:00"
    }
}
Endpunktspezifische Fehler not_eligible rate_limited

Ads

GET /v1/ads/status Auth erforderlich 60 Anfragen / 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.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "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 erforderlich 30 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
result string ja filled · no_fill · error · consent · offline
unit string — primary · fallback · none (defaults to none)
Beispielantwort
{
    "status": "success",
    "data": {
        "recorded": true
    }
}

Notifications

POST /v1/push/register Auth erforderlich 10 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
device_id string ja Persistent device id (same as in the login request).
fcm_token string ja Firebase registration token.
lang string — Device language. Notification text is picked by this; the default language is used when empty.
Beispielantwort
{
    "status": "success",
    "data": {
        "registered": true,
        "lang": "tr"
    }
}
Endpunktspezifische Fehler bad_request
GET /v1/push/list Auth erforderlich 60 Anfragen / 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`.

Parameter Typ Erforderlich Beschreibung
limit int — Max rows (default 30, max 100).
Beispielantwort
{
    "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 erforderlich 60 Anfragen / 60 s

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

Parameter Typ Erforderlich Beschreibung
id int — Notification id. All when empty.
Beispielantwort
{
    "status": "success",
    "data": {
        "marked": 3,
        "unread": 0
    }
}
POST /v1/push/delete Auth erforderlich 60 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
id int — Notification id. All read ones when empty.
Beispielantwort
{
    "status": "success",
    "data": {
        "deleted": 3,
        "unread": 0
    }
}

Content

GET /v1/config Ohne Auth 120 Anfragen / 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.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "oauth": {
            "google": true,
            "google_client_id": "…"
        },
        "min_app_version": "",
        "mining_enabled": true
    }
}
Endpunktspezifische Fehler unavailable
GET /v1/content/languages Ohne Auth 60 Anfragen / 60 s

Languages enabled for the app, and the default.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "default": "en",
        "items": [
            {
                "code": "tr",
                "name": "Türkçe",
                "dir": "ltr"
            }
        ]
    }
}
GET /v1/content/translations Ohne Auth 60 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
lang string — Language code; default if omitted
Beispielantwort
{
    "status": "success",
    "data": {
        "lang": "tr",
        "version": "2026-07-30T18:00:00+00:00",
        "strings": {
            "auth": {
                "sign_in": "Giriş yap"
            }
        }
    }
}
Endpunktspezifische Fehler unknown_language
GET /v1/content/announcements Ohne Auth 60 Anfragen / 60 s

Published announcements.

Parameter Typ Erforderlich Beschreibung
lang string — Language code
Beispielantwort
{
    "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 Ohne Auth 60 Anfragen / 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.

Nimmt keine Parameter entgegen.

Beispielantwort
{
    "status": "success",
    "data": {
        "items": [
            {
                "key": "twitter",
                "label": "X / Twitter",
                "url": "https://…"
            }
        ]
    }
}
GET /v1/content/partners Ohne Auth 60 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
lang string — Language code
Beispielantwort
{
    "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 Ohne Auth 60 Anfragen / 60 s

Frequently asked questions and their categories.

Parameter Typ Erforderlich Beschreibung
lang string — Language code
Beispielantwort
{
    "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 Ohne Auth 60 Anfragen / 60 s

Protocol whitepaper, section by section.

Parameter Typ Erforderlich Beschreibung
lang string — Language code
Beispielantwort
{
    "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 Ohne Auth 60 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
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
Beispielantwort
{
    "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 Ohne Auth 60 Anfragen / 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.

Parameter Typ Erforderlich Beschreibung
lang string — Language code
slug string ja Post slug in that language
Beispielantwort
{
    "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"
    }
}
Endpunktspezifische Fehler post_not_found

03Fehler

Fehler verwenden die üblichen HTTP-Statuscodes; das Feld error.code im Body ist maschinenlesbar und sprachunabhängig. Clients sollten nach dem Code verzweigen, nicht nach der Nachricht. Die Nachrichten richten sich nach Accept-Language.

Häufige Fehlercodes

Code HTTP Bedeutung
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.

04Ratenbegrenzung

Limits gelten je Endpunkt und stehen auf jeder Karte. Bei authentifizierten Anfragen wird der Zähler pro Benutzer geführt, bei anonymen pro IP. Wer ein Limit überschreitet, erhält 429 mit Retry-After; jede Antwort enthält außerdem X-RateLimit-Limit, X-RateLimit-Remaining und X-RateLimit-Reset.

Wenn du ein höheres Kontingent brauchst, schreib uns über den Support.

Kommst du nicht weiter?

Schreib uns. Wir antworten innerhalb von zwei Werktagen.