Botify · OpenAPI Overlay 1.0.0
API Evangelist enrichment overlay for the Botify API
12 actions
12 updates
documentation
extends
../openapi/botify-api-swagger.json
Generated by API Evangelist
Written by API Evangelist tooling for Botify's API. It is a proposal applied on top of the contract, not a document Botify publishes.
What the actions change
x-docsx-idempotentx-idempotency-keycontactexternalDocsx-apis-jsonx-source-specx-legacy-portal
Targets 6
$.info
$.securityDefinitions.DjangoRestToken
$.paths['/projects/{username}/{project_slug}/query'].post
$.paths['/jobs'].post
$.paths['/analyses/{username}/{project_slug}/{analysis_slug}/urls/export'].post
$.paths['/analyses/{username}/{project_slug}/{analysis_slug}/features/ganalytics/orphan_urls/{medium}/{source}'].get
OpenAPI Overlay
overlay: 1.0.0
info:
title: API Evangelist enrichment overlay for the Botify API
version: 1.0.0
x-generated: '2026-08-08'
x-method: generated
x-source: openapi/botify-api-swagger.json
x-note: >-
Applies API Evangelist enrichments to Botify's published Swagger 2.0 document WITHOUT mutating it.
Everything asserted here is grounded in a document Botify publishes — the developer portal, the legacy
portal's error-code and rate-limit pages, the limits page, or the OAuth metadata on app.botify.com /
mcp.botify.com. Nothing is invented.
extends: ../openapi/botify-api-swagger.json
actions:
- target: $.info
description: Point the contract at the human documentation Botify publishes, and record the machine-readable source.
update:
contact:
name: Botify Support
url: https://support.botify.com/
externalDocs:
description: Botify developer portal
url: https://developers.botify.com/docs/introduction
x-apis-json: https://raw.githubusercontent.com/api-evangelist/botify/refs/heads/main/apis.yml
x-source-spec: https://api.botify.com/v1/swagger.json
x-legacy-portal: https://old.developers.botify.com/
- target: $.info
description: >-
Record the auth model in the contract. The published securityDefinitions name the scheme "DjangoRestToken"
but never say what value the Authorization header must carry; the docs do.
update:
x-authentication:
style: api-key-header
header: Authorization
format: Token <YOUR_TOKEN>
token_source: https://app.botify.com/<username>/account
scopes: none
docs: https://developers.botify.com/docs/getting-started
- target: $.info
description: Attach the rate limits and quotas Botify documents in prose but does not express in the contract.
update:
x-rate-limits:
qps: 5
qps_scope: project-related endpoints, including the BQL query endpoint
qps_docs: https://developers.botify.com/docs/limits
csv_exports_per_day: 50
csv_export_max_urls: 100000
export_docs: https://old.developers.botify.com/api/rate-limit/
shared_with_web_app: true
on_exceeded:
http_status: 429
error_code: '1053'
headers_published: false
- target: $.info
description: >-
Attach the error contract. The spec declares one untyped `default` response per operation; the real
error-code reference lives only on the legacy portal.
update:
x-error-catalog:
url: errors/botify-problem-types.yml
reference: https://old.developers.botify.com/api/error-codes/
rfc9457: false
envelope: '{"error": {"error_code": string, "message": string, "error_detail": object}}'
codes: 60
- target: $.info
description: Record the sibling agent surface, which is not part of this contract but shares the same account.
update:
x-mcp-server:
url: https://mcp.botify.com/
name: Botify Agents MCP
auth: OAuth 2.1 authorization_code + PKCE S256
scope: mcp_read_write
authorization_server: https://app.botify.com/
tools_public: false
- target: $.info
description: Record that this API has no event/webhook surface, so consumers know to poll or export rather than subscribe.
update:
x-event-surface:
webhooks: false
asyncapi: false
delivery:
- pull via BQL query
- batch via export jobs to direct download, AWS S3, AWS Redshift, Google Cloud Storage, Google BigQuery
- target: $.info
description: Record the query language, since the REST paths are mostly metadata around it.
update:
x-query-language:
name: BQL (Botify Query Language)
type: JSON DSL
docs: https://developers.botify.com/docs/bql-introduction
interactive:
operationId: projectQuery
max_rows: 2000
export:
operationId: createJob
- target: $.securityDefinitions.DjangoRestToken
description: Describe the API-token scheme, which the published spec leaves entirely undocumented.
update:
description: >-
Per-user Botify API token. Send it as `Authorization: Token <YOUR_TOKEN>` on every request. Issued and
regenerated from the Botify application account page; regenerating immediately invalidates the previous
token. Unscoped and long-lived — there is no read-only variant.
x-format: Token <YOUR_TOKEN>
x-docs: https://developers.botify.com/docs/getting-started
- target: $.paths['/projects/{username}/{project_slug}/query'].post
description: Mark the BQL query endpoint as the primary interactive data path and record its row ceiling.
update:
x-primary: true
x-max-rows: 2000
x-docs: https://developers.botify.com/docs/querying-seo-data
x-conventions: conventions/botify-conventions.yml
- target: $.paths['/jobs'].post
description: Mark job creation as the export path and record that it is not idempotent.
update:
x-idempotent: false
x-idempotency-key: null
x-consumes-quota: export credits (1 per row; 0.1 per links-graph row)
x-docs: https://developers.botify.com/docs/export-seo-data
- target: $.paths['/analyses/{username}/{project_slug}/{analysis_slug}/urls/export'].post
description: Record that a retried export creates a duplicate job and spends credits twice.
update:
x-idempotent: false
x-idempotency-key: null
x-conflict-error-code: '1052'
x-note: >-
Error 1052 "A CSV export is already running" is the only guard against duplicate exports; there is no
idempotency key, so a client-side retry after a timeout starts a second export.
- target: $.paths['/analyses/{username}/{project_slug}/{analysis_slug}/features/ganalytics/orphan_urls/{medium}/{source}'].get
description: >-
Flag the operation Botify itself labels "Legacy" in its published llms.txt API-reference index but never
marks deprecated in the contract.
update:
x-legacy: true
x-superseded-by: getVisitsOrphanURLs
x-source: https://developers.botify.com/llms.txt