← Todos los NIPs

NIP-88

Encuestas

BorradorEventos

Una encuesta es un evento kind 1068 con una pregunta y opciones; cada voto es un evento kind 1018 enviado a los relays que indica la encuesta, y los clientes cuentan un voto por persona.

De un vistazo

Estado
En uso, pero todavía puede cambiar.
Kinds
Tags
  • e
  • endsAt
  • option
  • polltype
  • relay
  • response
Último cambio
30 dic 2025

Pruébalo

Edita el formulario o el JSON: ambos se mantienen sincronizados, la insignia indica si el resultado es válido y, al tocar cualquier campo, se explica qué hace.

Qué construir

Cómo se conectan las partes: Preguntar y responder

Ejemplos
Válido 1 nota

Aún sin firmar · Solo claves de demo. Las claves secretas de estos personajes son públicas a propósito.

Formulario
1 ene 2025, 0:00 UTC

Contenido

La pregunta o el título de la encuesta.

Tags

  1. option Obligatorio

    Una respuesta que se puede elegir. Repítela para cada opción.

  2. option Obligatorio

    Una respuesta que se puede elegir. Repítela para cada opción.

  3. relay Recomendado

    Un relay donde deben publicarse los votos. Repítela para varios.

  4. relay Recomendado

    Un relay donde deben publicarse los votos. Repítela para varios.

  5. polltype Opcional

    Si se puede elegir una opción o varias. Si falta, es de opción única.

  6. endsAt Opcional

    Cuándo se cierra la encuesta.

    8 ene 2025, 0:00 UTC
Añadir tag

Cómo funciona este NIP

Paso 1 de 5

Haz la pregunta

El content de la encuesta es la pregunta o el título que verá la gente.

En el curso

Ningún capítulo del curso cubre este NIP todavía. El editor de arriba es la forma más rápida de empezar.

Se basa en

Ver también

Especificación

El texto de las especificaciones se cita en inglés del repositorio nostr-protocol/nips. Nuestras explicaciones y la interfaz están traducidas. Código fuente en GitHub en el commit 0046368

Leer la especificación517 palabras, citadas del repositorio en el commit 0046368.

This NIP defines the event scheme that describe Polls on nostr.

Events

Poll Event

The poll event is defined as a kind:1068 event.

  • content key holds the label for the poll.

Major tags in the poll event are:

  • option: The option tags contain an OptionId(any alphanumeric) field, followed by an option label field.
  • relay: One or multiple tags that the poll is expecting respondents to respond on.
  • polltype: can be "singlechoice" or "multiplechoice". Polls that do not have a polltype should be considered a "singlechoice" poll.
  • endsAt: signifying at which unix timestamp the poll is meant to end.

Example Event

{
  "content": "Pineapple on pizza",
  "created_at": 1719888496,
  "id": "9d1b6b9562e66f2ecf35eb0a3c2decc736c47fddb13d6fb8f87185a153ea3634",
  "kind": 1068,
  "pubkey": "dee45a23c4f1d93f3a2043650c5081e4ac14a778e0acbef03de3768e4f81ac7b",
  "sig": "7fa93bf3c430eaef784b0dacc217d3cd5eff1c520e7ef5d961381bc0f014dde6286618048d924808e54d1be03f2f2c2f0f8b5c9c2082a4480caf45a565ca9797",
  "tags": [
    ["option", "qj518h583", "Yay"],
    ["option", "gga6cdnqj", "Nay"],
    ["relay", "<relay url1>"],
    ["relay", "<relay url2>"],
    ["polltype", "singlechoice"],
    ["endsAt", "<unix timestamp in seconds>"]
  ]
}

Responses

The response event is a kind:1018 event. It contains an e tag with the poll event it is referencing, followed by one or more response tags.

  • response : The tag contains "response" as its first positional argument followed by the option Id selected.

The responses are meant to be published to the relays specified in the poll event.

Example Response Event

{
  "content": "",
  "created_at": 1720097117,
  "id": "60a005e32e9596c3f544a841a9bc4e46d3020ca3650d6a739c95c1568e33f6d8",
  "kind": 1018,
  "pubkey": "1bc70a0148b3f316da33fe7e89f23e3e71ac4ff998027ec712b905cd24f6a411",
  "sig": "30071a633c65db8f3a075c7a8de757fbd8ce65e3607f4ba287fe6d7fbf839a380f94ff4e826fbba593f6faaa13683b7ea9114ade140720ecf4927010ebf3e44f",
  "tags": [
    ["e", "1fc80cf813f1af33d5a435862b7ef7fb96b47e68a48f1abcadf8081f5a545550"],
    ["response", "gga6cdnqj"],
    ["response", "m3agjsdq1"]
  ]
}

Poll Types

The polltype setting dictates how multiple response tags are handled in the kind:1018 event.

  • polltype: singlechoice: The first response tag is to be considered the actual response.
  • polltype: multiplechoice: The first response tag pointing to each id is considered the actual response, without considering the order of the response tags.

Counting Results

Results can be queried by fetching kind:1018 events from the relays specified in the poll. The results displayed should only be 1 vote event per pubkey. In case of multiple events for a pubkey, the event with the largest timestamp within the poll limits should be considered.

Example for querying polls.

const fetchVoteEvents = (filterPubkeys: string[]) => {
  let resultFilter: Filter = {
    "#e": [pollEvent.id],
    kinds: [1018],
  };
  if (filterPubkeys?.length) {
    resultFilter.authors = filterPubkeys;
  }
  if (pollExpiration) {
    resultFilter.until = Number(pollExpiration);
  }
  pool.subscribeMany(relays, [resultFilter], {
    onevent: handleResultEvent,
  });
};

Example for maintaining OneVotePerPubkey

const oneVotePerPubkey = (events: Event[]) => {
  const eventMap = new Map<string, Event>();

  events.forEach((event) => {
    if (
      !eventMap.has(event.pubkey) ||
      event.created_at > eventMap.get(event.pubkey)!.created_at
    ) {
      eventMap.set(event.pubkey, event);
    }
  });

  return Array.from(eventMap.values());
};

Relays

It is advisable for poll authors to use relays that do not allow backdated events and do not honor kind:5 (delete) requests for vote events in order to maintain the integrity of poll results after the poll has ended.

Curation

The clients may configure fetching results by specific people. This can be achieved by creating kind:30000 follow sets, and fetching results only from the follow set. Clients can also employ other curation algorithms, like Proof Of Work and Web of Trust scores for result curations.