Create a project
Creates a project, with the address of its first site if you give one. The site is not proved yet: you can run a quick scan on it right away, the full audit waits for the proof.
OAuth permission: scans:run · an API key has them all
Only add a site you own or are allowed to test. A project counts in your plan (1 included in Solo, 3 in Pro, then extra projects): past that, 402 project_limit_reached.
Headers
Idempotency-KeystringoptionalA unique key (1 to 255 printable characters, a UUID is fine) to retry this request safely: the first response is replayed for 24 hours; the same key with another request answers 409
idempotency_conflict.
Request body
namestringrequiredProject name.
urlstringoptionalThe project's first site (optional). Only add a site you own or are allowed to test.
Response
idstringProject id.
objectstringnamestringProject name.
scorenumber | nullScore out of 100; null before the first finished scan.
gradestring | nullGrade from A to F; null before the first finished scan.
ABCDFopen_issuesintegerOpen issues across the project's targets, hidden ones included.
pausedbooleanPaused because the plan covers fewer projects: readable, but no scan, recheck, fix or new address.
last_scan_atstring | nullEnd of the last finished scan of any target.
targetsarray of objectidstringTarget id: a site (domain) or a GitHub repository of the project.
objectstringproject_idstringProject the target belongs to.
kindstringdomain(a site) orrepository.domainserverrepositoryaddressstringHostname of a site (
app.example.com) orowner/repoof a repository.verifiedbooleanWhether the workspace proved it controls this target. Without proof, issue details stay hidden and only quick scans run.
scorenumber | nullScore out of 100; null before the first finished scan.
gradestring | nullGrade from A to F; null before the first finished scan.
ABCDFlast_scan_atstring | nullEnd of the last finished scan.
hidden_issuesobject | nullUnverified site: what its hidden issues amount to, counts only (never which, nor where). Null when nothing is hidden.
urgentintegerOpen critical and high issues hidden until the site is verified.
laterintegerOpen medium and low issues hidden until the site is verified.
Errors
| Status | error.code | What happens |
|---|---|---|
| 400 | body_invalid | The request body is not valid JSON. Check the Content-Type: application/json header. |
| 400 | parameter_invalid | A parameter is missing or invalid; param names it. |
| 400 | url_invalid | The address is not the valid URL of a public site. |
| 400 | url_private | Rustine only scans public sites, never a local or private address. |
| 400 | idempotency_key_invalid | The Idempotency-Key header must be 1 to 255 printable characters. |
| 401 | authentication_required | No key in the request. Pass it in the Authorization: Bearer rst_… header, never in the address. |
| 401 | invalid_api_key | The key or OAuth token is wrong, revoked or expired. Check it is copied in full, or create a new key. |
| 402 | api_plan_required | The workspace is on the Free plan. The API comes with Pro, or on a 14-day trial with Solo. |
| 402 | api_trial_ended | Solo's 14-day trial is over. Move to Pro: your keys work again at once. |
| 402 | project_limit_reached | All your plan's projects are in use. Add an extra project or change plans. |
| 402 | domain_taken | On the Free plan, a domain another free account already follows cannot be added or scanned. |
| 403 | scope_missing | The OAuth token lacks the permission this route needs (shown on its page). Reconnect the agent to grant it. An API key has every permission. |
| 409 | site_excluded | The owner of this site asked not to be scanned. Rustine will not scan it. |
| 409 | idempotency_conflict | This Idempotency-Key was already used for another request (method, path or body). A new action takes a new key. |
| 409 | idempotency_in_progress | A request with this Idempotency-Key is still running. Retry in a moment. |
| 429 | rate_limited | Too many requests for this key (120 per minute). Wait Retry-After seconds. |
| 500 | internal_error | An error on our side, reported automatically. Retry later; give the Request-Id to support if it comes back. |
| 503 | service_unavailable | Rustine is unavailable for a moment. Retry with the same Idempotency-Key. |