-

Please Enter Your Search
search icon
Nothing found for your search
Search results from other manuals
Nothing found for your search

1 Quickstart

Log in, queue an oligo, and read it back — in four calls. Substitute your own hostname and credentials as you go.

This assumes remote access is already switched on at the Kilobaser. If the first call does not connect, start at connect and authenticate.

1.1 Log in

curl --insecure -c cookies.txt \
  -X POST https://kilobaser.lab.example.org/api/login \
  -H 'Content-Type: application/json' \
  -d '{"username": "apibot", "password": "..."}'
{
  "id": "55d56ae5-6484-44f2-9f60-2b75fa3f0b96",
  "expiresAt": "2026-09-09T22:08:26.625789374Z",
  "user": { "id": "apibot", "name": "Robot", "role": "user" }
}

The session is a cookie, saved here in cookies.txt and sent with -b from now on. --insecure is needed because the device's certificate is self-signed; see connect and authenticate for how to stop doing that.

1.2 Queue an oligo

curl --insecure -b cookies.txt \
  -X POST https://kilobaser.lab.example.org/api/processRuns/queue \
  -H 'Content-Type: application/json' \
  -d '{
    "title": "LAMP-042_RPP30-F3",
    "processType": "synthesis",
    "cartridgeType": "2",
    "chipKind": "2",
    "answers": { "sequence": "GACCTGCTAGATCGTACG" }
  }'

cartridgeType 2 and chipKind 2 are the standard cartridge and standard chip, which is what an unmodified oligo needs. Synthesis model covers the rest.

The Content-Type header is not optional — without it the request is rejected with 415.

1.3 Find what you queued

The response to that POST does not include the new entry's id. Read the queue to get it:

curl --insecure -b cookies.txt https://kilobaser.lab.example.org/api/init \
  | jq '.processRunQueue[] | {id, priority, title, processTypes}'
{
  "id": "2026-08-09T22:05:25Z-0be17442",
  "priority": 1,
  "title": "LAMP-042_RPP30-F3",
  "processTypes": ["insertChip", "cartridgeInit", "cartridgeActivate",
                   "initializeSystem", "insertChip", "synthesis"]
}

processTypes is the machine telling you what it will actually do. Six steps here, because this machine has just been switched on and has to set itself up first; a second oligo behind this one would show two.

That is the whole submission path. If your integration only needs to send work to the Kilobaser, you are done — somebody starts it at the touchscreen. Everything below is for integrations that drive the machine as well.

1.4 Start it

curl --insecure -b cookies.txt \
  -X POST https://kilobaser.lab.example.org/api/processRuns \
  -H 'Content-Type: application/json' \
  -d '{"id": "2026-08-09T22:05:25Z-0be17442"}'

Only the first entry in the queue can be started.

1.5 Answer the machine

The machine will stop and wait for someone. Ask it what for:

curl --insecure -b cookies.txt https://kilobaser.lab.example.org/api/status \
  | jq '{mode: .currentState.mode, pendingAnswers, currentProcessRunId}'
{
  "mode": "check",
  "pendingAnswers": ["placeholderInsertConfirmed"],
  "currentProcessRunId": "2026-08-09T22:05:25Z-0be17442"
}

mode is check and there is a pending answer: the machine is waiting. Once the thing it is asking about has actually been done, confirm it:

curl --insecure -b cookies.txt \
  -X PUT https://kilobaser.lab.example.org/api/processRuns/2026-08-09T22:05:25Z-0be17442/control \
  -H 'Content-Type: application/json' \
  -d '{"answers": {"placeholderInsertConfirmed": "true"}}'

Then it carries on until the next checkpoint, and you repeat. Note that "true" is a string.

Polling /api/status is fine for a first look and wrong for real use — subscribe to the event stream instead, see live state.

1.6 The same thing in Python

from kb_client import Kilobaser

kb = Kilobaser("kilobaser.lab.example.org", "apibot", "...", verify=False)
kb.login()

entry = kb.queue_oligo("LAMP-042_RPP30-F3", "GACCTGCTAGATCGTACG")
print(entry["id"], "->", " -> ".join(entry["processTypes"]))

kb.start(entry)

kb_client.py handles the session cookie, unwraps error messages into something readable, and reads the queue back for you. The rest of this guide uses it.

1.7 Where to go next