Adjust

Live
POST{base}/api/adjust

Sent when the provider needs to adjust an amount. It covers two cases: correcting the wagered amount of an open bet, and adjusting credit for games that deposit or withdraw before play, such as fishing games. The net is already computed for you in amount and direction. Apply it as given.

This callback can arrive concurrently. Re-check the player's balance under a lock before replying success, and use txn_id to reject a duplicate refId.

Process the whole txns[] batch in one DB transaction (atomic) — if any txn fails, roll back the batch and reply an error with balance_before == balance_after

If the same txn_id arrives again, do not apply it a second time; reply the current balance with code 0, or reply 20002. The only exception is a transaction that follows a /rollback of that round: it carries a corrected result and must be applied (see "re-settle after rollback" on the Contract page).

A 0 amount is real — a feature spin, a bought feature, a tip, or a stake the provider could not supply. Do not reject it: process it as a zero-value transaction and reply code 0 without moving the balance.

Always reply HTTP 200 even for business errors

⚠ Net semantics: best-system reduces every adjustment to a single net txn (amount + direction) — apply exactly what is sent; never recompute the delta yourself.

Headers

FieldTypeRequiredDescription
X-Api-KeystringYesThe API key best-system issued to you (verify it matches)
X-SignaturestringYeshex(HMAC-SHA256(secret, raw body)) — verify against the raw bytes, never re-serialize. Mismatch → code 30002

Request bodyapplication/json

FieldTypeRequiredDescription
request_idstringYesId of this request
player_usernamestringYesThe player's username on your system
currencystringYesThe player's currency code in ISO 4217, e.g. THB
product_codestring—Game-provider code (e.g. PGSOFT)
timestampnumberYesSend time in unix milliseconds
txnsobject[]YesAdjustments — amount = the net delta to apply; the sign lives in direction
└ txn_idstringYesTransaction ID. Used as the idempotency key (see the notes)
└ round_idstringYesRound ID
└ amountnumberYesAmount for this transaction, never negative and may be 0 (see the notes). Direction comes from the endpoint or the direction field
└ game_codestring—Game code
└ is_featureboolean—Whether this is a free or feature spin. Absent means false
└ statusstring—Vendor bet status. Always OPENOPEN | WAITING | SETTLED | REFUND | REJECT | ROLLBACK | VOID | TIPS
└ play_infostring—The player's position or choice, e.g. player/banker, or the game name. `UNKNOWN` means the provider could not identify it — display only
└ transaction_typestring—Either BY_TRANSACTION or BY_ROUND (see the notes)BY_TRANSACTION | BY_ROUND
└ bet_amountnumber—The bet's new total stake, not the delta — the delta is in amount. Present when a bet's stake is adjusted, absent on a direct balance adjustment
└ directionstringYesThe net direction best-system already computed (e.g. stake reduced → refund = CREDIT; stake increased → extra charge = DEBIT) — just apply it, never recomputeDEBIT | CREDIT
└ ref_txn_idstring | null—txn_id of the original bet when correcting an existing bet's stake; null for a standalone (fishing) adjustment
Request example
{
  "request_id": "9f8e7d6c-5b4a-4392-8171-605f4e3d2c1b",
  "player_username": "foobar",
  "currency": "THB",
  "product_code": "PGSOFT",
  "timestamp": 1783236608000,
  "txns": [
    {
      "txn_id": "T-009",
      "round_id": "R-1",
      "amount": 30,
      "game_code": "10300",
      "is_feature": false,
      "direction": "CREDIT",
      "ref_txn_id": "T-001"
    }
  ]
}

Expected Response

Fields in data

FieldTypeRequiredDescription
codenumberYes0 = success · see the Seamless codes page
request_idstringYesEchoed from the request
usernamestringYesEcho of player_username (defensive)
currencystringYesEchoed from the request
balance_beforenumberYesBalance before processing the whole txns[] batch
balance_afternumberYesBalance after processing the whole batch
timestampnumberYesWhen you processed it (unix ms)
Response example
{
  "code": 0,
  "request_id": "9f8e7d6c-5b4a-4392-8171-605f4e3d2c1b",
  "username": "foobar",
  "currency": "THB",
  "balance_before": 800,
  "balance_after": 830,
  "timestamp": 1783236608093
}

Possible error codes

codeNameHTTPMessage
10001SEAMLESS_USER_NOT_FOUND200Player not found on the agent system
10002SEAMLESS_INSUFFICIENT_BALANCE200Insufficient balance for the debitWhen direction = DEBIT and the balance cannot cover it
20002SEAMLESS_DUPLICATE_TXN200Duplicate transaction (txn_id already processed)
30002SEAMLESS_INVALID_SIGNATURE401Invalid X-Signature
40003SEAMLESS_FORBIDDEN200Forbidden (api-key/IP)
50001SEAMLESS_INTERNAL_ERROR200Internal error on the agent system