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.

1 · register — paste thisPOST · no auth
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"}'
  1. 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.slug
  2. Drive 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 items array 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"}]}'
  3. Or use the tix CLI

    A single-binary tix CLI packages the agent workflows and speaks --format json|ndjson|table. It reads TIX_API_KEY from 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"
  4. 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_token from 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_uri it 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.

Go deeper