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
201. Self-hosters may cap the number of projects owned
by one user with BISIBILITY_MAX_PROJECTS_PER_USER.
List projects
Get project
project_id must be the public prj_... id and must match the authenticated
API key’s project.
Response:
403. A PAT gets
404 when the user is not a member, so project existence is not disclosed.
Get project overview
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.
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
name, domain, or both.
Get project defaults
source field is explicit, derived,
or fallback and identifies how the effective market was selected.
Update project defaults
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.