diff --git a/41.md b/41.md new file mode 100644 index 0000000000..c8409df8d8 --- /dev/null +++ b/41.md @@ -0,0 +1,158 @@ +NIP-41 +====== + +# Surveys / polls / quizzes +----------------------------------- + +`draft` `optional` `require:nip-13` `require:nip-57` `author:fernandolguevara` + +The `surv` tag & `surv-answer` (kind: `30041`) enables users to have surveys/polls/quizzes experiences on the network. + +## Spec + +### surv + +To start a survey on the network, an event with one or many 'surv' tags may be created. + +```json +{"tags":[ + ["surv", "{single|multiple}", "ttl", "(label)", "option 1", "option 2", "option 3", "option 4"] + ["nonce", "1", "32"] + ["amount", "milli-satoshi value"] +]} +``` + +#### tags +- `surv`: + - `{single|multiple}`: allow others to reply with single or multiple choice. + - `ttl:unix-time`: when survey expires, `0` don't expire. + - `(label):string`: if present, clients should use it as surv label. + - `option:string`: survey options +- `nonce`: if present, pow is mandatory for answer. ref: [13](13.md) +- `amount`: if present, zap is mandatory for answer. ref: [57](57.md) + +### surv-answer + +To reply to a survey on the network, an event of kind `30041` is created. + +```meta +["surv-answer", "surv-index", "option-index", ...] +``` + +```json +{ + "kind": 30041, + "tags":[ + ["e", "", "wss://...", "root"] + ["d", "surv-answer/{event-id-root}"] + ["surv-answer", "0", "option-index:int", "{...}"] + ["nonce", "1", "32"], + ["amount", "milli-satoshi value"], + ] +} +``` +at least one selected option index should present on the answer event the tag `surv-answer` + +tags: + - `e`: `` origin event. + - `d`: the value should be an string formed using origin `event-id-root` for the survey. + - `surv-answer`: + - `surv-index:int`: starting at 0. + - `option-index:int`: starting at 0. + - `nonce`: if present, pow is mandatory for answer. + - `amount`: if present, zap is mandatory for answer. + + +## Relay and client recommendations +- `surv` tag: + - Should have at least `two` options. + - The value of the `label` field should allow enough characters to express the questions. + - The `options` items should be limited up to 4. + - Each `option` should be 25 chars limited. + +## Examples + +### Example surv single + +```json +{ + "pubkey": "", + "created_at": 1000000000, + "kind": 1, + "tags": [ + ["t", "hastag"], + ["surv", "single", "0", "", "option 1", "option 2", "options 3"], + ], + "content": "#hastag what is your favorite option?", + "id": "" +}, +{ + "pubkey": "", + "created_at": 1000000000, + "kind": 30041, + "tags": [ + ["e", "", "wss://...", "root"], + ["t", "tag"], + ["surv-answer", "", "0"] + ], + "content": "here my favorite option is #option1 \n", + "id": "" +} +``` + +### Example surv multiple with expiration + +```json +{ + "pubkey": "", + "created_at": 1000000000, + "kind": 1, + "tags": [ + ["t", "hastag"], + ["surv", "multiple", "1684599600"], + ["options", "option 1", "option 2", "options 3"], + ], + "content": "#hastag what are your favorite options?", + "id": "" +}, +{ + "pubkey": "", + "created_at": 1000000000, + "kind": 30041, + "tags": [ + ["e", "", "wss://...", "root"], + ["t", "tag"], + ["surv-answer", "", "0", "2"] + ], + "content": "here my favorite option is #option1 \n", + "id": "" +} +``` +### Example multiple surv + +```json +{ + "pubkey": "", + "created_at": 1000000000, + "kind": 1, + "tags": [ + ["t", "hastag"], + ["surv", "single", "0", "surv 1?", "option 1", "option 2", "options 3"], + ["surv", "multiple", "0", "surv 2?", "option 1", "option 2", "options 3"], + ], + "content": "#hastag Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do?", + "id": "" +}, +{ + "pubkey": "", + "created_at": 1000000000, + "kind": 30041, + "tags": [ + ["e", "", "wss://...", "root"], + ["surv-answer", "0", "0"] + ["surv-answer", "1", "0", "2"] + ], + "content": "quis nostrud exercitation ullamco laboris!\n", + "id": "" +} +``` \ No newline at end of file diff --git a/README.md b/README.md index 91ad0e82e0..a0f82b3f8f 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ NIPs stand for **Nostr Implementation Possibilities**. They exist to document wh - [NIP-33: Parameterized Replaceable Events](33.md) - [NIP-36: Sensitive Content](36.md) - [NIP-40: Expiration Timestamp](40.md) +- [NIP-41: Surveys/Polls/Quizzes](41.md) - [NIP-42: Authentication of clients to relays](42.md) - [NIP-46: Nostr Connect](46.md) - [NIP-50: Keywords filter](50.md)