OpenHands website screenshot

OpenHands

OpenHands (by All Hands AI, formerly OpenDevin) is an open-source autonomous coding agent platform. Ships as a Python Agent SDK, CLI, local GUI with a REST API, Docker images, and a hosted cloud at app.all-hands.dev plus a self-hosted Kubernetes Enterprise tier. Core code is MIT licensed at github.com/OpenHands/OpenHands with 75K+ stars.

4 APIs 15 Features
AIAgentsAutonomousOpen SourceDeveloper ToolsSoftware EngineeringCode Generation

APIs

OpenHands Agent SDK

Composable Python SDK for defining, running, and orchestrating agents locally or scaled to thousands in the cloud. Source at github.com/All-Hands-AI/agent-sdk.

OpenHands CLI

Command-line interface for running OpenHands agents with Claude, GPT, or any other LLM. Source at github.com/OpenHands/OpenHands-CLI.

OpenHands Local GUI REST API

Local React application with a REST API behind it for driving agents from the desktop. Shipped via Docker and the main OpenHands repo.

OpenHands Cloud

Hosted OpenHands platform at app.all-hands.dev with a free tier (Minimax model), GitHub/GitLab/Bitbucket integrations, and Slack/Jira/Linear connectors.

Collections

OpenHands

OPEN

Pricing Plans

Openhands Plans Pricing

1 plans

PLANS

Rate Limits

Openhands Rate Limits

2 limits

RATE LIMITS

FinOps

Features

Open-source autonomous coding agent under MIT license
Python Agent SDK for embedding agents into custom apps
CLI for terminal-based agent pair programming
Local desktop GUI with REST API
Docker images for one-command local deploy
Hosted cloud with free tier (Minimax model)
Self-hosted Enterprise on Kubernetes in private VPC
Works with Claude, GPT, and any LLM provider
GitHub, GitLab, Bitbucket integrations
Slack, Jira, Linear connectors (Cloud/Enterprise)
Multi-user RBAC for Enterprise
Conversation sharing and collaboration
Sandboxed, auditable execution environments
75K+ GitHub stars, 9.5K+ forks, 100+ releases
Use cases include vuln scanning, PR review, legacy migration, incident triage, test expansion, docs automation

Resources

🔗
Website
Website
🌐
Portal
Portal
🔗
Documentation
Documentation
🔗
LlmsText
LlmsText
🚀
GettingStarted
GettingStarted
📦
SDKs
SDKs
💻
SourceCode
SourceCode
💻
SourceCode
SourceCode
💻
SourceCode
SourceCode
💻
SourceCode
SourceCode
🔗
RoadMap
RoadMap
👥
GitHubOrganization
GitHubOrganization
👥
GitHubOrganization
GitHubOrganization
🔗
Slack
Slack
🔗
Contact
Contact
🔗
Careers
Careers
📰
Blog
Blog
📜
PrivacyPolicy
PrivacyPolicy
📜
TermsOfService
TermsOfService
🔗
X (Twitter)
X (Twitter)
🔗
License
License

Sources

apis.yml Raw ↑
opencollection: 1.0.0
info:
  name: OpenHands
  version: 0.53.0
items:
- info:
    name: List Supported Models
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/options/models
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: List model identifiers available on this server based on configured providers.
- info:
    name: List Agents
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/options/agents
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: List available agent types supported by this server.
- info:
    name: List Security Analyzers
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/options/security-analyzers
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: List supported security analyzers.
- info:
    name: Get Config
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/options/config
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get current config.
- info:
    name: List Workspace Files
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/list-files
    params:
    - name: conversation_id
      value: ''
      type: path
    - name: path
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: List workspace files visible to the conversation runtime. Applies .gitignore and internal ignore rules.
- info:
    name: Get File Content
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/select-file
    params:
    - name: conversation_id
      value: ''
      type: path
    - name: file
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Return the content of the given file from the conversation workspace.
- info:
    name: Download Workspace Archive
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/zip-directory
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Return a ZIP archive of the current conversation workspace.
- info:
    name: Git Changes
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/git/changes
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Git Changes
- info:
    name: Git Diff
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/git/diff
    params:
    - name: conversation_id
      value: ''
      type: path
    - name: path
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Git Diff
- info:
    name: Upload Files
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/conversations/:conversation_id/upload-files
    params:
    - name: conversation_id
      value: ''
      type: path
    body:
      type: multipart-form
      data: []
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Upload Files
- info:
    name: Submit Feedback
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/conversations/:conversation_id/submit-feedback
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Submit user feedback.


    This function stores the provided feedback data.


    To submit feedback:'
- info:
    name: Get Remote Runtime Config
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/config
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Retrieve the runtime configuration.


    Currently, this is the session ID and runtime ID (if available).'
- info:
    name: Search Events
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/events
    params:
    - name: conversation_id
      value: ''
      type: path
    - name: start_id
      value: ''
      type: query
    - name: end_id
      value: ''
      type: query
    - name: reverse
      value: ''
      type: query
    - name: limit
      value: ''
      type: query
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Search through the event stream with filtering and pagination.
- info:
    name: Add Event
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/conversations/:conversation_id/events
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Add Event
- info:
    name: Get Microagents
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/microagents
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Get all microagents associated with the conversation.


    This endpoint returns all repository and knowledge microagents that are loaded for the conversation.'
- info:
    name: Search Conversations
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations
    params:
    - name: page_id
      value: ''
      type: query
    - name: limit
      value: ''
      type: query
    - name: selected_repository
      value: ''
      type: query
    - name: conversation_trigger
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Search Conversations
- info:
    name: New Conversation
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/conversations
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Initialize a new session or join an existing one.


    After successful initialization, the client should connect to the WebSocket

    using the returned conversation ID.'
- info:
    name: Get Conversation
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get Conversation
- info:
    name: Update Conversation
    type: http
  http:
    method: PATCH
    url: https://app.all-hands.dev/api/conversations/:conversation_id
    params:
    - name: conversation_id
      value: ''
      type: path
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Update conversation metadata.


    This endpoint allows updating conversation details like title.

    Only the conversation owner can update the conversation.'
- info:
    name: Delete Conversation
    type: http
  http:
    method: DELETE
    url: https://app.all-hands.dev/api/conversations/:conversation_id
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Delete Conversation
- info:
    name: Get Prompt
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/remember-prompt
    params:
    - name: conversation_id
      value: ''
      type: path
    - name: event_id
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get Prompt
- info:
    name: Start Conversation
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/conversations/:conversation_id/start
    params:
    - name: conversation_id
      value: ''
      type: path
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Start an agent loop for a conversation.


    This endpoint calls the conversation_manager''s maybe_start_agent_loop method

    to start a conversation. If the conversation is already running, it will

    return the existing agent loop info.'
- info:
    name: Stop Conversation
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/conversations/:conversation_id/stop
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Stop an agent loop for a conversation.


    This endpoint calls the conversation_manager''s close_session method

    to stop a conversation.'
- info:
    name: Load Settings
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/settings
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Load Settings
- info:
    name: Store Settings
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/settings
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Store Settings
- info:
    name: Reset Settings
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/reset-settings
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Resets user settings. (Deprecated)
- info:
    name: Store Provider Tokens
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/add-git-providers
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Store Provider Tokens
- info:
    name: Unset Provider Tokens
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/unset-provider-tokens
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Unset Provider Tokens
- info:
    name: Load Custom Secrets Names
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/secrets
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Load Custom Secrets Names
- info:
    name: Create Custom Secret
    type: http
  http:
    method: POST
    url: https://app.all-hands.dev/api/secrets
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Create Custom Secret
- info:
    name: Update Custom Secret
    type: http
  http:
    method: PUT
    url: https://app.all-hands.dev/api/secrets/:secret_id
    params:
    - name: secret_id
      value: ''
      type: path
    body:
      type: json
      data: '{}'
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Update Custom Secret
- info:
    name: Delete Custom Secret
    type: http
  http:
    method: DELETE
    url: https://app.all-hands.dev/api/secrets/:secret_id
    params:
    - name: secret_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Delete Custom Secret
- info:
    name: Get User Installations
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/installations
    params:
    - name: provider
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get User Installations
- info:
    name: Get User Repositories
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/repositories
    params:
    - name: sort
      value: ''
      type: query
    - name: selected_provider
      value: ''
      type: query
    - name: page
      value: ''
      type: query
    - name: per_page
      value: ''
      type: query
    - name: installation_id
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get User Repositories
- info:
    name: Get User
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/info
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get User
- info:
    name: Search Repositories
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/search/repositories
    params:
    - name: query
      value: ''
      type: query
    - name: per_page
      value: ''
      type: query
    - name: sort
      value: ''
      type: query
    - name: order
      value: ''
      type: query
    - name: selected_provider
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Search Repositories
- info:
    name: Get Suggested Tasks
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/suggested-tasks
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get suggested tasks for the authenticated user across their most recently pushed repositories.
- info:
    name: Get Repository Branches
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/repository/branches
    params:
    - name: repository
      value: ''
      type: query
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Get branches for a repository.
- info:
    name: Get Repository Microagents
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/repository/:repository_name/microagents
    params:
    - name: repository_name
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Scan the microagents directory of a repository and return the list of microagents.


    The microagents directory location depends on the git provider and actual repository name:

    - If git provider is not GitLab and actual repository name is ".openhands": scans "microagents" folder

    - If git provider is GitLab and actual repository name is "openhands-config": scans "microagents" folder

    - Otherwise: scans ".openhands/microagents" folder'
- info:
    name: Get Repository Microagent Content
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/user/repository/:repository_name/microagents/content
    params:
    - name: repository_name
      value: ''
      type: path
    - name: file_path
      value: ''
      type: query
      description: Path to the microagent file within the repository
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: Fetch the content of a specific microagent file from a repository.
- info:
    name: Get Trajectory
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/api/conversations/:conversation_id/trajectory
    params:
    - name: conversation_id
      value: ''
      type: path
    auth:
      type: apikey
      key: X-Session-API-Key
      value: '{{X-Session-API-Key}}'
      placement: header
  docs: 'Get trajectory.


    This function retrieves the current trajectory and returns it.'
- info:
    name: Alive
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/alive
  docs: Alive
- info:
    name: Health
    type: http
  http:
    method: GET
    url: https://app.all-hands.dev/health
  docs: Health
bundled: true