Skip to content
ContentsHTTP API reference

HTTP API reference

Everything an agent can do in its window, as JSON over HTTPS. The same abilities as the MCP tools, for your own code.

Basics

Address
https://api.joinpane.com/v1
Key
Authorization: Bearer jp_live_… on every request. See .
Requests
JSON bodies, with Content-Type: application/json. Without it the body isn't read: the request fails with 400 invalid_input, or goes ahead without what you sent.
Answers
JSON, with an x-request-id header. Send your own x-request-id, 8 to 64 letters, numbers, dots, dashes or underscores, to find a request again.
Ids
Windows are win_…, questions apr_…, tasks tsk_… and identities idn_…. In paths, {window} and {question} stand for them.
Examples
$JOINPANE_KEY is your key, $WINDOW a window's id and $QUESTION a question's.

MCP does the same through tools: see . Each endpoint below names its tool.

Step results

Reading and acting in a window answer with the same shape. status says how it went.

The page's text is its words, up to 8,000 characters; truncated says whether there were more. elements lists up to 400 things to press or fill in, and screenshot is the visible part of the page as a JPEG data URL. Each element has:

A read

A press waiting for a person

A step that stopped

The key and its identities

Check a key works and see where its agent may go.

Check the key

GET/v1/me

The agent this key belongs to, its workspace, and the identities it may use with its access in each: drive (can drive) or read (read only).

Request

Response

200 OK

List identities

GET/v1/identities

The same identities with how each is doing now: live, asleep, waking, code-needed, signed-out, not-signed-in, blocked, paused or setting-up.

Over MCP: list_identities

Request

Response

200 OK
  • An asleep identity wakes when a window opens in it, in a second or two. A paused one, or one still being added, can't be opened until a person sorts it out.

Windows

An agent works in its own window inside an identity, which anyone with access can watch. Each window counts toward the identity's 5, people and agents together.

Open a window

POST/v1/windows

Opens the agent's window in an identity, already signed in. If it has one there already, you get that one back.

Over MCP: open_window

Request

Response

201 Created
  • 503 node_unavailable means the identity is still starting: try again in a few seconds.
  • 409 seats_full means all 5 windows are open. Try again when one closes.
  • 409 conflict with another means the agent already has as many windows there as it may.

List windows

GET/v1/windows

The agent's open windows, in every identity it may use.

Over MCP: list_windows

Request

Response

200 OK

Close a window

DELETE/v1/windows/{window}

Closes the window. It frees one of the identity's 5 and stops counting toward the agent's browser hours.

Over MCP: close_window

Request

Response

200 OK

Reading and acting

Each of these is a step in the agent's window. A step acts the way a person would, with real clicks and keys, waits for the page to settle, and answers with a .

Read the page

GET/v1/windows/{window}/page

The page in the window's current tab: its text, the elements you can press or fill in, its tabs and a screenshot.

Over MCP: read_page

Request

Response

200 OK

Press an element

POST/v1/windows/{window}/click

Presses a button, link or other element by its ref, then reads the page with a screenshot. Presses that publish or pay ask a person first, and so can presses that delete, send messages or change settings. See .

Over MCP: click

Request

Response

200 OK

Type into a field

POST/v1/windows/{window}/type

Clicks into a field by its ref and types, then reads the page without a screenshot.

Over MCP: type

Request

Response

200 OK
  • Password fields stop with password unless an admin lets agents type into them. Their values never appear in a read.

Press a key

POST/v1/windows/{window}/press

Presses one key, then reads the page without a screenshot.

Over MCP: press_key

Request

Response

200 with a .

Scroll

POST/v1/windows/{window}/scroll

Scrolls by most of a screen, then reads the page with a screenshot.

Over MCP: scroll

Request

Response

200 with a .

Go back

POST/v1/windows/{window}/back

Goes back a page in the current tab, then reads it with a screenshot.

Over MCP: go_back

Request

Response

200 with a .

Go forward

POST/v1/windows/{window}/forward

Goes forward a page in the current tab, then reads it with a screenshot.

Request

Response

200 with a .

Switch tab

POST/v1/windows/{window}/tabs/{index}

Makes another of the window's tabs the current one, by the index a read gives it, then reads it with a screenshot. Websites open tabs of their own; a read lists them all.

Over MCP: switch_tab

Request

Response

200 with a .

Drive files

When a website asks for a file, an agent sends one from Drive. Which files it may send is an admin's choice: its identities' files, all of Drive, or none.

List Drive files

GET/v1/drive

The Drive files the agent may send, newest first, up to 500. Sizes are in bytes.

Over MCP: list_drive_files

Request

Response

200 OK

Send Drive files

POST/v1/windows/{window}/upload

Sends Drive files to the website: presses its file field or upload button and answers the file picker. Then reads the page without a screenshot.

Over MCP: upload_file

Request

Response

200 with a .

  • Many websites hide their file field behind a button. If the read lists no element of type file, pass the button's ref.

Asking people

Presses that need a person's yes ask on their own. An agent can also ask a question of its own, with the answers it offers.

Ask people

POST/v1/questions

Asks the people this agent asks, all at once, with a screenshot of the window. The first answer counts. Waits up to 20 seconds for it before answering.

Over MCP: ask_person

Request

Response

201 Created

Check a question

GET/v1/questions/{question}

Where a question stands: pending, answered, skipped (nobody answered in 30 minutes and the agent skips) or cancelled.

Over MCP: wait_for_answer

Request

Response

200 OK

Tasks

A task names what the agent is doing, so people watching can follow its steps in Agents, and its plan shows the steps still to come. Opening a window starts one called “Working in Studio uploads” when none is running there. See .

Start a task

POST/v1/tasks

Starts a named task. The agent's task still running there ends as done.

Over MCP: start_task

Request

Response

201 Created

Update the plan

PUT/v1/tasks/current/plan

Replaces the plan of the agent's latest task that's still going. Send what's left to do, not what's done.

Over MCP: update_plan

Request

Response

200 OK
  • 404 not_found when no task is running: start one first.

Finish the task

POST/v1/tasks/current/finish

Ends the agent's latest task that's still going, as done or stopped.

Over MCP: finish_task

Request

Response

200 OK

Errors

An error comes with its HTTP status as {"error": {"code", "message"}}, with fields for invalid input and the requestId. Messages say what happened and how to fix it, in words you can show a person or a model as they are.

409 Conflict

A 401 also carries WWW-Authenticate: Bearer realm="joinpane".

Limits and timing

  • There's no rate limit per request. What limits an agent is its windows, its monthly hours and how long each step takes. See .
  • One step at a time per window. Wait for a step's answer before sending the next one to the same window.
  • A step waits for the page to settle, a few seconds at most, and gives up after 45 seconds with 503 node_unavailable.
  • Waiting for people: a press or a question waits up to 20 seconds within the call; GET /v1/questions/{question} waits up to 25 with wait. People have 30 minutes before the agent's “If nobody answers” setting applies.
  • Sizes: page text up to 8,000 characters, up to 400 elements, typing up to 20,000 characters, up to 20 files in one upload, and the newest 500 Drive files in a list.