Apify Tools API
The API endpoints described in this section let you test your proxy connection. For details, see the [Apify Proxy](https://docs.apify.com/platform/proxy).
The API endpoints described in this section let you test your proxy connection. For details, see the [Apify Proxy](https://docs.apify.com/platform/proxy).
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
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.curl "https://apis.io/api/v1/apis/apify:apify-tools-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a 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: 3.2.0
info:
title: Apify Tools API
license:
name: Apache 2.0
url: https://www.apache.org/licenses/LICENSE-2.0.html
description: 'The Apify API (version 2) provides programmatic access to the Apify
platform. The API is organized
around RESTful
HTTP endpoints. You can download the complete OpenAPI schema of Apify API in the YAML or JSON formats. The source code is also available on GitHub. All requests and responses (including errors) are encoded in
JSON format with UTF-8 encoding,
with a few exceptions that are explicitly described in the reference. To access the API, we recommend using one of our API clients:
Stable API clients:
- For Node.js, we recommend the `apify-client` NPM
package. - For Python, we recommend the `apify-client` PyPI
package. Experimental API clients:
- For Java, we recommend the `apify-client` Maven central component. - For Rust, we recommend the `apify-client` crate. - For .NET, we recommend the `apify-client` Nuget package. - For PHP, we recommend the `apify-client` Packagist package. - For Go, we recommend the `apify-client` package. The clients'' functions correspond to the API endpoints and have the same
parameters. This simplifies development of apps that depend on the Apify
platform. :::note Important Request Details
- `Content-Type` header: For requests with a JSON body, you must include the `Content-Type: application/json` header. - Method override: You can override the HTTP method using the `method` query parameter. This is useful for clients that can only send `GET` requests. For example, to call a `POST` endpoint, append `?method=POST` to the URL of your `GET` request. :::
## Authentication
**You can find your API token on the
Integrations page in the
Apify Console.**
To use your token in a request, either:
- Add the token to your request''s `Authorization` header as `Bearer `. E.g., `Authorization: Bearer xxxxxxx`. More info. (Recommended). - Add it as the `token` parameter to your request URL. (Less secure). Using your token in the request header is more secure than using it as a URL
parameter because URLs are often stored
in browser history and server logs. This creates a chance for someone
unauthorized to access your API token. **Never share your API token or password with untrusted parties!**
For more information, see our
integrations documentation. ### Agentic payments
AI agents can authenticate and pay for Actor runs without an Apify account
using agentic payments. Instead of an API token, the request carries a
payment credential that both authorizes and pays for the call. Apify supports
the x402 protocol
(`PAYMENT-SIGNATURE` header) and
Skyfire
(`skyfire-pay-id` header). ## Basic usage
To run an Actor, send a POST request to the Run
Actor endpoint using either the
Actor ID code (e.g. `vKg4IjxZbEYTYeW8T`) or its name (e.g. `janedoe~my-actor`):
`https://api.apify.com/v2/actors/[actor_id]/runs`
If the Actor is not runnable anonymously, you will receive a 401 or 403
response code. This means you need to add your secret API
token to the request''s
`Authorization` header (recommended) or as a
URL query parameter `?token=[your_token]` (less secure). Optionally, you can include the query parameters described in the Run
Actor section to customize your
run. If you''re using Node.js, the best way to run an Actor is using the
`Apify.call()` method from the Apify
SDK. It
runs the Actor using the account you are currently logged into (determined
by the secret API token). The result is an Actor run
object and its output (if
any). A typical workflow is as follows:
1. Run an Actor or task using the Run
Actor or Run
task API endpoints. 2. Monitor the Actor run by periodically polling its progress using the Get
run API
endpoint. 3. Fetch the results from the Get
items API endpoint using the
`defaultDatasetId`, which you receive in the Run request response. Additional data may be stored in a key-value store. You can fetch them from
the Get record API endpoint
using the `defaultKeyValueStoreId` and the store''s `key`. **Note**: Instead of periodic polling, you can also run your
Actor or
task
synchronously.'
contact: {}
version: v2-2026-10-08T073338Z
servers:
- url: https://api.apify.com
variables: {}
security:
- httpBearer: []
- apiKey: []
tags:
- name: Tools
x-displayName: Test proxy
description: 'The API endpoints described in this section let you test your proxy connection.
For details, see the Apify Proxy.'
paths:
/v2/browser-info:
get:
tags:
- Tools
summary: Get browser info
description: 'Returns information about the HTTP request, including the client IP address,
country code, request headers, and body length.
This endpoint is designed for proxy testing. It accepts any HTTP method so you
can verify that your proxy correctly forwards requests of any type and that
client IP addresses are anonymized.'
security: []
parameters:
- name: skipHeaders
in: query
description: If `true` or `1`, the response omits the `headers` field.
schema:
type: boolean
- name: rawHeaders
in: query
description: If `true` or `1`, the response includes the `rawHeaders` field with the raw request headers.
schema:
type: boolean
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserInfoResponse'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/TooManyRequests'
deprecated: false
operationId: tools_browser_info_get
post:
tags:
- Tools
summary: Get browser info
description: 'Returns information about the HTTP request, including the client IP address,
country code, request headers, and body length.
This endpoint is designed for proxy testing. It accepts any HTTP method so you
can verify that your proxy correctly forwards requests of any type and that
client IP addresses are anonymized.'
security: []
parameters:
- name: skipHeaders
in: query
description: If `true` or `1`, the response omits the `headers` field.
schema:
type: boolean
- name: rawHeaders
in: query
description: If `true` or `1`, the response includes the `rawHeaders` field with the raw request headers.
schema:
type: boolean
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserInfoResponse'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/TooManyRequests'
deprecated: false
operationId: tools_browser_info_post
put:
tags:
- Tools
summary: Get browser info
description: 'Returns information about the HTTP request, including the client IP address,
country code, request headers, and body length.
This endpoint is designed for proxy testing. It accepts any HTTP method so you
can verify that your proxy correctly forwards requests of any type and that
client IP addresses are anonymized.'
security: []
parameters:
- name: skipHeaders
in: query
description: If `true` or `1`, the response omits the `headers` field.
schema:
type: boolean
- name: rawHeaders
in: query
description: If `true` or `1`, the response includes the `rawHeaders` field with the raw request headers.
schema:
type: boolean
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserInfoResponse'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/TooManyRequests'
deprecated: false
operationId: tools_browser_info_put
delete:
tags:
- Tools
summary: Get browser info
description: 'Returns information about the HTTP request, including the client IP address,
country code, request headers, and body length.
This endpoint is designed for proxy testing. It accepts any HTTP method so you
can verify that your proxy correctly forwards requests of any type and that
client IP addresses are anonymized.'
security: []
parameters:
- name: skipHeaders
in: query
description: If `true` or `1`, the response omits the `headers` field.
schema:
type: boolean
- name: rawHeaders
in: query
description: If `true` or `1`, the response includes the `rawHeaders` field with the raw request headers.
schema:
type: boolean
responses:
'200':
description: ''
content:
application/json:
schema:
$ref: '#/components/schemas/BrowserInfoResponse'
'405':
$ref: '#/components/responses/MethodNotAllowed'
'429':
$ref: '#/components/responses/TooManyRequests'
deprecated: false
operationId: tools_browser_info_delete
components:
schemas:
BrowserInfoResponse:
type: object
required:
- method
- clientIp
- countryCode
- bodyLength
properties:
method:
type: string
description: HTTP method of the request.
example: GET
clientIp:
type:
- string
- 'null'
description: IP address of the client.
example: 1.2.3.4
countryCode:
type:
- string
- 'null'
description: Two-letter country code resolved from the client IP address.
example: US
bodyLength:
type: integer
description: Length of the request body in bytes.
example: 0
headers:
type: object
description: 'Request headers. Omitted when `skipHeaders=true`.
'
additionalProperties:
oneOf:
- type: string
- type: array
items:
type: string
rawHeaders:
type: array
description: 'Raw request headers as a flat list of alternating name/value strings.
Included only when `rawHeaders=true`.
'
items:
type: string
ErrorDetail:
title: ErrorDetail
type: object
properties:
type:
$ref: '#/components/schemas/ErrorType'
message:
type: string
description: Human-readable error message describing what went wrong.
ErrorType:
title: ErrorType
type: string
description: Machine-processable error type identifier.
enum:
- 3d-secure-auth-failed
- access-right-already-exists
- action-not-found
- actor-already-rented
- actor-can-not-be-rented
- actor-disabled
- actor-is-not-rented
- actor-memory-limit-exceeded
- actor-name-exists-new-owner
- actor-name-not-unique
- actor-not-found
- actor-not-github-actor
- actor-not-public
- actor-permission-level-not-supported-for-agentic-payments
- actor-review-already-exists
- actor-run-failed
- actor-standby-not-supported-for-agentic-payments
- actor-task-name-not-unique
- agentic-payment-info-retrieval-error
- agentic-payment-information-missing
- agentic-payment-insufficient-amount
- agentic-payment-provider-internal-error
- agentic-payment-provider-unauthorized
- airtable-webhook-deprecated
- already-subscribed-to-paid-actor
- apify-plan-required-to-use-paid-actor
- apify-signup-not-allowed
- auth-method-not-supported
- authorization-server-not-found
- auto-issue-date-invalid
- background-check-required
- billing-system-error
- black-friday-plan-expired
- braintree-error
- braintree-not-linked
- braintree-operation-timed-out
- braintree-unsupported-currency
- build-not-found
- build-outdated
- cannot-add-apify-events-to-ppe-actor
- cannot-add-multiple-pricing-infos
- cannot-add-pricing-info-that-alters-past
- cannot-add-second-future-pricing-info
- cannot-build-actor-from-webhook
- cannot-change-billing-interval
- cannot-change-owner
- cannot-charge-apify-event
- cannot-charge-non-pay-per-event-actor
- cannot-comment-as-other-user
- cannot-copy-actor-task
- cannot-create-payout
- cannot-create-public-actor
- cannot-create-tax-transaction
- cannot-delete-critical-actor
- cannot-delete-invoice
- cannot-delete-paid-actor
- cannot-disable-one-time-event-for-apify-start-event
- cannot-disable-organization-with-enabled-members
- cannot-disable-user-with-subscription
- cannot-link-oauth-to-unverified-email
- cannot-metamorph-to-pay-per-result-actor
- cannot-modify-actor-pricing-too-frequently
- cannot-modify-actor-pricing-with-immediate-effect
- cannot-monetize-without-payout-billing-info
- cannot-override-paid-actor-trial
- cannot-permanently-delete-subscription
- cannot-publish-actor
- cannot-publish-actor-task
- cannot-reduce-last-full-token
- cannot-reimburse-more-than-original-charge
- cannot-reimburse-non-rental-charge
- cannot-remove-own-actor-from-recently-used
- cannot-remove-payment-method
- cannot-remove-pricing-info
- cannot-remove-running-run
- cannot-remove-user-with-public-actors
- cannot-remove-user-with-subscription
- cannot-remove-user-with-unpaid-invoice
- cannot-rename-env-var
- cannot-rent-paid-actor
- cannot-review-own-actor
- cannot-set-access-rights-for-owner
- cannot-set-is-status-message-terminal
- cannot-unpublish-critical-actor
- cannot-unpublish-paid-actor
- cannot-unpublish-profile
- cannot-update-invoice-field
- concurrent-runs-limit-exceeded
- concurrent-update-detected
- conference-token-not-found
- content-encoding-forbidden-for-html
- coupon-already-redeemed
- coupon-expired
- coupon-for-new-customers
- coupon-for-subscribed-users
- coupon-limits-are-in-conflict-with-current-limits
- coupon-max-number-of-redemptions-reached
- coupon-not-found
- coupon-not-unique
- coupons-disabled
- create-github-issue-not-allowed
- creator-plan-not-available
- cron-expression-invalid
- daily-ai-token-limit-exceeded
- daily-publication-limit-exceeded
- dataset-does-not-have-fields-schema
- dataset-does-not-have-schema
- dataset-locked
- dataset-schema-invalid
- dcr-not-supported
- default-dataset-not-found
- deleting-default-build
- deleting-unfinished-build
- email-already-taken
- email-already-taken-removed-user
- email-domain-not-allowed-for-coupon
- email-invalid
- email-not-allowed
- email-not-valid
- email-update-too-soon
- elevated-permissions-needed
- env-var-already-exists
- exchange-rate-fetch-failed
- expired-conference-token
- failed-to-charge-user
- final-invoice-negative
- full-permission-actor-blocked-for-admin
- full-permission-actor-not-approved
- github-branch-empty
- github-issue-already-exists
- github-public-key-not-found
- github-repository-not-found
- github-signature-does-not-match-payload
- github-user-not-authorized-for-issues
- gmail-not-allowed
- id-does-not-match
- incompatible-billing-interval
- incomplete-payout-billing-info
- inconsistent-currencies
- incorrect-pricing-modifier-prefix
- input-json-invalid-characters
- input-json-not-object
- input-json-too-long
- input-update-collision
- insufficient-permissions
- insufficient-permissions-to-change-field
- insufficient-security-measures
- insufficient-tax-country-evidence
- integration-auth-error
- internal-server-error
- invalid-billing-info
- invalid-billing-period-for-payout
- invalid-build
- invalid-client-key
- invalid-collection
- invalid-conference-login-password
- invalid-content-type-header
- invalid-credentials
- invalid-git-auth-token
- invalid-github-issue-url
- invalid-header
- invalid-id
- invalid-idempotency-key
- invalid-input
- invalid-input-schema
- invalid-invoice
- invalid-invoice-type
- invalid-issue-date
- invalid-label-params
- invalid-main-account-user-id
- invalid-oauth-app
- invalid-oauth-scope
- invalid-one-time-invoice
- invalid-parameter
- invalid-payout-status
- invalid-picture-url
- invalid-record-key
- invalid-request
- invalid-resource-type
- invalid-signature
- invalid-subscription-plan
- invalid-tax-number
- invalid-tax-number-format
- invalid-token
- invalid-token-type
- invalid-two-factor-code
- invalid-two-factor-code-or-recovery-code
- invalid-two-factor-recovery-code
- invalid-username
- invalid-value
- invitation-invalid-resource-type
- invitation-no-longer-valid
- invoice-canceled
- invoice-cannot-be-refunded-due-to-too-high-amount
- invoice-incomplete
- invoice-is-draft
- invoice-locked
- invoice-must-be-buffer
- invoice-not-canceled
- invoice-not-draft
- invoice-not-found
- invoice-outdated
- invoice-paid-already
- issue-already-connected-to-github
- issue-not-found
- issues-bad-request
- issuer-not-registered
- job-finished
- label-already-linked
- last-api-token
- limit-reached
- max-items-must-be-greater-than-zero
- max-metamorphs-exceeded
- max-total-charge-usd-below-minimum
- max-total-charge-usd-must-be-greater-than-zero
- method-not-allowed
- migration-disabled
- missing-actor-rights
- missing-api-token
- missing-billing-info
- missing-line-items
- missing-payment-date
- missing-payout-billing-info
- missing-proxy-password
- missing-reporting-fields
- missing-resource-name
- missing-settings
- missing-username
- monthly-usage-limit-too-low
- more-than-one-update-not-allowed
- multiple-records-found
- must-be-admin
- name-not-unique
- next-runtime-computation-failed
- no-columns-in-exported-dataset
- no-payment-attempt-for-refund-found
- no-payment-method-available
- no-team-account-seats-available
- non-temporary-email
- not-enough-usage-to-run-paid-actor
- not-implemented
- not-supported-currencies
- o-auth-service-already-connected
- o-auth-service-not-connected
- oauth-resource-access-failed
- one-time-invoice-already-marked-paid
- only-drafts-can-be-deleted
- operation-canceled
- operation-not-allowed
- operation-timed-out
- organization-cannot-own-itself
- organization-role-not-found
- overlapping-payout-billing-periods
- own-token-required
- page-not-found
- param-not-one-of
- parameter-required
- parameters-mismatched
- password-reset-email-already-sent
- password-reset-token-expired
- pay-as-you-go-without-monthly-interval
- payment-attempt-status-message-required
- payout-already-paid
- payout-canceled
- payout-invalid-state
- payout-must-be-approved-to-be-marked-paid
- payout-not-found
- payout-number-already-exists
- phone-number-invalid
- phone-number-landline
- phone-number-opted-out
- phone-verification-disabled
- platform-feature-disabled
- price-overrides-validation-failed
- pricing-model-not-supported
- promotional-plan-not-available
- proxy-auth-ip-not-unique
- public-actor-disabled
- query-timeout
- quoted-price-outdated
- rate-limit-exceeded
- recaptcha-invalid
- recaptcha-required
- record-not-found
- record-not-public
- record-or-token-not-found
- record-too-large
- redirect-uri-mismatch
- reduced-plan-not-available
- rental-charge-already-reimbursed
- rental-not-allowed
- request-aborted-prematurely
- request-handled-or-locked
- request-id-invalid
- request-queue-duplicate-requests
- request-too-large
- requested-dataset-view-does-not-exist
- resume-token-expired
- run-failed
- run-input-body-not-valid-json
- run-timeout-exceeded
- russia-is-evil
- same-user
- schedule-actor-not-found
- schedule-actor-task-not-found
- schedule-name-not-unique
- schema-validation
- schema-validation-error
- schema-validation-failed
- service-worker-registration-not-allowed
- sign-up-method-not-allowed
- slack-integration-not-custom
- socket-closed
- socket-destroyed
- store-schema-invalid
- store-terms-not-accepted
- stripe-enabled
- stripe-generic-decline
- stripe-not-enabled
- stripe-not-enabled-for-user
- tagged-build-required
- tax-country-invalid
- tax-number-invalid
- tax-number-validation-failed
- taxamo-call-failed
- taxamo-request-failed
- testing-error
- token-not-provided
- too-few-versions
- too-many-actor-tasks
- too-many-actors
- too-many-labels-on-resource
- too-many-mcp-connectors
- too-many-o-auth-apps
- too-many-organizations
- too-many-requests
- too-many-schedules
- too-many-ui-access-keys
- too-many-user-labels
- too-many-values
- too-many-versions
- too-many-webhooks
- unexpected-route
- unknown-build-tag
- unknown-payment-provider
- unsubscribe-token-invalid
- unsupported-actor-pricing-model-for-agentic-payments
- unsupported-content-encoding
- unsupported-file-type-for-issue
- unsupported-file-type-image-expected
- unsupported-file-type-text-or-json-expected
- unsupported-permission
- upcoming-subscription-bill-not-up-to-date
- user-already-exists
- user-already-verified
- user-creates-organizations-too-fast
- user-disabled
- user-email-is-disposable
- user-email-not-set
- user-email-not-verified
- user-has-no-subscription
- user-integration-not-found
- user-is-already-invited
- user-is-already-organization-member
- user-is-not-member-of-organization
- user-is-not-organization
- user-is-organization
- user-is-organization-owner
- user-is-removed
- user-not-found
- user-not-logged-in
- user-not-verified
- user-or-token-not-found
- user-plan-not-allowed-for-coupon
- user-problem-with-card
- user-record-not-found
- username-already-taken
- username-missing
- username-not-allowed
- username-removal-forbidden
- username-required
- verification-email-already-sent
- verification-token-expired
- version-already-exists
- versions-size-exceeded
- weak-password
- x402-agentic-payment-already-finalized
- x402-agentic-payment-insufficient-amount
- x402-agentic-payment-malformed-token
- x402-agentic-payment-settlement-failed
- x402-agentic-payment-settlement-in-progress
- x402-agentic-payment-settlement-stuck
- x402-agentic-payment-unauthorized
- x402-payment-required
- zero-invoice
ErrorResponse:
title: ErrorResponse
required:
- error
type: object
properties:
error:
$ref: '#/components/schemas/ErrorDetail'
responses:
MethodNotAllowed:
description: Method not allowed.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error:
type: method-not-allowed
message: 'This API end-point can only be accessed using the following HTTP methods: OPTIONS,GET'
TooManyRequests:
description: Too many requests - rate limit exceeded.
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error:
type: rate-limit-exceeded
message: You have exceeded the rate limit. Please try again later.
securitySchemes:
httpBearer:
type: http
scheme: bearer
description: 'Bearer token provided in the `Authorization` header (e.g., `Authorization: Bearer your_token`—recommended). [More info](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Authorization).
Use your API token to authenticate requests. You can find it on the [Integrations page](https://console.apify.com/account#/integrations) in Apify Console. This method is more secure than query parameters, as headers are not logged in browser history or server logs.
:::danger Security
Do not share your API token (or account password) with untrusted parties.
:::
_When is authentication required?_
- _Required_ for private Actors, tasks, or resources (e.g., builds of private Actors).
- _Required_ when using named formats for IDs (e.g., `username~store-name` for stores or `username~queue-name` for queues).
- _Optional_ for public Actors or resources (e.g., builds of public Actors can be queried without a token).
For more information, see our [integrations documentation](https://docs.apify.com/platform/integrations).'
apiKey:
type: apiKey
name: token
in: query
description: 'API token provided as a query parameter (e.g., `?token=your_token`—less secure).
Use your API token to authenticate requests. You can find it on the [Integrations page](https://console.apify.com/account#/integrations) in Apify Console.
:::danger Security
Do not share your API token (or account password) with untrusted parties.
:::
_When is authentication required?_
- _Required_ for private Actors, tasks, or resources (e.g., builds of private Actors).
- _Required_ when using named formats for IDs (e.g., `username~store-name` for stores or `username~queue-name` for queues).
- _Optional_ for public Actors or resources (e.g., builds of public Actors can be queried without a token).
For more information, see our [integrations documentation](https://docs.apify.com/platform/integrations).'
x-tagGroups:
- name: Actor management
tags:
- Actors
- Actors/Actor versions
- Actors/Actor builds
- Actors/Actor runs
- Actors/Webhook collection
- Actors/Last run object and its storages
- name: Actor builds
tags:
- Actor builds
- name: Actor runs
tags:
- Actor runs
- name: Actor tasks
tags:
- Actor tasks
- name: Storage
tags:
- Storage/Datasets
- Storage/Key-value stores
- Storage/Request queues
- Storage/Request queues/Requests
- Storage/Request queues/Requests locks
- name: Webhook management
tags:
- Webhooks/Webhooks
- Webhooks/Webhook dispatches
- name: Schedules
tags:
- Schedules
- name: Apify Store
tags:
- Store
- name: Logs
tags:
- Logs
- name: Users
tags:
- Users
- Users/Usage
- name: Utility tools
tags:
- Tools
- Tools/Encoding
- name: Convenience endpoints
tags:
- Default dataset
- Default key-value store
- Default request queue
- Last Actor run's default dataset
- Last Actor run's default key-value store
- Last Actor run's default request queue
- Last Actor run's log
- Last Actor run's abort
- Last Actor run's metamorph
- Last Actor run's reboot
- Last Actor task run's default dataset
- Last Actor task run's default key-value store
- Last Actor task run's default request queue
- Last Actor task run's log
- Last Actor task run's abort
- Last Actor task run's metamorph
- Last Actor task run's reboot