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
- Call each
pop URL exactly once after the item has been displayed.
- Fire within 1 hour of the original ad request. After 1 hour, the PoP URL expires.
- Duplicate calls are silently ignored — the server deduplicates by spot ID.
- Fire independently for
ad and news after each item plays.
- 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:
| Attempt | Delay |
|---|
| 1st retry | 1 second |
| 2nd retry | 2 seconds |
| 3rd retry | 4 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 ------------------|
...