> AffiliateOS Help Center. Index of every article for AI tools: https://www.affiliateos.ai/help/llms.txt

# “This offerwall link is invalid or expired”

Hosted Offerwall · For publishers · Updated 30 October 2026
Web version: https://www.affiliateos.ai/help/offerwall/link-invalid-or-expired

We refused to open the wall for that link, and your user sees this message instead of offers. On a wall that uses signed links it's almost always a link that was already used or is more than 5 minutes old: sign a fresh one for every launch.

On a wall that uses simple links, check the wall ID, the `uid` and the `source` in the URL. If every link fails, even a fresh copy of your snippet, we may not have switched your wall on yet.

## What you see and what to do

| What you see | What it means | What to do |
|---|---|---|
| The message after a reload, or on a link opened a second time | A signed link works once | Sign a new URL every time the wall opens |
| The message on every signed link | The signature or the time doesn't match | Check the field order, the secret and that `ts` is in seconds |
| The message on every link, signed or not | The wall ID, the account or a wall we haven't switched on yet | Compare the wall ID with your snippet, then email us |
| A blank frame, or the browser's refused-to-connect box, in an iframe | We tell browsers not to frame a wall we can't open, or your site isn't on the wall's allowed origins | See [The wall ID is wrong](#the-wall-id-is-wrong) and the last check, and [embedding](https://www.affiliateos.ai/help/offerwall/embed-on-web-page#check-which-sites-may-frame-it) |
| The wall opened, but after a long while taps say "The offer didn't open. Try again." | A wall visit lasts an hour | Open the wall again; on signed links, with a new URL |

## Checks, most likely first

### The signed link was already used

Each signed link carries a `nonce` that works once. A reload, a link cached by your app or a link shared with someone else reuses it.

**How to confirm:** the first open worked and the second didn't.

**Fix:** have your server sign a new URL each time the wall opens, and don't cache it in the app or the page.

### The signed link is more than 5 minutes off our clock

`ts` must be within 5 minutes of our time, earlier or later.

**How to confirm:** compare `ts` in the failing URL with the current Unix time in seconds. A 13-digit `ts` is in milliseconds.

**Fix:** send whole seconds, sign at the moment the wall opens and keep your server's clock synced.

### The signature doesn't match

**How to confirm:** a fresh link fails on its first open, with the right time.

**Fix:** sign the wall ID, `uid`, `ts` and `nonce`, in that order, joined by newlines, with HMAC-SHA256 and the wall's `ows_` secret, as hex. If the URL has a `property_id`, sign it as a fifth line; if it doesn't, don't. Sign the `uid` exactly as it arrives after URL decoding. [Simple and signed links](https://www.affiliateos.ai/help/offerwall/simple-and-signed-links) has working code.

### The wall requires signed links and this one isn't signed

**How to confirm:** your Docs or property page says the wall requires server-signed launch URLs, and the failing link has no `sig`.

**Fix:** sign every launch on your server. To let simple links open the wall instead, email us with your wall ID.

### The link carries part of a signature

On a wall that takes simple links, a link with any of `ts`, `nonce` or `sig` in it is checked as a signed launch, and half a signature fails.

**How to confirm:** the link has one of those three parameters.

**Fix:** remove all three, or sign properly.

### The wall ID is wrong

**How to confirm:** the part after `/w/` doesn't match the wall ID in your **Docs** snippet or on your property, character for character.

**Fix:** copy the snippet again rather than retyping the ID.

### The `uid` is missing or empty

The wall shows this message without asking us when the link has no `uid`.

**How to confirm:** the link has no `uid=`, or `uid=` with nothing after it.

**Fix:** fill in your user's ID on every launch. A literal `YOUR_USER_ID` opens the wall, but every user then shares one ID.

### `source` has a value we don't accept

`source` must be `hosted`, `iframe`, `ios` or `android`, and appear once.

**How to confirm:** the link has another value (`web`, `app`), or two `source` parameters, which can happen when a wrapper adds its own.

**Fix:** keep one `source` with one of the four values, or leave it out.

### The `property_id` can't be used with this wall

**How to confirm:** the link has a `property_id`, and the check under [Find the exact reason](#find-the-exact-reason) names the property.

**Fix:** in **Properties & Apps**, check that the property exists on this account, is active, has **Hosted Offerwall** turned on under **Integrations**, and is linked to this wall. Copying the property's own snippet gets the right ID.

### The wall isn't switched on, or the account isn't active

We switch each wall on for real users when we set up your account. A wall we haven't switched on yet, a wall that was deactivated or an account that isn't active refuses every launch, signed or not.

**How to confirm:** every link fails, including a fresh copy of your snippet, and the check under [Find the exact reason](#find-the-exact-reason) answers `Offerwall runtime is unavailable`, `Offerwall app is disabled` or `Offerwall access required`.

**Fix:** email us with your wall ID.

## Find the exact reason

The wall shows one message for every refusal. Our launch endpoint names the reason. Send it the values from the failing link:

```bash
curl -s -X POST https://affiliateos.xyz/offerwall/sessions \
  -H "content-type: application/json" \
  -d '{"appId":"owapp_your_wall","uid":"u_48213","source":"iframe","country":"US"}'
```

Add `"ts"` (as a number), `"nonce"`, `"sig"` and `"property_id"` when the link has them. A refusal answers with a `message` such as `Offerwall launch nonce already used`, `Offerwall launch link expired` or `Offerwall app not found`. A success opens a wall visit, as a launch would; on a signed link it uses up the `nonce`, so test with a fresh one.

## Send us this

Email [hello@affiliateos.ai](mailto:hello@affiliateos.ai) with:

- the email you sign in with,
- your wall ID (`owapp_...`),
- the failing launch URL (a used or expired signed URL can't open the wall again, so it's safe to send),
- the time it failed, with your time zone,
- where the wall was shown: a link, an iframe, a browser tab or a WebView, and on which device,
- the `message` from the check above, if you ran it.
