Skip to content

Server-Side Verification (SSV)

Rewarded playables only

SSV applies to Rewarded Playables only.

SSV allows your server to verify that a reward is legitimate before it is granted, preventing spoofed or replayed reward claims.

How It Works

  1. A user completes a rewarded ad.
  2. Simula's server sends a POST request to your callback URL with the user ID, reward details, a unique transaction_id, and an HMAC-SHA256 signature.
  3. Your server verifies the signature using your signature_secret and deduplicates by transaction_id.
  4. You grant the reward and return 200.

Publisher Configuration

Configure the following fields in the SSV Configuration section when creating the ad unit:

FieldWhat to enter
Callback URLYour server endpoint. Must include {user_id} as a URL parameter. Optionally include {transaction_id} to deduplicate. Example: https://internal.character.ai/simula/reward?user_id={user_id}&txn={transaction_id}
reward_itemName of the reward, e.g. "charms"
reward_amountQuantity to grant, e.g. 10

SSV configuration fields in the publisher dashboard

Fields Provided by Simula

FieldDetails
signature_secretSecret key for verifying callbacks.
transaction_idUnique ID included in every callback. Use it to ensure each reward is granted only once.
signatureHMAC-SHA256 over the callback payload, signed with your signature_secret. Verify this on every callback.
ad_networkAlways "simula" — identifies the callback source.

Callback Format

Simula substitutes live values into the URL template and issues a POST request:

text
POST https://internal.character.ai/simula/reward?user_id=u_98234723&txn=18fa792de1bca816048293fc71035638
json
{
  "ad_network": "simula",
  "ad_unit_id": "SIM-RWD-A3F9K2BX",
  "user_id": "u_98234723",
  "transaction_id": "18fa792de1bca816048293fc71035638",
  "reward_item": "crystals",
  "reward_amount": 10,
  "timestamp": 1707770365237,
  "signature": "a3f9c2...hmac-sha256-hex"
}