# Versia Federation Protocol

What the Versia Protocol covers, who this specification is for, and how to read it.

The Versia Protocol is a communication medium for federated applications, using HTTP and plain JSON. It is heavily inspired by [ActivityPub](https://www.w3.org/TR/activitypub/). Messages between instances are signed. The core protocol covers users, subscriptions and how instances exchange entities, and anything beyond it, posts included, is a namespaced [extension](/extensions).

[Entities](/entities)

[Explore SDKs](/sdks)

## Audience and Scope

This specification is for people implementing a Versia server or library.

It covers what instances exchange with each other: [entities](/entities), [signatures](/signatures), [HTTP routes](/federation/endpoints) and [extensions](/extensions), plus [Versia Links](/links) for opening addresses. It does not cover client APIs, storage, account management or moderation policy.

## Reading Order

1. [Entities](/entities), [JSON](/json) and [Signatures](/signatures), which everything else builds on.
2. [Federation](/federation), for how instances exchange entities.
3. The core entity pages, starting with [User](/entities/user) and [Subscribe](/entities/subscribe).
4. [Validation](/validation), for what to check on everything you receive.
5. [Extensions](/extensions), as you need them. Most others build on [Social](/extensions/social), which defines posts.

Two guides walk through [signing requests](/guides/signing-requests) and [implementing a receiver](/guides/implementing-a-receiver). The reasoning behind the design is in [Principles](/principles), and terms are defined in the [Glossary](/glossary). If you know ActivityPub or Matrix, [Other Protocols](/other-protocols) maps their concepts to Versia's.

## Vocabulary

The key words **MUST**, **MUST NOT**, **SHOULD**, **SHOULD NOT** and **MAY** in this specification are to be interpreted as described in BCP 14 ([RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119), [RFC 8174](https://datatracker.ietf.org/doc/html/rfc8174)) when, and only when, they appear in bold capitals, as shown here. In any other form, these words have their everyday meaning and set no requirement.

An Instance conforms to this specification if it meets every **MUST** and **MUST NOT** of the core protocol, and of each [extension](/extensions) it lists in [`compatibility.extensions`](/entities/instance-metadata). Extensions are optional.

Domains, names and timestamps in samples are fictional. In a sample, `// ...` stands for fields left out, and requests leave out signature headers unless the sample is about them.
