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 can be the public prj_... id or the internal project id. It 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.

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. Supplying both country and device moves eligible keywords from the current default market to the new market. city narrows that market when it resolves inside the selected country. location_key is the canonical market selector and can point at a country, region, or city. Omitting market fields updates only the schedule and does not move keywords. country and device must be supplied together unless location_key is provided.
Schedule-only update:
Response:

Delete project

Deletes the scoped project and returns the deleted project resource. A PAT may delete it only when the user has the owner role.