Airtop Profiles API
Persists browser state (cookies, local storage, logged-in sessions) into named profiles that can be saved when a session terminates and loaded into future sessions, and deletes profiles when no longer needed.
Persists browser state (cookies, local storage, logged-in sessions) into named profiles that can be saved when a session terminates and loaded into future sessions, and deletes profiles when no longer needed.
openapi: 3.0.1
info:
title: Airtop API
description: >-
REST API for Airtop, a cloud-browser platform for AI agents. Create and
manage remote Chromium browser sessions, open and navigate windows, drive
pages with natural-language interactions (click, type, hover, scroll),
query and extract page content with AI, capture screenshots, and persist
state with profiles. All requests are authenticated with a Bearer API key.
termsOfService: https://www.airtop.ai/legal/terms-of-service
contact:
name: Airtop Support
url: https://docs.airtop.ai
version: '1.0'
servers:
- url: https://api.airtop.ai/api/v1
description: Airtop production API
security:
- bearerAuth: []
tags:
- name: Sessions
description: Create and manage cloud browser sessions.
- name: Windows
description: Create, navigate, and close browser windows inside a session.
- name: Page Interaction
description: Drive a page with natural-language click, type, hover, and scroll.
- name: AI Query
description: Query, extract, and scrape page content with AI.
- name: Screenshots
description: Capture window screenshots.
- name: Profiles
description: Persist and delete browser profiles.
paths:
/sessions:
get:
operationId: listSessions
tags:
- Sessions
summary: List sessions
description: Returns the cloud browser sessions for the authenticated account.
parameters:
- name: offset
in: query
required: false
schema:
type: integer
- name: limit
in: query
required: false
schema:
type: integer
- name: status
in: query
required: false
schema:
type: string
responses:
'200':
description: A list of sessions.
content:
application/json:
schema:
$ref: '#/components/schemas/SessionsListResponse'
post:
operationId: createSession
tags:
- Sessions
summary: Create session
description: >-
Starts a new cloud browser session (a remote Chromium instance) with
optional profile, proxy, recording, captcha solving, and idle timeout
configuration. Returns connection URLs (CDP and WebDriver) for the
live session.
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/SessionConfig'
responses:
'200':
description: The created session.
content:
application/json:
schema:
$ref: '#/components/schemas/SessionResponse'
/sessions/{sessionId}:
get:
operationId: getSession
tags:
- Sessions
summary: Get session info
description: Returns details and status for a single session.
parameters:
- $ref: '#/components/parameters/SessionId'
responses:
'200':
description: The session.
content:
application/json:
schema:
$ref: '#/components/schemas/SessionResponse'
delete:
operationId: terminateSession
tags:
- Sessions
summary: Terminate session
description: Ends a session and releases its cloud browser resources.
parameters:
- $ref: '#/components/parameters/SessionId'
responses:
'200':
description: Session terminated.
content:
application/json:
schema:
$ref: '#/components/schemas/EnvelopeResponse'
/sessions/{sessionId}/profile:
put:
operationId: saveProfileOnTermination
tags:
- Profiles
summary: Save profile on termination
description: >-
Marks a named profile to be persisted (cookies, local storage,
authenticated state) when the session terminates, so it can be loaded
into a future session.
parameters:
- $ref: '#/components/parameters/SessionId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
profileName:
type: string
description: Name to save the persisted browser profile under.
required:
- profileName
responses:
'200':
description: Profile save scheduled.
content:
application/json:
schema:
$ref: '#/components/schemas/EnvelopeResponse'
/sessions/{sessionId}/windows:
get:
operationId: listWindows
tags:
- Windows
summary: List windows
description: Lists the windows currently open in a session.
parameters:
- $ref: '#/components/parameters/SessionId'
responses:
'200':
description: A list of windows.
content:
application/json:
schema:
$ref: '#/components/schemas/WindowsListResponse'
post:
operationId: createWindow
tags:
- Windows
summary: Create window
description: >-
Opens a new browser window (tab) in a session and optionally navigates
it to a URL.
parameters:
- $ref: '#/components/parameters/SessionId'
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/CreateWindowRequest'
responses:
'200':
description: The created window.
content:
application/json:
schema:
$ref: '#/components/schemas/WindowResponse'
/sessions/{sessionId}/windows/{windowId}:
get:
operationId: getWindowInfo
tags:
- Windows
summary: Get window info
description: >-
Returns information about a window, including a live-view URL and
current navigation state.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
responses:
'200':
description: The window.
content:
application/json:
schema:
$ref: '#/components/schemas/WindowResponse'
delete:
operationId: closeWindow
tags:
- Windows
summary: Close window
description: Closes a window within a session.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
responses:
'200':
description: Window closed.
content:
application/json:
schema:
$ref: '#/components/schemas/EnvelopeResponse'
/sessions/{sessionId}/windows/{windowId}/load-url:
post:
operationId: loadUrl
tags:
- Windows
summary: Load URL
description: Navigates an existing window to a new URL.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
url:
type: string
format: uri
description: The URL to navigate to.
waitUntil:
type: string
enum: [load, domContentLoaded, complete, noWait]
description: Navigation event to wait for before returning.
waitUntilTimeoutSeconds:
type: integer
default: 30
required:
- url
responses:
'200':
description: Navigation complete.
content:
application/json:
schema:
$ref: '#/components/schemas/WindowResponse'
/sessions/{sessionId}/windows/{windowId}/click:
post:
operationId: click
tags:
- Page Interaction
summary: Click
description: >-
Clicks an element identified by a natural-language description. AI
resolves the description to an on-page target before clicking.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ClickRequest'
responses:
'200':
description: Click performed.
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
/sessions/{sessionId}/windows/{windowId}/hover:
post:
operationId: hover
tags:
- Page Interaction
summary: Hover
description: Hovers over an element described in natural language.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ElementInteractionRequest'
responses:
'200':
description: Hover performed.
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
/sessions/{sessionId}/windows/{windowId}/type:
post:
operationId: type
tags:
- Page Interaction
summary: Type
description: >-
Types text into a field described in natural language, with options to
clear the field first and press Enter afterward.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/TypeRequest'
responses:
'200':
description: Text typed.
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
/sessions/{sessionId}/windows/{windowId}/scroll:
post:
operationId: scroll
tags:
- Page Interaction
summary: Scroll
description: Scrolls the page, optionally toward a described element or by an offset.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/ScrollRequest'
responses:
'200':
description: Scroll performed.
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
/sessions/{sessionId}/windows/{windowId}/screenshot:
get:
operationId: takeScreenshot
tags:
- Screenshots
summary: Take screenshot
description: Captures a screenshot of the current state of a window.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
responses:
'200':
description: The screenshot.
content:
application/json:
schema:
$ref: '#/components/schemas/ScreenshotResponse'
/sessions/{sessionId}/windows/{windowId}/scrape:
post:
operationId: scrapeContent
tags:
- AI Query
summary: Scrape content
description: Scrapes the raw content of the page loaded in a window.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: false
content:
application/json:
schema:
$ref: '#/components/schemas/ScrapeRequest'
responses:
'200':
description: Scraped content.
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
/sessions/{sessionId}/windows/{windowId}/page-query:
post:
operationId: pageQuery
tags:
- AI Query
summary: Query a page
description: >-
Asks a natural-language question about the current page and returns an
AI model response, optionally shaped by a JSON output schema.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PageQueryRequest'
responses:
'200':
description: The AI model response.
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
/sessions/{sessionId}/windows/{windowId}/paginated-extraction:
post:
operationId: paginatedExtraction
tags:
- AI Query
summary: Query a page with pagination
description: >-
Extracts structured data from a page and follows pagination links to
gather results across multiple pages.
parameters:
- $ref: '#/components/parameters/SessionId'
- $ref: '#/components/parameters/WindowId'
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedExtractionRequest'
responses:
'200':
description: The extracted data.
content:
application/json:
schema:
$ref: '#/components/schemas/AIResponse'
/profiles/{profileId}:
delete:
operationId: deleteProfile
tags:
- Profiles
summary: Delete profile
description: Deletes a persisted browser profile.
parameters:
- name: profileId
in: path
required: true
schema:
type: string
responses:
'200':
description: Profile deleted.
content:
application/json:
schema:
$ref: '#/components/schemas/EnvelopeResponse'
/requests/{requestId}:
get:
operationId: getRequestStatus
tags:
- Sessions
summary: Get request status
description: >-
Returns the status and result of an asynchronous request previously
issued against the API.
parameters:
- name: requestId
in: path
required: true
schema:
type: string
responses:
'200':
description: The request status.
content:
application/json:
schema:
$ref: '#/components/schemas/EnvelopeResponse'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
description: >-
Airtop API key supplied as a Bearer token in the Authorization header:
`Authorization: Bearer YOUR_API_KEY`.
parameters:
SessionId:
name: sessionId
in: path
required: true
description: Identifier of the cloud browser session.
schema:
type: string
WindowId:
name: windowId
in: path
required: true
description: Identifier of the window within the session.
schema:
type: string
schemas:
Envelope:
type: object
properties:
meta:
type: object
properties:
requestId:
type: string
status:
type: string
errors:
type: array
items:
type: object
warnings:
type: array
items:
type: object
EnvelopeResponse:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
type: object
SessionConfig:
type: object
properties:
configuration:
type: object
properties:
profileName:
type: string
description: Name of a profile to load into the session.
extensionIds:
type: array
items:
type: string
description: Chrome Web Store extension IDs to load.
proxy:
description: Proxy configuration (boolean, object, or array).
oneOf:
- type: boolean
- type: object
- type: array
items:
type: object
record:
type: boolean
description: Enable session recording.
solveCaptcha:
type: boolean
description: Automatically solve captcha challenges.
timeoutMinutes:
type: integer
default: 10
description: Idle timeout in minutes before the session ends.
Session:
type: object
properties:
id:
type: string
status:
type: string
cdpWsUrl:
type: string
description: Chrome DevTools Protocol WebSocket URL for the session.
cdpUrl:
type: string
webDriverUrl:
type: string
profileName:
type: string
SessionResponse:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
$ref: '#/components/schemas/Session'
SessionsListResponse:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
type: object
properties:
sessions:
type: array
items:
$ref: '#/components/schemas/Session'
CreateWindowRequest:
type: object
properties:
url:
type: string
format: uri
description: Initial URL to load in the window.
screenResolution:
type: string
default: 1280x720
description: Window viewport resolution.
waitUntil:
type: string
enum: [load, domContentLoaded, complete, noWait]
waitUntilTimeoutSeconds:
type: integer
default: 30
Window:
type: object
properties:
windowId:
type: string
targetId:
type: string
url:
type: string
title:
type: string
liveViewUrl:
type: string
WindowResponse:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
$ref: '#/components/schemas/Window'
WindowsListResponse:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
type: object
properties:
windows:
type: array
items:
$ref: '#/components/schemas/Window'
ElementInteractionRequest:
type: object
properties:
elementDescription:
type: string
description: Natural-language description of the target element.
clientRequestId:
type: string
costThresholdCredits:
type: integer
timeThresholdSeconds:
type: integer
configuration:
type: object
required:
- elementDescription
ClickRequest:
allOf:
- $ref: '#/components/schemas/ElementInteractionRequest'
- type: object
properties:
configuration:
type: object
properties:
clickType:
type: string
enum: [click, doubleClick, rightClick]
visualAnalysis:
type: object
waitForNavigationConfig:
type: object
waitForNavigation:
type: boolean
TypeRequest:
type: object
properties:
text:
type: string
description: The text to type.
elementDescription:
type: string
description: Natural-language description of the field to type into.
pressEnterKey:
type: boolean
description: Press Enter after typing.
clearInputField:
type: boolean
description: Clear the field before typing.
clientRequestId:
type: string
costThresholdCredits:
type: integer
timeThresholdSeconds:
type: integer
configuration:
type: object
required:
- text
ScrollRequest:
type: object
properties:
scrollToElement:
type: string
description: Natural-language description of an element to scroll to.
scrollBy:
type: object
description: Pixel offset to scroll by.
configuration:
type: object
PageQueryRequest:
type: object
properties:
prompt:
type: string
description: The question or instruction for analyzing page content.
clientRequestId:
type: string
followPaginationLinks:
type: boolean
default: false
costThresholdCredits:
type: integer
timeThresholdSeconds:
type: integer
configuration:
type: object
properties:
outputSchema:
type: object
description: JSON schema describing the desired structured output.
scrape:
type: object
visualAnalysis:
type: object
experimental:
type: object
required:
- prompt
PaginatedExtractionRequest:
type: object
properties:
prompt:
type: string
clientRequestId:
type: string
costThresholdCredits:
type: integer
timeThresholdSeconds:
type: integer
configuration:
type: object
properties:
outputSchema:
type: object
paginationMode:
type: string
enum: [auto, paginated, infinite-scroll]
required:
- prompt
ScrapeRequest:
type: object
properties:
clientRequestId:
type: string
costThresholdCredits:
type: integer
timeThresholdSeconds:
type: integer
configuration:
type: object
AIResponse:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
type: object
properties:
modelResponse:
type: string
description: The AI model's textual response to the prompt.
meta:
type: object
properties:
requestId:
type: string
status:
type: string
usage:
type: object
properties:
credits:
type: number
screenshots:
type: array
items:
type: object
ScreenshotResponse:
allOf:
- $ref: '#/components/schemas/Envelope'
- type: object
properties:
data:
type: object
properties:
screenshots:
type: array
items:
type: object
properties:
dataUrl:
type: string
description: Base64 data URL of the captured screenshot.