SumoRouter
SumoRouter Admin API

Settings

Server

Site settings, one document per section: ai, payment, auth, limits, retention, branding, email and affiliate. Secrets are returned masked and kept when omitted on PUT.


Get affiliate settings

GET
https://ai.brandkamu.id/api/admin
/settings/affiliate

The affiliate program terms.

Get affiliate settings › Responses

Affiliate settings.

enabled
​boolean
Default: false
commission_percent
​number · min: 0 · max: 50

Share of each paid top-up of a referred user credited to the referrer.

Default: 10
commission_months
​integer · min: 1 · max: 120

Commission is paid on top-ups within this many months of the referral.

Default: 12
referee_bonus_percent
​number · min: 0 · max: 50

Extra credit for the referred user on their first paid top-up.

Default: 10

Update affiliate settings

PUT
https://ai.brandkamu.id/api/admin
/settings/affiliate

Replaces the program terms. Omitted fields take their defaults (enabled: false, 10 %, 12 months, 10 %), so send all four. Percentages are rounded to two decimals.

Update affiliate settings › Request Body

enabled
​boolean
Default: false
commission_percent
​number · min: 0 · max: 50

Share of each paid top-up of a referred user credited to the referrer.

Default: 10
commission_months
​integer · min: 1 · max: 120

Commission is paid on top-ups within this many months of the referral.

Default: 12
referee_bonus_percent
​number · min: 0 · max: 50

Extra credit for the referred user on their first paid top-up.

Default: 10

Update affiliate settings › Responses

The saved settings.

enabled
​boolean
Default: false
commission_percent
​number · min: 0 · max: 50

Share of each paid top-up of a referred user credited to the referrer.

Default: 10
commission_months
​integer · min: 1 · max: 120

Commission is paid on top-ups within this many months of the referral.

Default: 12
referee_bonus_percent
​number · min: 0 · max: 50

Extra credit for the referred user on their first paid top-up.

Default: 10

Get AI provider settings

GET
https://ai.brandkamu.id/api/admin
/settings/ai

The Sumopod AI upstream. The base URL is fixed by the server; the key is shown masked.

Get AI provider settings › Responses

AI settings.

base_url
​string · required

Sumopod AI base URL (fixed by the server configuration).

api_key_hint
​string | null · required

Masked key, e.g. sk-****-a1b2; null when not set.


Set the Sumopod AI API key

PUT
https://ai.brandkamu.id/api/admin
/settings/ai

Saves the Sumopod AI API key after checking it against Sumopod's /models endpoint. Unlike other sections, the key is required here (400 if empty or rejected by Sumopod; 502 if Sumopod can't be reached).

Set the Sumopod AI API key › Request Body

api_key
​string · minLength: 1 · writeOnly · required

Set the Sumopod AI API key › Responses

The saved settings (masked).

base_url
​string · required

Sumopod AI base URL (fixed by the server configuration).

api_key_hint
​string | null · required

Masked key, e.g. sk-****-a1b2; null when not set.


Get payment settings

GET
https://ai.brandkamu.id/api/admin
/settings/payment

Sumopod Managed Payment (QRIS) settings for the sandbox and live environments, with masked secrets and webhook URLs.

Get payment settings › Responses

Payment settings.

enabled
​boolean · required
environment
​PaymentEnv · enum · required
Enum values:
sandbox
live
payment_method
​string · const · required

Fixed.

Const value: QRIS
idr_per_usd
​integer · int64 · required

How many IDR buy 1 USD of credit.

min_topup_idr
​integer · int64 · required
max_topup_idr
​integer · int64 · required
​PaymentCredentialsView · required
​PaymentCredentialsView · required

Update payment settings

PUT
https://ai.brandkamu.id/api/admin
/settings/payment

Saves the payment settings. Per environment, api_key, webhook_token and webhook_signing_secret are kept when omitted, null or empty; send a value to replace one. Limits: 10,000 ≤ min_topup_idr ≤ 100,000 and min_topup_idr < max_topup_idr ≤ 10,000,000.

Update payment settings › Request Body

enabled
​boolean · required

Offer top-ups (also needs an API key for the active environment).

environment
​PaymentEnv · enum · required
Enum values:
sandbox
live
idr_per_usd
​integer · int64 · min: 1 · required

How many IDR buy 1 USD of credit.

min_topup_idr
​integer · int64 · min: 10000 · max: 100000 · required
max_topup_idr
​integer · int64 · max: 10000000 · required

Secrets for one environment. Omitted, null or empty values keep the stored secret.

Secrets for one environment. Omitted, null or empty values keep the stored secret.

Update payment settings › Responses

The saved settings (masked).

enabled
​boolean · required
environment
​PaymentEnv · enum · required
Enum values:
sandbox
live
payment_method
​string · const · required

Fixed.

Const value: QRIS
idr_per_usd
​integer · int64 · required

How many IDR buy 1 USD of credit.

min_topup_idr
​integer · int64 · required
max_topup_idr
​integer · int64 · required
​PaymentCredentialsView · required
​PaymentCredentialsView · required

Get sign-in settings

GET
https://ai.brandkamu.id/api/admin
/settings/auth

Sign-in methods, registration, Google OAuth, email verification, sign-up blocking rules and Cloudflare Turnstile.

Get sign-in settings › Responses

Auth settings.

email_password_enabled
​boolean · required
registration_enabled
​boolean · required

When off, only existing accounts can sign in.

google_enabled
​boolean · required
google_client_id
​string · required
google_client_secret_hint
​string | null · required

Masked; null when not set.

google_redirect_uri
​string · required

Redirect URI to register with Google (read-only).

require_email_verification
​boolean · required

New email/password sign-ups must confirm their address.

email_ready
​boolean · required

SMTP is set up, so verification and reset emails can go out (read-only).

block_disposable_emails
​boolean · required
block_email_aliases
​boolean · required

Refuse +tag aliases and Gmail dot variants of an existing account.

blocked_email_domains
​string[] · required

Extra domains to refuse (subdomains included).

turnstile_enabled
​boolean · required

Cloudflare Turnstile on sign-in, sign-up and password reset.

turnstile_site_key
​string · required
turnstile_secret_key_hint
​string | null · required

Masked; null when not set.


Update sign-in settings

PUT
https://ai.brandkamu.id/api/admin
/settings/auth

The first four fields are required. Other non-secret fields keep their current value when omitted. google_client_secret and turnstile_secret_key are kept when omitted, null or empty.

Validation: at least one of email/password or Google sign-in must stay enabled; Google needs a client id and secret; Turnstile needs a site key and secret key; blocked_email_domains is normalized (trimmed, leading @ removed, lower-cased, de-duplicated) and limited to 1000 domains.

Update sign-in settings › Request Body

email_password_enabled
​boolean · required
registration_enabled
​boolean · required

When off, only existing accounts can sign in.

google_enabled
​boolean · required
google_client_id
​string · required
google_client_secret
​string | null · writeOnly

Omitted, null or empty keeps the stored secret.

require_email_verification
​boolean
block_disposable_emails
​boolean
block_email_aliases
​boolean
blocked_email_domains
​string[] · maxItems: 1000
turnstile_enabled
​boolean
turnstile_site_key
​string
turnstile_secret_key
​string | null · writeOnly

Omitted, null or empty keeps the stored secret.

Update sign-in settings › Responses

The saved settings (masked).

email_password_enabled
​boolean · required
registration_enabled
​boolean · required

When off, only existing accounts can sign in.

google_enabled
​boolean · required
google_client_id
​string · required
google_client_secret_hint
​string | null · required

Masked; null when not set.

google_redirect_uri
​string · required

Redirect URI to register with Google (read-only).

require_email_verification
​boolean · required

New email/password sign-ups must confirm their address.

email_ready
​boolean · required

SMTP is set up, so verification and reset emails can go out (read-only).

block_disposable_emails
​boolean · required
block_email_aliases
​boolean · required

Refuse +tag aliases and Gmail dot variants of an existing account.

blocked_email_domains
​string[] · required

Extra domains to refuse (subdomains included).

turnstile_enabled
​boolean · required

Cloudflare Turnstile on sign-in, sign-up and password reset.

turnstile_site_key
​string · required
turnstile_secret_key_hint
​string | null · required

Masked; null when not set.


Get request limits

GET
https://ai.brandkamu.id/api/admin
/settings/limits

Rate and concurrency limits for the AI endpoints.

Get request limits › Responses

Limits.

key_rpm
​integer · min: 1 · max: 1000000

Requests per minute per API key without its own limit; also the playground's.

Default: 60
user_rpm
​integer · min: 1 · max: 1000000

Requests per minute per user across all their keys; also the highest per-key limit a user can set.

Default: 300
user_max_parallel
​integer · min: 1 · max: 1000000

AI requests in progress at once per user.

Default: 20

Update request limits

PUT
https://ai.brandkamu.id/api/admin
/settings/limits

Replaces the limits. Omitted fields take their defaults (60 / 300 / 20), so send all three. Each must be 1..1,000,000 and key_rpm can't exceed user_rpm.

Update request limits › Request Body

key_rpm
​integer · min: 1 · max: 1000000

Requests per minute per API key without its own limit; also the playground's.

Default: 60
user_rpm
​integer · min: 1 · max: 1000000

Requests per minute per user across all their keys; also the highest per-key limit a user can set.

Default: 300
user_max_parallel
​integer · min: 1 · max: 1000000

AI requests in progress at once per user.

Default: 20

Update request limits › Responses

The saved limits.

key_rpm
​integer · min: 1 · max: 1000000

Requests per minute per API key without its own limit; also the playground's.

Default: 60
user_rpm
​integer · min: 1 · max: 1000000

Requests per minute per user across all their keys; also the highest per-key limit a user can set.

Default: 300
user_max_parallel
​integer · min: 1 · max: 1000000

AI requests in progress at once per user.

Default: 20

Get log retention

GET
https://ai.brandkamu.id/api/admin
/settings/retention

Retention periods in days (0 keeps forever), current row counts and the last cleanup run.

Get log retention › Responses

Retention settings with stats.

Days to keep each kind of log; 0 keeps forever.
request_logs_days
​integer · min: 0 · max: 3650 · required

Deletes request log rows (usage history, analytics and reports go with them; balances are unaffected).

Default: 0
request_details_days
​integer · min: 0 · max: 3650 · required

Clears client IP, user agent, request parameters and error messages, keeping tokens and cost.

Default: 0
audit_logs_days
​integer · min: 0 · max: 3650 · required

Deletes audit entries, except admin credit and starting balance entries (balance history).

Default: 0
payment_payloads_days
​integer · min: 0 · max: 3650 · required

Clears raw gateway responses and webhook payloads stored on top-ups.

Default: 0
​object · required
​RetentionRunResult | null · required

The last cleanup run, if any.


Update log retention

PUT
https://ai.brandkamu.id/api/admin
/settings/retention

Replaces the retention periods (0-3650 days; 0 keeps forever). Omitted fields become 0 (keep forever). Applied by a scheduled cleanup job, or now with POST /settings/retention/run.

Update log retention › Request Body

Days to keep each kind of log; 0 keeps forever.
request_logs_days
​integer · min: 0 · max: 3650

Deletes request log rows (usage history, analytics and reports go with them; balances are unaffected).

Default: 0
request_details_days
​integer · min: 0 · max: 3650

Clears client IP, user agent, request parameters and error messages, keeping tokens and cost.

Default: 0
audit_logs_days
​integer · min: 0 · max: 3650

Deletes audit entries, except admin credit and starting balance entries (balance history).

Default: 0
payment_payloads_days
​integer · min: 0 · max: 3650

Clears raw gateway responses and webhook payloads stored on top-ups.

Default: 0

Update log retention › Responses

The saved settings with stats.

Days to keep each kind of log; 0 keeps forever.
request_logs_days
​integer · min: 0 · max: 3650 · required

Deletes request log rows (usage history, analytics and reports go with them; balances are unaffected).

Default: 0
request_details_days
​integer · min: 0 · max: 3650 · required

Clears client IP, user agent, request parameters and error messages, keeping tokens and cost.

Default: 0
audit_logs_days
​integer · min: 0 · max: 3650 · required

Deletes audit entries, except admin credit and starting balance entries (balance history).

Default: 0
payment_payloads_days
​integer · min: 0 · max: 3650 · required

Clears raw gateway responses and webhook payloads stored on top-ups.

Default: 0
​object · required
​RetentionRunResult | null · required

The last cleanup run, if any.


Run log cleanup now

POST
https://ai.brandkamu.id/api/admin
/settings/retention/run

Applies the saved retention settings now instead of waiting for the next scheduled run.

Run log cleanup now › Responses

What the run did.

started_at
​string | null · date-time · required
finished_at
​string | null · date-time · required
skipped
​boolean · required

Another instance was already running the cleanup.

request_logs_deleted
​integer · required
request_details_cleared
​integer · required
audit_logs_deleted
​integer · required
payment_payloads_cleared
​integer · required
email_tokens_deleted
​integer · required

Expired email verification / reset tokens removed.


Get branding

GET
https://ai.brandkamu.id/api/admin
/settings/branding

Site name, public URL, icon and time zone.

Get branding › Responses

Branding.

site_name
​string · required
site_url
​string · required

Stored value; empty means the server's PUBLIC_URL is used.

default_url
​string · required

PUBLIC_URL from the server environment (read-only).

icon_url
​string | null · required

Versioned public icon URL (/api/branding/icon?v=N); null uses the built-in logo.

timezone
​string · required

IANA time zone for usage dates and charts.


Update branding

PUT
https://ai.brandkamu.id/api/admin
/settings/branding

Sets the site name (1-40 characters) and public URL (http(s)://host[:port] without a path; a trailing / is removed; empty uses the server's PUBLIC_URL). timezone is an IANA name; omitted or empty keeps the current zone. The icon is managed with /settings/branding/icon.

Update branding › Request Body

site_name
​string · minLength: 1 · maxLength: 40 · required
site_url
​string · required

Empty string uses PUBLIC_URL.

timezone
​string | null

IANA time zone, e.g. Asia/Jakarta.

Update branding › Responses

The saved branding.

site_name
​string · required
site_url
​string · required

Stored value; empty means the server's PUBLIC_URL is used.

default_url
​string · required

PUBLIC_URL from the server environment (read-only).

icon_url
​string | null · required

Versioned public icon URL (/api/branding/icon?v=N); null uses the built-in logo.

timezone
​string · required

IANA time zone for usage dates and charts.


Upload the site icon

PUT
https://ai.brandkamu.id/api/admin
/settings/branding/icon

Uploads the site icon as a base64 data URL (as produced by FileReader.readAsDataURL). PNG, SVG, ICO, JPEG or WebP, at most 256 KB. The public icon URL is versioned so browsers pick up the change.

Upload the site icon › Request Body

data_url
​string · pattern: ^data:image/(png|svg… · required

data:<mime>;base64,<data>.

Upload the site icon › Responses

The branding with the new icon_url.

site_name
​string · required
site_url
​string · required

Stored value; empty means the server's PUBLIC_URL is used.

default_url
​string · required

PUBLIC_URL from the server environment (read-only).

icon_url
​string | null · required

Versioned public icon URL (/api/branding/icon?v=N); null uses the built-in logo.

timezone
​string · required

IANA time zone for usage dates and charts.


Remove the site icon

DELETE
https://ai.brandkamu.id/api/admin
/settings/branding/icon

Removes the uploaded icon; the built-in logo is used again.

Remove the site icon › Responses

The branding with icon_url set to null.

site_name
​string · required
site_url
​string · required

Stored value; empty means the server's PUBLIC_URL is used.

default_url
​string · required

PUBLIC_URL from the server environment (read-only).

icon_url
​string | null · required

Versioned public icon URL (/api/branding/icon?v=N); null uses the built-in logo.

timezone
​string · required

IANA time zone for usage dates and charts.


Get email settings

GET
https://ai.brandkamu.id/api/admin
/settings/email

The SMTP provider (password never returned) and every email template with its current subject and body.

Get email settings › Responses

Email settings.

provider
​string · const · required
Const value: smtp
enabled
​boolean · required
sender_email
​string · required
sender_name
​string · required
smtp_host
​string · required

Defaults to smtp.sumopod.com.

smtp_port
​integer · required

Defaults to 465.

smtp_username
​string · required
smtp_password_hint
​string | null · required

•••••••• when a password is stored, else null.

smtp_security
​SmtpSecurity · enum · required

starttls (usually port 587), tls (usually 465) or none (local test servers only).

Enum values:
starttls
tls
none
​EmailTemplate[] · required

Update the SMTP provider

PUT
https://ai.brandkamu.id/api/admin
/settings/email

Saves the SMTP settings. smtp_password is kept when omitted or empty. Turning email on needs an SMTP host and a sender (the sender email, or an email address as the SMTP username). Templates are edited with /settings/email/templates/{key}.

Update the SMTP provider › Request Body

enabled
​boolean · required
sender_email
​string · required

From address; may be empty when the username is an email address.

sender_name
​string · maxLength: 80 · required
smtp_host
​string · required
smtp_port
​integer · min: 1 · max: 65535 · required
smtp_username
​string · required
smtp_security
​SmtpSecurity · enum · required

starttls (usually port 587), tls (usually 465) or none (local test servers only).

Enum values:
starttls
tls
none
smtp_password
​string · writeOnly

Empty keeps the stored password.

Default:

Update the SMTP provider › Responses

The saved settings.

provider
​string · const · required
Const value: smtp
enabled
​boolean · required
sender_email
​string · required
sender_name
​string · required
smtp_host
​string · required

Defaults to smtp.sumopod.com.

smtp_port
​integer · required

Defaults to 465.

smtp_username
​string · required
smtp_password_hint
​string | null · required

•••••••• when a password is stored, else null.

smtp_security
​SmtpSecurity · enum · required

starttls (usually port 587), tls (usually 465) or none (local test servers only).

Enum values:
starttls
tls
none
​EmailTemplate[] · required

Send a test email

POST
https://ai.brandkamu.id/api/admin
/settings/email/test

Sends one template filled with example values to to, using the saved SMTP settings; the subject is prefixed with [Test]. Limited to 5 test emails per minute per admin. 502 if the SMTP server rejects the email.

Send a test email › Request Body

to
​string · email · required
template
​EmailTemplateKey · enum

Defaults to confirm_signup.

Enum values:
confirm_signup
reset_password
password_changed
two_factor_enabled
two_factor_disabled
topup_success
low_balance

Send a test email › Responses

Sent.

sent
​boolean · const · required
Const value:

Edit an email template

PUT
https://ai.brandkamu.id/api/admin
/settings/email/templates/{key}

Saves a custom subject (1-200 characters) and HTML body (up to 100 KB) for a template. Placeholders such as {{SiteName}} are listed in the template's variables. enabled only applies to optional (notification) templates; account emails always stay on.

Edit an email template › path Parameters

key
​EmailTemplateKey · enum · required
Enum values:
confirm_signup
reset_password
password_changed
two_factor_enabled
two_factor_disabled
topup_success
low_balance

Edit an email template › Request Body

subject
​string · minLength: 1 · maxLength: 200 · required
body
​string · minLength: 1 · required

HTML, up to 100 KB.

enabled
​boolean · required

Edit an email template › Responses

The full email settings.

provider
​string · const · required
Const value: smtp
enabled
​boolean · required
sender_email
​string · required
sender_name
​string · required
smtp_host
​string · required

Defaults to smtp.sumopod.com.

smtp_port
​integer · required

Defaults to 465.

smtp_username
​string · required
smtp_password_hint
​string | null · required

•••••••• when a password is stored, else null.

smtp_security
​SmtpSecurity · enum · required

starttls (usually port 587), tls (usually 465) or none (local test servers only).

Enum values:
starttls
tls
none
​EmailTemplate[] · required

Reset an email template

DELETE
https://ai.brandkamu.id/api/admin
/settings/email/templates/{key}

Restores the built-in subject and body (and re-enables it).

Reset an email template › path Parameters

key
​EmailTemplateKey · enum · required
Enum values:
confirm_signup
reset_password
password_changed
two_factor_enabled
two_factor_disabled
topup_success
low_balance

Reset an email template › Responses

The full email settings.

provider
​string · const · required
Const value: smtp
enabled
​boolean · required
sender_email
​string · required
sender_name
​string · required
smtp_host
​string · required

Defaults to smtp.sumopod.com.

smtp_port
​integer · required

Defaults to 465.

smtp_username
​string · required
smtp_password_hint
​string | null · required

•••••••• when a password is stored, else null.

smtp_security
​SmtpSecurity · enum · required

starttls (usually port 587), tls (usually 465) or none (local test servers only).

Enum values:
starttls
tls
none
​EmailTemplate[] · required