You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: docs/nip-drafts/nip-ADS.md
+17-17Lines changed: 17 additions & 17 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -43,7 +43,9 @@ A replaceable event (`kind:30100`) where an advertiser bids for ad placement.
43
43
"link": "<link to open when the ad is interacted with>",
44
44
"call_to_action": "<text for the call to action>",
45
45
"bid": <amount in msats to pay per action>,
46
-
"hold_time": <time in seconds>
46
+
"hold_time": <time in seconds>,
47
+
"max_payouts": <maximum number of paid actions>,
48
+
"payout_reset_interval": <interval in seconds to reset the payout count>,
47
49
}),
48
50
"tags": [
49
51
["k", "<action type>"],
@@ -76,6 +78,9 @@ A replaceable event (`kind:30100`) where an advertiser bids for ad placement.
76
78
***call\_to\_action** (`optional`): Button/text prompt (e.g., “Buy now”). The offerer may choose to display this prompt as part of the ad, or omit it entirely. If not set, the offerer may apply a default call-to-action of their own choosing.
77
79
***bid** (`required`): The amount in msats the advertiser is willing to pay for a successful action (number).
78
80
***hold\_time** (`required`): Seconds the advertiser will reserve funds after the offer has been accepted, while waiting for the action to be completed (number).
81
+
***max\_payouts** (`required`): The maximum number of times an offerer can be paid for a successful action per ad. Payouts pause once this limit is reached and resume after the payout_reset_interval.
82
+
***payout_reset_interval** (`required`): Time in seconds after which the payouts counter resets, allowing payouts to resume.
83
+
79
84
80
85
### Tags
81
86
@@ -84,10 +89,9 @@ A replaceable event (`kind:30100`) where an advertiser bids for ad placement.
84
89
85
90
Specifies the user action that triggers payment. Available types:
86
91
87
-
*`link`: Paid when a user clicks the ad and successfully opens the target URL.
92
+
*`action`: Paid when a user clicks or performs a similar interaction with the ad to open the target URL.
88
93
*`view`: Paid when the ad is rendered and visible to the user.
89
-
*`conversion`: Paid when a user completes a defined goal (e.g., newsletter signup, purchase) after interacting with the ad.
90
-
*`attention`: Paid when the user demonstrates focused engagement (e.g., hovering, dwell time) with the ad content.
94
+
*`attention`: Paid when the user shows focused engagement with the ad (e.g., hover, dwell time, or when the ad enters the viewport).
"budget": 10000, // Maximum budget in millisatoshis for this campaign
240
+
"dailyBudget": 10000, // hint the delegate to limit the total amount of msats spent per day
237
241
"nwc": "nostr+walletconnect://..."// Budgeted NWC URL used to authorize payouts
238
242
}
239
243
```
@@ -242,6 +246,9 @@ If a `D` tag is included, **all negotiation events must be sent to the delegate'
242
246
243
247
Delegates might automatically listen for biddings that have a matching `D` tag.
244
248
249
+
> [!IMPORTANT]
250
+
> The dailyBudget should be considered a recommendation to help the delegate pace spending; it’s not a hard cap. To prevent overspend, a strict budget limit should be configured at the NWC wallet level.
251
+
245
252
246
253
#### Expiration
247
254
(`expiration`) `optional`
@@ -375,20 +382,13 @@ The tags must include:
375
382
376
383
The following default messages are recommended for use when bailing out of an offer:
377
384
378
-
advertiser → offerer:
379
-
380
385
*`out_of_budget`: No remaining budget for ads.
381
-
*`payment_method_not_supported`: Unsupported invoice or payment method.
382
-
*`invoice_expired_or_invalid`: Invoice does not match the bid or has expired.
383
-
*`expired`: The bid or ad has expired and can no longer be accepted.
384
-
*`no_route`: The advertiser cannot find a payment route to the offerer's node.
386
+
*`expired`: The bid or hold time has expired and the negotiation is no longer valid or not accepted.
387
+
*`failed_payment`: The advertiser can't pay the invoice
385
388
*`action_incomplete`: The advertiser did not detect successful completion of the user action on their end.
386
-
387
-
offerer → advertiser:
388
-
389
-
*`cancelled`: The offerer has cancelled the offer
390
-
*`adspace_unavailable`: The ad space is no longer available for the requested ad.
391
-
*`ad_not_displayed`: The ad was not displayed to the user.
389
+
*`cancelled`: The offer was cancelled.
390
+
*`unknown` : unknown reason for bailing out.
391
+
392
392
393
393
Implementers can define additional custom reason strings as needed.
0 commit comments