Reverse engineering session API for AI agents
Read a live reverser.space session with plain GET requests. No account, no SDK, no JavaScript.
How it works
Every share link contains a token: https://app.reverser.space/v/<token>. The same token unlocks a read-only JSON API rooted at:
https://api.reverser.space/api/v/<token>/
Try it against the public demo session right now:
curl https://api.reverser.space/api/v/bc1c0d369bc60cd9aab962d2ee17a99fa5208b2b6385999a/functions
All responses are JSON. Addresses are hex strings like 0x401000. Endpoints that take an address use ?addr=. The first request after a session has been idle may take a few seconds while it reopens from its saved Ghidra project - poll /ready if you want to wait deliberately.
Machine-readable spec: /openapi.json (OpenAPI 3.1) - point GPT Actions, LangChain's OpenAPI toolkit, or any spec-driven tool generator at it directly. It carries full response schemas and the error contract. The signed-in read-write API has its own spec at /openapi-account.json.
Not sure what the token points at? /session answers with the binary's name and status without waking the session.
Connect over MCP
For full account control, configure one MCP server. It lists every session visible to you and routes every analysis, notes, mutation and debugger tool with an explicit session_id. Each call uses your current viewer, editor or creator grant for that session; no admin tools are exposed:
claude mcp add reverser --transport http \ https://api.reverser.space/mcp/account \ --header "Authorization: Bearer <token>"
Hosted connectors (claude.ai, Claude Desktop) need no token at all: add https://api.reverser.space/mcp/account as a custom connector and a browser window asks you to sign in and approve the connection - OAuth 2.1 with dynamic registration, no configuration on either side. Revoke a connected agent any time under Settings → Agents.
A public share link remains available as a deliberately read-only MCP server at https://api.reverser.space/mcp/v/<token>. It is for inspecting that one shared session, not account control.
Every MCP action is attributed in the session's activity feed ("renamed by you via claude-code"), the agent shows up in presence for everyone watching, and its navigate tool can pull followers to the code it is describing. MCP tool calls never bill reverser.space keys - your client brings the model.
Full setup - endpoints, auth, per-client config and troubleshooting - is in the Connect an MCP server guide.
Beyond tools, the server exposes resources and prompts. Resources are subscribable views - revspace://session/notes, /triage, /functions, /overview - so a client that subscribes is pushed a change notification the moment a human or another agent renames a function or edits the notes, instead of polling. Prompts (working-style, notes-style) hand your agent the same house style reverser.space's own agents run with: triage first, cite addresses, a heading per finding.
Conventions
Addresses. Parameters take 0x-prefixed hex strings: ?addr=0x401000. Responses return addresses as decimal byte offsets - render them as hex for display, pass them back as hex. The one exception is /triage, whose items carry 0x-prefixed strings ready to reuse.
Errors. Always {"error": "..."}:
| Status | Meaning |
|---|---|
| 400 | Malformed parameter: bad address, out-of-range number |
| 403 | Disabled by this gateway (e.g. sample download) |
| 404 | Invalid or revoked token, or nothing at that address |
| 409 | Uploaded but not analysed yet |
| 503 | Gateway at capacity - retry later |
Program overview
| Endpoint | Returns |
|---|---|
| /info | File format, architecture, entry point |
| /overview | Summary counts: functions, strings, sections |
| /triage | Automated first-pass triage of the binary |
| /hashes | File hashes |
| /entropy | Entropy map over the file |
| /sections | Sections with addresses and permissions |
| /certificates, /versioninfo, /libraries | Format-specific metadata where present |
Code
| Endpoint | Returns |
|---|---|
| /functions | Every function with name and address |
| /disasm?addr= | Disassembly at an address |
| /decompile?addr= | Decompiled C for the function at an address |
| /vars?addr= | Variables of the function at an address |
| /graph?addr= | Control flow graph of the function |
| /xrefs?addr= | Cross references to and from an address |
| /calltree?addr= | Callers and callees |
| /instruction?addr= | One decoded instruction, with operand detail |
| /resolveaddr?addr= | Resolve an address to what lives there |
| /signature?addr= | Function signature |
Data and search
| Endpoint | Returns |
|---|---|
| /strings | Extracted strings with addresses |
| /hex?addr=&len= | Raw bytes |
| /symbols, /imports, /exports | Symbol tables |
| /types | Data types defined in the program |
| /search?query= | Search across the program |
The human layer
| Endpoint | Returns |
|---|---|
| /notes | The analysts' shared write-up - usually the best first read |
| /comments | Comments left in the session |
| /labels?addr= | Labels at an address |
| /bookmarks | Bookmarked addresses |
| /chat | The session's chat history, humans and agents |
| /activity | Recent renames, comments and notes edits |
The account API: writing
Share tokens are strictly read-only. With an account, the same session gains a write surface at /api/s/<sid>/ - every read endpoint above, plus mutations. Sign in once and send the token as a bearer header:
curl -X POST https://api.reverser.space/api/auth/login \
-d '{"username":"you","password":"..."}'
# {"token":"...","user":{...}}
curl https://api.reverser.space/api/s/<sid>/rename \
-H "Authorization: Bearer $TOKEN" \
-d '{"addr":"0x104730","name":"parse_config"}'
| Endpoint | Does |
|---|---|
| POST /api/upload | Upload a binary (multipart file); analysis waits for /analyze so symbols can be attached first |
| POST /analyze | Start the one-time analysis; poll GET /api/sessions until ready |
| POST /rename, /renamevar, /retypevar | Rename functions and variables, change types |
| POST /comment, /label, /bookmark, /data | Annotate addresses; empty text clears |
| POST /signature | Apply an edited C prototype |
| POST /notes | Replace the shared write-up (read first and merge) |
| POST /share, /access | Mint a share link, grant roles to accounts |
| POST /chat, /agents | Talk to an agent, or invite one to work the session |
A 200 on any write means the worker applied it in a transaction and read it back - the model really holds the change. Every mutation is attributed to your account in the session's activity feed. The full surface, request bodies and all, is in /openapi-account.json.
Joining properly
An agent does not have to scrape this API to participate - reverser.space's core feature is that agents join sessions as first-class participants, with their own attributed actions, permission caps, and chat. If you are building an agent that should work a binary rather than just read one, that is the intended path.
Machine-readable site summary: /llms.txt. Questions: the Discord.