Skip to main content
Project API keys are scoped to one project, so GET /projects returns only that project and POST /projects remains forbidden for them. A personal access token returns every project the user belongs to and can create a new one when its tier is at least write.

Create project

The response status is 201. Self-hosters may cap the number of projects owned by one user with BISIBILITY_MAX_PROJECTS_PER_USER.

List projects

Response:

Get project

project_id must be the public prj_... id and must match the authenticated API key’s project. Response:
If the project does not match a project key, the API returns 403. A PAT gets 404 when the user is not a member, so project existence is not disclosed.

Get project overview

Returns numeric project health aggregates without requiring clients to paginate the keyword list. range defaults to 28d and accepts 7d, 28d, or 90d. device defaults to all and also accepts desktop or mobile. tag is an optional exact tag name.
Positive average_position_delta means the average rank improved. Visibility measures volume-weighted ranking strength in Google’s Top 20. A value of 100 means every measured keyword ranks #1. Rankings below #20 do not add Visibility, and shallow or failed checks are not treated as lost rankings. visibility_delta is measured in percentage points. Rank aggregates and distribution counts are null before the project has check data; a completed check with no keyword in a bucket returns the real count 0.

Update project

Request body may include name, domain, or both.

Get project defaults

Returns the effective market and schedule. Projects without a stored defaults row return the schema-defined schedule defaults and a market inferred from existing keywords, without creating a row. The source field is explicit, derived, or fallback and identifies how the effective market was selected.

Update project defaults

Project defaults store scheduling intent. country and device in this endpoint represent the project’s current default keyword market, derived from existing keywords. location_key is the primary location reference and can point at a country, region, or city; send it with device to move eligible keywords from the current default market to the new market. The legacy country and city selectors still resolve to the same location, but they are deprecated: send location_key instead. They are accepted until Bisibility 0.24.0, then removed. Omitting market fields updates only the schedule and does not move keywords. country and device must be supplied together unless location_key is provided. jitter_minutes must be a whole number from 0 to 120. Omitting it uses 60; 0 disables jitter. Daily and weekly defaults give each keyword a stable interval phase, and timezone does not move that phase. Monthly and custom cron schedules use timezone as their wall-clock anchor.
Schedule-only update:
Response:

Delete project

Deletes the scoped project and returns the deleted project resource. Only an owner’s PAT can delete a project; project API keys receive 403.