# Wire Protocol

This page specifies the frame format, request ops, and error kinds that ToriiDB daemon clients and the server exchange over the unix socket.

## Wire Protocol

Both directions use the same frame:

```text
[4-byte big-endian payload length][JSON payload]
```

Frames larger than 8 MiB are refused by `readFrame`. A payload that is not valid JSON gets a `bad_request` response on the same connection.

| op | request fields | success response |
|---|---|---|
| `get` | `db` `key` | `{"record":{db,key,type,content,created_at,updated_at?,expire_at?}}` |
| `entries` | `db` `pattern` `contains?` `after?` `limit?` | `{"entries":[<record>,...]}` |
| `set` | `db` `key` `content` `expire_at?` `vector?` | `{}` |
| `del` | `db` `keys` | `{"count":<removed>}` |
| `ttl` | `db` `key` | `{"ttl":<seconds>}` |
| `expire` | `db` `keys` `ttl` | `{"count":<applied>}` |
| `keys` | `db` `pattern` `limit?` `page?` | `{"list":{db,page,limit,total,keys}}` |
| `vsearch` | `db` `text` `pattern` `limit?` | `{"keys":[...]}` |
| `embedder` | none | `{"embedder":<bool>}` |

Failures return `{"error":"...","kind":"..."}`:

| kind | Client error | Typical cause |
|---|---|---|
| `not_found` | `ErrNotFound` | `get`/`ttl` on a missing key |
| `bad_request` | `ErrBadRequest` | invalid db index, missing `pattern`/`keys`/`text`, `ttl <= 0`, invalid content, unknown op |
| `no_embedder` | `ErrNoEmbedder` | `set` with `vector` or `vsearch` without an API key |
| `internal` | plain error | store or embedding failure |

## Related Pages

- [Server-Side Filtering](/socket-daemon-filtering)
- [Connections](/socket-daemon-connections)
- [Errors](/core-concepts-errors)
