Skip to documentation
AdQuestDocs

Event evidence

API type: event. Verify a signup, purchase, install or another named product event.

On this page

SDK event proof

Start a session, then ingest the event after the named action actually occurs. session.ingestEvent attaches the session’s delivery token. Use a stable event ID for retries and a Unix timestamp in seconds represented as a string.

SDK-source event
const session = await client.startQuest(questId, { requiresTimer: false });
// Store eventId with this real action; reuse it if the request is retried.
const eventId = crypto.randomUUID();
await session.ingestEvent({
  eventId,
  eventName: "signup_completed", // Must match the configured rule.
  source: "sdk",
  timestamp: String(Math.floor(Date.now() / 1000)),
});
const completion = await questRequest(config, questId, "complete");

Server event proof

After your backend verifies the product action, calculate a lowercase hex HMAC-SHA256 signature over event_id.event_name.quest_id.external_user_id.timestamp. Use the exact normalized event name and timestamp that you send. Post to /platform/quests/{questId}/events with the public platform key, participant token and the signed payload.

Node.js — server only
import { createHmac } from "node:crypto";

const timestamp = String(Math.floor(Date.now() / 1000));
const signature = createHmac("sha256", eventSigningSecret)
  .update([eventId, eventName, String(questId), externalUserId, timestamp].join("."))
  .digest("hex");
await questRequest(config, questId, "events", {
  event_id: eventId, event_name: eventName,
  source: "server", timestamp, signature,
});

Next steps

Something unclear, missing or wrong here? Tell us