Public API
These endpoints need no session or key, and the profile endpoints allow any origin (Access-Control-Allow-Origin: *). Answers are cached for up to 60 seconds. Escrow previews for share links are in Escrows.
Endpoints
| Method | Path | Endpoint | Auth |
|---|---|---|---|
GET | /v1/public/auth-config | Get sign-in options | None |
GET | /v1/public/users | Browse users | None |
GET | /v1/public/users/:username | Get a user profile | None |
GET | /v1/public/users/:username/ratings | List a user's ratings | None |
Get sign-in options
GET/v1/public/auth-config
Whether Turnstile is required on sign-in and sign-up forms (with the public site key) and whether Google sign-in is available.
- Auth: None. Anyone can call it.
- Rate limit: 100 requests a minute per IP address.
- Idempotency: Not needed. Reading has no side effects.
Example request
bash
curl https://api.rekberpay.com/v1/public/auth-configjs
const res = await fetch('https://api.rekberpay.com/v1/public/auth-config', {
});
const data = await res.json();python
import os
import requests
resp = requests.get(
"https://api.rekberpay.com/v1/public/auth-config",
timeout=30,
)
print(resp.status_code, resp.json())php
<?php
$ch = curl_init('https://api.rekberpay.com/v1/public/auth-config');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);Example response
200 OK
json
{
"success": true,
"data": {
"turnstile": {
"enabled": false,
"site_key": "0x4AAAAAADX7jI6HY9KtLyoN"
},
"google": {
"enabled": true
}
}
}Errors
| Status | Code | Cause |
|---|---|---|
429 | RATE_LIMITED | Over the rate limit. Wait for Retry-After seconds |
Browse users
GET/v1/public/users
The public user directory. Admin accounts are never listed.
- Auth: None. Anyone can call it.
- Rate limit: 100 requests a minute per IP address.
- Idempotency: Not needed. Reading has no side effects.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | No | 1 to 10,000. Default 1 |
limit | integer | No | 1 to 50. Default 24 |
search | string | No | Up to 32 characters, matched against username and name |
sort | string | No | top (default), new or verified. newest is accepted as new |
verified | string | No | 1 or true to list verified users only |
Example request
bash
curl "https://api.rekberpay.com/v1/public/users?search=budi.santoso&limit=5"js
const res = await fetch('https://api.rekberpay.com/v1/public/users?search=budi.santoso&limit=5', {
});
const data = await res.json();python
import os
import requests
resp = requests.get(
"https://api.rekberpay.com/v1/public/users?search=budi.santoso&limit=5",
timeout=30,
)
print(resp.status_code, resp.json())php
<?php
$ch = curl_init('https://api.rekberpay.com/v1/public/users?search=budi.santoso&limit=5');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);Example response
200 OK
json
{
"success": true,
"data": {
"users": [
{
"username": "budi.santoso",
"full_name": "Budi Santoso",
"is_verified": false,
"joined_at": "2026-10-13T14:23:17.597Z",
"total_escrows_completed": 0,
"average_rating": null,
"rating_count": 0
}
],
"page": 1,
"limit": 5,
"total": 1,
"has_more": false
}
}Errors
| Status | Code | Cause |
|---|---|---|
400 | INVALID_QUERY | A query value is out of range |
429 | RATE_LIMITED | Over the rate limit. Wait for Retry-After seconds |
Get a user profile
GET/v1/public/users/:username
A public profile: name, verification, completed escrows, average rating, linked shops and the latest published ratings.
- Auth: None. Anyone can call it.
- Rate limit: 100 requests a minute per IP address.
- Idempotency: Not needed. Reading has no side effects.
Path parameters
| Name | Type | Description |
|---|---|---|
username | string | Lowercase username, 1 to 32 characters |
Example request
bash
curl https://api.rekberpay.com/v1/public/users/budi.santosojs
const res = await fetch('https://api.rekberpay.com/v1/public/users/budi.santoso', {
});
const data = await res.json();python
import os
import requests
resp = requests.get(
"https://api.rekberpay.com/v1/public/users/budi.santoso",
timeout=30,
)
print(resp.status_code, resp.json())php
<?php
$ch = curl_init('https://api.rekberpay.com/v1/public/users/budi.santoso');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);Example response
200 OK
json
{
"success": true,
"data": {
"username": "budi.santoso",
"full_name": "Budi Santoso",
"is_verified": false,
"joined_at": "2026-10-13T14:23:17.597Z",
"total_escrows_completed": 0,
"average_rating": null,
"rating_count": 0,
"social_instagram": null,
"social_shopee": null,
"social_tiktokshop": null,
"recent_ratings": []
}
}Errors
| Status | Code | Cause |
|---|---|---|
404 | USER_NOT_FOUND | No user with this username |
429 | RATE_LIMITED | Over the rate limit. Wait for Retry-After seconds |
A real USER_NOT_FOUND answer:
404 Not Found
json
{
"success": false,
"error": {
"code": "USER_NOT_FOUND",
"message": "Pengguna tidak ditemukan."
}
}List a user's ratings
GET/v1/public/users/:username/ratings
Published ratings the user received, newest first. A rating is published once both sides have rated, or after 3 days, so a new rating can take a while to appear.
- Auth: None. Anyone can call it.
- Rate limit: 100 requests a minute per IP address.
- Idempotency: Not needed. Reading has no side effects.
Path parameters
| Name | Type | Description |
|---|---|---|
username | string | Lowercase username |
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
page | integer | No | 1 to 10,000. Default 1 |
limit | integer | No | 1 to 50. Default 20 |
Example request
bash
curl "https://api.rekberpay.com/v1/public/users/budi.santoso/ratings?limit=5"js
const res = await fetch('https://api.rekberpay.com/v1/public/users/budi.santoso/ratings?limit=5', {
});
const data = await res.json();python
import os
import requests
resp = requests.get(
"https://api.rekberpay.com/v1/public/users/budi.santoso/ratings?limit=5",
timeout=30,
)
print(resp.status_code, resp.json())php
<?php
$ch = curl_init('https://api.rekberpay.com/v1/public/users/budi.santoso/ratings?limit=5');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
]);
$response = json_decode(curl_exec($ch), true);
$status = curl_getinfo($ch, CURLINFO_RESPONSE_CODE);
curl_close($ch);Example response
200 OK
json
{
"success": true,
"data": {
"page": 1,
"limit": 5,
"total": 0,
"items": []
}
}Errors
| Status | Code | Cause |
|---|---|---|
400 | INVALID_QUERY | page or limit is out of range |
404 | USER_NOT_FOUND | No user with this username |
429 | RATE_LIMITED | Over the rate limit. Wait for Retry-After seconds |