Skip to content
20 changes: 20 additions & 0 deletions 91.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# NIP-91: AND Operator in Filters

Enable `AND` within a single tag filter by using an `&` modifier in filters for indexable tags.

```
filters: {
"kinds": [1],
"&t": ["meme", "cat", "black", "white"],
"#t": ["black", "white"]
Comment thread
dskvr marked this conversation as resolved.
Outdated
}
// returns kind `1` events with `t` tags that have both "meme" and "cat" that have the tag "black" or "white" by NIP-91 relays, whereas relays without NIP-91 return entire result for local intersection.
```

## Rules

- `AND` **MUST** take precedence over `OR` by relays
- Any tag value used in `AND` **SHOULD** be ignored in `OR` by relays supporting NIP-91
- Tag values used in `AND` by libraries and clients **MUST** include standard `OR` tags [`#`] for compatibility with relays that do not support NIP-91.
- libraries and clients `SHOULD` run `&` post-filters after recieving results from relays; already standard practice.

12 changes: 12 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
- [NIP-84: Highlights](84.md)
- [NIP-89: Recommended Application Handlers](89.md)
- [NIP-90: Data Vending Machines](90.md)
- [NIP-91: AND filters](91.md)
- [NIP-92: Media Attachments](92.md)
- [NIP-94: File Metadata](94.md)
- [NIP-96: HTTP File Storage Integration](96.md)
Expand Down Expand Up @@ -201,6 +202,17 @@ They exist to document what may be implemented by [Nostr](https://github.com/nos
[lnpub]: https://github.com/shocknet/Lightning.Pub/blob/master/proto/autogenerated/client.md
[joinstr]: https://gitlab.com/1440000bytes/joinstr/-/blob/main/NIP.md

## Filters

| kind | description | NIP |
| --------------- | -------------------------- | ------------------------ |
| `authors` | by pubkey | [01](01.md) |
| `ids` | by ids | [01](01.md) |
| `kinds` | by kinds | [01](01.md) |
| `#{}` | by indexable tag (OR) | [01](01.md) |
| `&{}` | by indexable tag (AND) | [91](91.md) |
| `search` | by search times | [50](50.md) |

## Message types

### Client to Relay
Expand Down