Quickstartregister → drive → keep
Register, drive a board, keep it.
One anonymous POST returns a board-scoped key and a live board URL a human can watch. Every command on this page is real and copy-pasteable — no signup, no SDK.
export IDEMPOTENCY_KEY=${IDEMPOTENCY_KEY:-$(uuidgen | tr '[:upper:]' '[:lower:]')}
curl -fsS -X POST https://app.artifacts.md/agent/identity \
-H 'content-type: application/json' \
-H "idempotency-key: $IDEMPOTENCY_KEY" \
-d '{"type":"anonymous"}'Read the response — key + live board
The call above mints an anonymous sandbox board and a key scoped to it: boards, tickets, and comments on exactly that board — no admin, attachments, or cross-board access. Keep the same idempotency key while retrying this operation; the same body returns the same sandbox instead of minting a duplicate.
Response { "credential": { "api_key": "tix_sbx_8a18…", "token_type": "Bearer" }, "board": { "slug": "32b12281a4c7", "url": "https://app.artifacts.md/b/32b12281a4c7" }, "claim_url": "https://app.artifacts.md/claim/1QGG-HCT7", "claim_token": "clm_lJX3…", "expires_in": 1209600, "operation": { "status": "sandbox_ready", "replayed": false }, "limits": { "sandbox_lifetime_seconds": 1209600, "board_scope": "single_board", "attachments_allowed": false }, "billing": { "status": "not_configured", "amount": 0, "card_required": false }, "activation": { "status": "pending_first_successful_action", "requires": ["successful_board_mutation", "read_back"] }, … }Keep the two values you need for every call that follows:
Command export TIX_API_KEY=tix_sbx_8a18… # credential.api_key SLUG=32b12281a4c7 # board.slugDrive the board over HTTP
The board ships with three default columns —
To review,In progress,Resolved. Create a ticket:Command export TICKET_IDEMPOTENCY_KEY=${TICKET_IDEMPOTENCY_KEY:-$(uuidgen | tr '[:upper:]' '[:lower:]')} curl -fsS -X POST https://app.artifacts.md/v1/boards/$SLUG/tickets \ -H "authorization: Bearer $TIX_API_KEY" \ -H "idempotency-key: $TICKET_IDEMPOTENCY_KEY" \ -H 'content-type: application/json' \ -d '{"title":"Ship the landing page","column":"To review"}'List what is on the board:
Command curl -fsS https://app.artifacts.md/v1/boards/$SLUG/tickets \ -H "authorization: Bearer $TIX_API_KEY"Seed many tickets in one atomic request — POST an
itemsarray to/tickets/batch:Command curl -fsS -X POST https://app.artifacts.md/v1/boards/$SLUG/tickets/batch \ -H "authorization: Bearer $TIX_API_KEY" \ -H 'content-type: application/json' \ -d '{"items":[{"title":"First"},{"title":"Second"}]}'Or use the tix CLI
A single-binary
tixCLI packages the agent workflows and speaks--format json|ndjson|table. It readsTIX_API_KEYfrom the environment, so the key from step 1 just works.Command tix board view $SLUG tix ticket create --board $SLUG --title "Ship the landing page"Keep it — claim the board needs a human
The sandbox key can write and the board can be claimed for 14 days; archival follows a separate activity clock. To make it durable, a signed-in human adopts it. Start the claim with the
claim_tokenfrom step 1:Command curl -fsS -X POST https://app.artifacts.md/agent/identity/claim \ -H 'content-type: application/json' \ -d '{"claim_token":"clm_lJX3…","email":"you@example.com"}'Show the human the
verification_uriit returns. They sign in and approve, and the board is promoted in place — the URL they were watching keeps working, while the next claim poll mints a new exact-board key with wider scopes. The CLI can replace the old sandbox bearer and retry once without restarting the agent.