unbrowse-ai Apps & tools API

What the workspace enabled, by app; tool scopes with their own MCP URL (/mcp/{slug}); switch tools off; unpublish and republish.

Operations 9

GET /api/v1/apps Apps and the tools in each #
GET /api/v1/scopes Tool scopes #
POST /api/v1/scopes Create or update a scope (by slug) #
GET /api/v1/scopes/{slug} One scope #
PUT /api/v1/scopes/{slug} Update a scope #
DELETE /api/v1/scopes/{slug} Delete a scope #
GET /api/v1/tools/triage Duplicate and junk tools among the ones you learned #
POST /api/v1/tools/triage/jev Ask Jev which of your tools do the same job though their requests differ #
POST /api/v1/tools/{capabilityId}/{action} Switch a tool on or off, unpublish / republish one you learned, or pin it as… #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/unbrowse-ai:unbrowse-ai-apps-tools-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

unbrowse-ai-apps-tools-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Unbrowse Ai Apps & tools API
  version: 1.0.0
  contact:
    name: Unbrowse
    email: hello@unbrowse.ai
    url: https://unbrowse.ai
  termsOfService: https://unbrowse.ai/terms
  description: 'Operations tagged Apps & tools across 2 of this provider''s published API definitions: unbrowse-ai-openapi.json, unbrowse-ai-openapi2.json. Each path carries the servers of the definition it was published in.'
servers:
- url: https://api.unbrowse.ai
  description: Unbrowse
- url: https://unbrowse.ai
  description: Unbrowse
security:
- oauth2:
  - unbrowse
- apiKey: []
tags:
- name: Apps & tools
  description: What the workspace enabled, by app; tool scopes with their own MCP URL (/mcp/{slug}); switch tools off; unpublish and republish.
paths:
  /api/v1/apps:
    get:
      tags:
      - Apps & tools
      operationId: listApps
      summary: Apps and the tools in each
      description: The workspace's own tools and the public ones it uses, grouped by app (registrable domain), with whether each is switched on and, for its own, whether it is published. Also the workspace's scopes with their MCP URLs.
      responses:
        '200':
          description: Apps, tools and scopes
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://api.unbrowse.ai
      description: Unbrowse
  /api/v1/scopes:
    get:
      tags:
      - Apps & tools
      operationId: listScopes
      summary: Tool scopes
      responses:
        '200':
          description: Scopes, each with its MCP URLs
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    post:
      tags:
      - Apps & tools
      operationId: saveScope
      summary: Create or update a scope (by slug)
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ToolScope'
      responses:
        '201':
          description: The scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ToolScope'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://api.unbrowse.ai
      description: Unbrowse
  /api/v1/scopes/{slug}:
    get:
      tags:
      - Apps & tools
      operationId: getScope
      summary: One scope
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          pattern: ^[a-z0-9][a-z0-9-]{0,39}$
      responses:
        '200':
          description: The scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ToolScope'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    put:
      tags:
      - Apps & tools
      operationId: updateScope
      summary: Update a scope
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          pattern: ^[a-z0-9][a-z0-9-]{0,39}$
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ToolScope'
      responses:
        '200':
          description: The scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ToolScope'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    delete:
      tags:
      - Apps & tools
      operationId: deleteScope
      summary: Delete a scope
      parameters:
      - name: slug
        in: path
        required: true
        schema:
          type: string
          pattern: ^[a-z0-9][a-z0-9-]{0,39}$
      responses:
        '200':
          description: Deleted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://api.unbrowse.ai
      description: Unbrowse
  /api/v1/tools/triage:
    get:
      tags:
      - Apps & tools
      operationId: toolTriage
      summary: Duplicate and junk tools among the ones you learned
      description: 'One listed tool per job on a site. Tools that make the same request (or fix a value where another takes it as an input) are grouped; the working, proven, cheaper (HTTP before a rendered page or the browser), more general, newer one is listed and the others leave discover, tools/list and routing. They still run by id, and when the listed one starts failing the next is listed in its place. Requests that are not data (Cloudflare''s endpoints, sitemaps, static files) are never listed. templateCandidates are tools that fix different values in one place: one tool with an input would answer them all.'
      responses:
        '200':
          description: Counts, groups (listed and hidden, with why), junk, templateCandidates and pinned tools
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://api.unbrowse.ai
      description: Unbrowse
  /api/v1/tools/triage/jev:
    post:
      tags:
      - Apps & tools
      operationId: toolTriageJev
      summary: Ask Jev which of your tools do the same job though their requests differ
      description: Per site, one Jev request asks, for each listed tool, which other tool does the same job (a search over GET, over POST and as a rendered page). Tools that choose each other, one chosen at 85% or more, or a tool most of whose answer goes to a group join that group; code allows it only between tools that only read, both take an input or both none, and never between two tools that fix different values in one place. Every answer is kept per pair and per version of both tools, so a pair is asked once. Never runs for a workspace with external inference off. Undo one with POST /api/v1/tools/{id}/unmerge.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                site:
                  type: string
                  description: Only this site
                maxSites:
                  type: integer
                  minimum: 1
                  maximum: 20
                  default: 10
      responses:
        '200':
          description: Sites asked, pairs judged and merged, and the triage after
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://api.unbrowse.ai
      description: Unbrowse
  /api/v1/tools/{capabilityId}/{action}:
    post:
      tags:
      - Apps & tools
      operationId: changeTool
      summary: Switch a tool on or off, unpublish / republish one you learned, or pin it as…
      description: enable / disable apply to every connection in the workspace. unpublish takes down the public copy this workspace published and keeps the tool private until republish; a copy someone else published stays up. pin lists this tool for its job whatever triage ranks first (GET /api/v1/tools/triage); unpin hands the choice back to triage. unmerge says this tool does not do the same job as the tools Jev grouped it with; Jev never asks about those pairs again.
      parameters:
      - name: capabilityId
        in: path
        required: true
        schema:
          type: string
      - name: action
        in: path
        required: true
        schema:
          type: string
          enum:
          - enable
          - disable
          - unpublish
          - republish
          - pin
          - unpin
          - unmerge
      responses:
        '200':
          description: The tool's new state
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Object'
        '400':
          $ref: '#/components/responses/Error'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '402':
          $ref: '#/components/responses/Error'
        '404':
          $ref: '#/components/responses/Error'
        '429':
          $ref: '#/components/responses/Error'
    servers:
    - url: https://api.unbrowse.ai
      description: Unbrowse
components:
  responses:
    Unauthorized:
      description: Missing or invalid credentials. The WWW-Authenticate header names the protected-resource metadata.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Error:
      description: An error
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    ToolScope:
      type: object
      required:
      - slug
      description: A named set of apps and tools. An MCP client at /mcp/{slug} (or /mcp?scope={slug}) lists and routes to only these; /mcp?apps=a.com,b.com is the ad-hoc form.
      properties:
        slug:
          type: string
          pattern: ^[a-z0-9][a-z0-9-]{0,39}$
        name:
          type: string
        apps:
          type: array
          items:
            type: string
          description: Registrable domains (github.com); every tool on them is in scope.
        tools:
          type: array
          items:
            type: string
          description: Capability ids, on top of the apps.
        core:
          description: Which Unbrowse tools the connection keeps.
          oneOf:
          - type: string
            enum:
            - all
            - run_only
          - type: array
            items:
              type: string
        discoverPublic:
          type: boolean
          description: Let discover search the whole public registry, beyond the scope's apps.
        urls:
          type: object
          readOnly: true
          properties:
            mcp:
              type: string
            mcpQuery:
              type: string
    Object:
      type: object
      additionalProperties: true
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
            message:
              type: string
          additionalProperties: true
      additionalProperties: true
  securitySchemes:
    oauth2:
      type: oauth2
      description: 'Authorization code with PKCE (S256). Clients may register dynamically at /oauth/register. Discovery: /.well-known/oauth-authorization-server; the REST API''s protected-resource metadata is /.well-known/oauth-protected-resource/api.'
      flows:
        authorizationCode:
          authorizationUrl: https://api.unbrowse.ai/authorize
          tokenUrl: https://api.unbrowse.ai/oauth/token
          refreshUrl: https://api.unbrowse.ai/oauth/token
          scopes:
            unbrowse: Run tasks and read results on the user's behalf, with their kept logins.
    apiKey:
      type: http
      scheme: bearer
      description: An Unbrowse API key (create one in the console at https://unbrowse.ai/app).
externalDocs:
  description: Docs
  url: https://docs.unbrowse.ai
x-refined-from:
- unbrowse-ai-openapi.json
- unbrowse-ai-openapi2.json