Rustine docs
API › Projects

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.

POSThttps://api.rustine.io/v1/projects

OAuth permission: scans:run · an API key has them all

Open in ClaudeOpen in ChatGPT

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-Keystringoptional

    A 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

  • namestringrequired

    Project name.

  • urlstringoptional

    The project's first site (optional). Only add a site you own or are allowed to test.

Response

  • idstring

    Project id.

  • objectstring
  • namestring

    Project name.

  • scorenumber | null

    Score out of 100; null before the first finished scan.

  • gradestring | null

    Grade from A to F; null before the first finished scan.

    ABCDF
  • open_issuesinteger

    Open issues across the project's targets, hidden ones included.

  • pausedboolean

    Paused because the plan covers fewer projects: readable, but no scan, recheck, fix or new address.

  • last_scan_atstring | null

    End of the last finished scan of any target.

  • targetsarray of object
    • idstring

      Target id: a site (domain) or a GitHub repository of the project.

    • objectstring
    • project_idstring

      Project the target belongs to.

    • kindstring

      domain (a site) or repository.

      domainserverrepository
    • addressstring

      Hostname of a site (app.example.com) or owner/repo of a repository.

    • verifiedboolean

      Whether the workspace proved it controls this target. Without proof, issue details stay hidden and only quick scans run.

    • scorenumber | null

      Score out of 100; null before the first finished scan.

    • gradestring | null

      Grade from A to F; null before the first finished scan.

      ABCDF
    • last_scan_atstring | null

      End of the last finished scan.

    • hidden_issuesobject | null

      Unverified site: what its hidden issues amount to, counts only (never which, nor where). Null when nothing is hidden.

      • urgentinteger

        Open critical and high issues hidden until the site is verified.

      • laterinteger

        Open medium and low issues hidden until the site is verified.

Errors

Statuserror.codeWhat happens
400body_invalidThe request body is not valid JSON. Check the Content-Type: application/json header.
400parameter_invalidA parameter is missing or invalid; param names it.
400url_invalidThe address is not the valid URL of a public site.
400url_privateRustine only scans public sites, never a local or private address.
400idempotency_key_invalidThe Idempotency-Key header must be 1 to 255 printable characters.
401authentication_requiredNo key in the request. Pass it in the Authorization: Bearer rst_… header, never in the address.
401invalid_api_keyThe key or OAuth token is wrong, revoked or expired. Check it is copied in full, or create a new key.
402api_plan_requiredThe workspace is on the Free plan. The API comes with Pro, or on a 14-day trial with Solo.
402api_trial_endedSolo's 14-day trial is over. Move to Pro: your keys work again at once.
402project_limit_reachedAll your plan's projects are in use. Add an extra project or change plans.
402domain_takenOn the Free plan, a domain another free account already follows cannot be added or scanned.
403scope_missingThe OAuth token lacks the permission this route needs (shown on its page). Reconnect the agent to grant it. An API key has every permission.
409site_excludedThe owner of this site asked not to be scanned. Rustine will not scan it.
409idempotency_conflictThis Idempotency-Key was already used for another request (method, path or body). A new action takes a new key.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry in a moment.
429rate_limitedToo many requests for this key (120 per minute). Wait Retry-After seconds.
500internal_errorAn error on our side, reported automatically. Retry later; give the Request-Id to support if it comes back.
503service_unavailableRustine is unavailable for a moment. Retry with the same Idempotency-Key.

↵ Enter to open, Esc to close