Skip to content

Quickstart

This gets you from a new game to a formed match. It assumes you have signed up; the free tier is enough for everything here.

In the portal, create an API credential for your game. It is shown once. Store it in your secret manager now, because it cannot be retrieved again, only replaced.

Create a queue with this configuration. It is the smallest thing that will match anything:

version: 1
queue_id: acme.smoketest
name: Smoke Test
rulesets:
- ruleset_id: default
engine_id: nemesis
params:
team_size: { start: 5, end: 5 }
team_count: { start: 2, end: 2 }

Ten players, two teams of five. Everything else takes a default: skill matching is on, latency scoring is off, and no attribute filtering happens. Change queue_id to something in your own namespace. Dot-separated is the convention, and it groups your queues together.

One ticket is one player or one party. This is a single player:

Terminal window
grpcurl -H 'Authorization: Bearer <token>' -d '{
"ticket": {
"id": "3f2b8c1e-9a4d-4f7b-8e11-2c5d6a7b8c90",
"queue_id": "acme.smoketest",
"ruleset_ids": ["default"],
"engine_input": "<base64 nemesis EngineInput>"
}
}' match.ivk.dev:443 matchmaker.core.v1.MatchmakerService/CreateTicket

engine_input is a serialized matchmaker.engines.nemesis.v1.EngineInput, base64-encoded. That is the awkward part of calling the API by hand, and it is why the .NET SDK exists. It packs the payload for you:

EngineInput = Nemesis.PackInput(new EngineInput
{
Players = { new Player { PlayerId = "alice", Mmr = 0.55 } },
})

The call returns as soon as the ticket is durably queued. That is not a match yet.

A 5v5 ruleset needs ten players, and the engine will not form a match until it has them. Submit nine more tickets with different UUIDs and varying mmr values.

Reusing an ID is not an error, since that is how retries stay safe, but it will not add a second player to the pool. Ten calls with the same ID leave you with one ticket and no match.

Within a tick or two of the tenth ticket, the engine forms a match and emits a match.created outcome carrying the match ID, every ticket, and the teams the engine chose.

You submitted tickets and the engine matched them. A real integration adds four things:

NextWhy
Core ConceptsThe model behind what you just did: pools, ticks, commitments
Integration FlowThe full sequence, including provisioning and notifying players
Queue ConfigurationLatency budgets, skill tolerance, crossplay rules
Production ChecklistThe failure cases you have not handled yet

Start with this: a formed match is a commitment. Those ten players have left the pool and are counting on your backend to put them in a game. The integration flow covers what that obliges you to do.