# The contracts board (/jobs)

> Offers and requests between players with the reward held by the server until the poster confirms the work; disputes through a ticket. New in 0.3, off by default.

Source: https://stygion.eu/docs/keystone/jobs
Updated: 2026-10-25

New in 0.3, module `jobs`, off by default. Players post work they offer or work they want done, with a reward. **The server keeps both sides honest**: the reward leaves the poster's inventory when the contract is posted - whole stacks with all their components - and is held until the poster confirms the work.

## How a contract goes

1. **Post**: `/jobs post <offer|request> <hotbar slots|-> <title>` - the reward is the stacks in the hotbar slots you name (`1,2`), or `-` for none. With the client half the reward is picked from the inventory on a screen.
2. **Take**: `/jobs take <id>`.
3. **Deliver**: `/jobs deliver <id>` says the work is done.
4. **Confirm**: `/jobs confirm <id>` by the poster - the taker gets the reward, or finds it waiting at their next join (`/jobs mail`).

`/jobs cancel <id>`: the poster gets the reward back while the contract is open (or taken and past its time); the taker who cancels gives the contract up and it goes back on the board. A contract still open when its time runs out (`most-ahead`, 30 days) goes back to its poster, reward and all.

**Disputes**: `/jobs dispute <id> <reason>` opens a ticket (module `tickets`, kind `dispute-kind`, default `report`) and freezes the reward until staff settle it with `/jobs settle <id> pay|refund` (`keystone.jobs.manage`). Without the tickets module a dispute cannot be raised.

## Money from another mod

Rewards are items only, unless you write both `currency.take-command` and `currency.give-command` (with `{player}`, `{uuid}` and `{amount}`, e.g. `eco take {player} {amount}`). **At your own risk:** Keystone trusts only the command's own success, so a command that reports success without taking the money makes the escrow wrong. Money is paid only while the player is online; otherwise it waits in their mailbox. `currency.most` caps one reward.

## Limits

`most-open` and `most-taken` (5 each per player), `most-on-board` (200), `most-slots` (9 stacks per reward), `most-title` (64), `most-details` (300), `post-wait` (30 s between two posts), `keep-finished` (7 days shown; the audit keeps every one), `listed` (10 in chat).

`GET /v1/jobs` (scope `players.read`, `?state=`) returns the board. Addons hear `JobChanged`. Permission `keystone.jobs`.
