Skip to main content
Each pop URL returned by the Get Spot endpoint is a one-time-use callback that confirms the content was displayed. Proof of play is critical for billing and revenue attribution.

How it works

After displaying an item (ad or news), fire its pop URL via HTTP GET:
curl -X GET "https://api.framen.com/pop/GtzksoSqPq2ojMzcDbdAahGgz4ogDKjLF44tdowMHFue"

Rules

  1. Call each pop URL exactly once after the item has been displayed.
  2. Fire within 1 hour of the original ad request. After 1 hour, the PoP URL expires.
  3. Duplicate calls are silently ignored — the server deduplicates by spot ID.
  4. Fire independently for ad and news after each item plays.
  5. Only fire if displayed. Do not fire for items that were skipped or failed to load.

Retry on failure

If a PoP GET request fails (network error, timeout, 5xx response), retry up to 3 times with exponential backoff:
AttemptDelay
1st retry1 second
2nd retry2 seconds
3rd retry4 seconds
Retries are safe because the server deduplicates — sending the same PoP URL multiple times has no side effects. A missed PoP means lost revenue attribution, so retrying is always preferable to dropping.
Every missed proof-of-play callback is a missed revenue event. Implement PoP callbacks with retry logic as a first-class concern in your player software, not an afterthought.

Typical request cycle

Player                          Server
  |                               |
  |--- GET /rt_ad/{screen_id} --->|
  |<-- response (ad + news) ------|
  |                               |
  | [pre-cache content]           |  PoP must fire
  |                               |  within 1 hour
  | [play first item based on     |
  |  newsFirst flag]              |
  |--- GET first_item.pop ------->|
  |                               |
  | [play second item]            |
  |--- GET second_item.pop ------>|
  |                               |
  |--- GET /rt_ad/{screen_id} --->|  (next cycle)
  |<-- response ------------------|
  ...