{"name":"Turrety API","routes":[{"method":"POST","path":"/v1/captcha/challenge","summary":"A proof-of-work challenge for the human check"},{"method":"POST","path":"/v1/captcha/redeem","summary":"Trade solved challenges for a single-use pass"},{"method":"POST","path":"/v1/auth/signup","summary":"Create an account and sign in"},{"method":"POST","path":"/v1/auth/login","summary":"Sign in with username or e-mail and password"},{"method":"POST","path":"/v1/auth/logout","summary":"End the current session"},{"method":"POST","path":"/v1/auth/forgot-password","summary":"E-mail a password reset link"},{"method":"POST","path":"/v1/auth/reset-password","summary":"Set a new password from a reset link"},{"method":"GET","path":"/v1/me","summary":"The signed-in user"},{"method":"PATCH","path":"/v1/me","summary":"Update the profile"},{"method":"POST","path":"/v1/me/password","summary":"Change the password and sign out other sessions"},{"method":"POST","path":"/v1/me/email","summary":"Change the e-mail, confirming with the password"},{"method":"DELETE","path":"/v1/me/sessions/:session","summary":"End one session"},{"method":"GET","path":"/v1/me/sessions","summary":"List active sessions"},{"method":"DELETE","path":"/v1/me/sessions","summary":"Sign out every other session"},{"method":"GET","path":"/v1/me/orgs","summary":"Organizations the signed-in user belongs to"},{"method":"POST","path":"/v1/orgs","summary":"Create an organization"},{"method":"GET","path":"/v1/orgs/:org","summary":"Read an organization"},{"method":"PATCH","path":"/v1/orgs/:org","summary":"Rename an organization or change its URL"},{"method":"DELETE","path":"/v1/orgs/:org","summary":"Delete an organization with its apps, keys, team and subscription"},{"method":"GET","path":"/v1/orgs/:org/members","summary":"List members and pending invitations"},{"method":"PATCH","path":"/v1/orgs/:org/members/:user","summary":"Change a member's role"},{"method":"DELETE","path":"/v1/orgs/:org/members/:user","summary":"Remove a member, or leave the organization"},{"method":"POST","path":"/v1/orgs/:org/owner","summary":"Hand the organization to another member; the owner stays on as an admin"},{"method":"POST","path":"/v1/orgs/:org/invites","summary":"Invite someone by e-mail"},{"method":"DELETE","path":"/v1/orgs/:org/invites/:email","summary":"Revoke an invitation"},{"method":"GET","path":"/v1/me/invites","summary":"Invitations waiting for the signed-in user"},{"method":"POST","path":"/v1/me/invites/:org/accept","summary":"Accept an invitation"},{"method":"DELETE","path":"/v1/me/invites/:org","summary":"Decline an invitation"},{"method":"GET","path":"/v1/orgs/:org/apps","summary":"List the apps of an organization"},{"method":"POST","path":"/v1/orgs/:org/apps","summary":"Connect an app"},{"method":"GET","path":"/v1/orgs/:org/apps/:app","summary":"Read an app"},{"method":"PATCH","path":"/v1/orgs/:org/apps/:app","summary":"Rename an app or change its framework or environment"},{"method":"DELETE","path":"/v1/orgs/:org/apps/:app","summary":"Remove an app and revoke its keys"},{"method":"GET","path":"/v1/orgs/:org/keys","summary":"List API keys, without their secrets"},{"method":"POST","path":"/v1/orgs/:org/keys","summary":"Create an API key; the secret is returned only here"},{"method":"POST","path":"/v1/orgs/:org/keys/:key/rotate","summary":"Replace a key; the old one keeps working for 24 hours"},{"method":"DELETE","path":"/v1/orgs/:org/keys/:key","summary":"Revoke an API key"},{"method":"GET","path":"/v1/me/preferences","summary":"Language, time zone and which e-mails to receive"},{"method":"PATCH","path":"/v1/me/preferences","summary":"Change some preferences"},{"method":"DELETE","path":"/v1/me","summary":"Delete the account, confirming with the password"},{"method":"GET","path":"/v1/plans","summary":"Plans, their limits and prices, and the ways to pay"},{"method":"GET","path":"/v1/orgs/:org/billing","summary":"Plan, limits, usage and subscription of an organization"},{"method":"POST","path":"/v1/orgs/:org/billing/checkout","summary":"Buy a paid plan, or upgrade the current one"},{"method":"GET","path":"/v1/orgs/:org/billing/quote","summary":"What an upgrade charges now, for the rest of the period"},{"method":"POST","path":"/v1/orgs/:org/billing/refund","summary":"In the first 7 days: give back everything paid and end the plan now"},{"method":"POST","path":"/v1/orgs/:org/billing/upgrade/undo","summary":"In the first 7 days after an upgrade: give it back and return to the plan before"},{"method":"DELETE","path":"/v1/orgs/:org/billing/subscription","summary":"Stop the renewal; the plan lasts until the paid period ends, then Hobby"},{"method":"POST","path":"/v1/orgs/:org/billing/subscription/resume","summary":"Take back a cancellation before the paid period ends"},{"method":"POST","path":"/v1/orgs/:org/billing/portal","summary":"Open the payment provider's page for cards and receipts"},{"method":"GET","path":"/v1/orgs/:org/billing/invoices","summary":"Paid invoices, newest first"},{"method":"POST","path":"/v1/billing/webhooks/:provider","summary":"Where a payment provider reports what happened"},{"method":"POST","path":"/v1/billing/withdrawals/:provider","summary":"Where a payment provider asks whether money may leave the account"},{"method":"GET","path":"/v1/orgs/:org/alerts","summary":"Which alerts are sent and the destinations they can go to"},{"method":"PATCH","path":"/v1/orgs/:org/alerts","summary":"Turn alerts on or off and choose where each one goes"},{"method":"POST","path":"/v1/orgs/:org/alerts/destinations","summary":"Add a Slack channel or a webhook"},{"method":"DELETE","path":"/v1/orgs/:org/alerts/destinations/:destination","summary":"Remove a destination; alerts stop going there"},{"method":"POST","path":"/v1/orgs/:org/alerts/destinations/:destination/test","summary":"Send a test message to one destination"},{"method":"GET","path":"/v1/orgs/:org/alerts/history","summary":"Alerts sent lately, newest first, with how each delivery went"},{"method":"GET","path":"/v1/orgs/:org/apps/:app/ruleset","summary":"The app's published rule set and its draft"},{"method":"PUT","path":"/v1/orgs/:org/apps/:app/ruleset/draft","summary":"Save the draft of the next version"},{"method":"DELETE","path":"/v1/orgs/:org/apps/:app/ruleset/draft","summary":"Discard the draft"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/ruleset/publish","summary":"Publish the draft as a new version; agents pick it up within seconds"},{"method":"GET","path":"/v1/orgs/:org/apps/:app/ruleset/versions","summary":"Published versions, newest first"},{"method":"GET","path":"/v1/orgs/:org/apps/:app/ruleset/versions/:version","summary":"The configuration of one version"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/ruleset/versions/:version/restore","summary":"Publish an old version again, as a new version"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/blocks","summary":"Block a client address now, for some hours or for good"},{"method":"DELETE","path":"/v1/orgs/:org/apps/:app/blocks/:ip","summary":"Let a blocked client address back in now"},{"method":"GET","path":"/v1/orgs/:org/events","summary":"Recent events reported by agents, newest first (app, decision, cursor, limit)"},{"method":"GET","path":"/v1/orgs/:org/overview","summary":"Totals (and the period before), hourly series, top rules and latency for the last hours"},{"method":"POST","path":"/agent/v1/hello","summary":"Agent: start a session; returns the current version, settings and a socket ticket"},{"method":"GET","path":"/agent/v1/ruleset","summary":"Agent: the current version of the key's app"},{"method":"GET","path":"/agent/v1/rulesets/:app/:version","summary":"Agent: one version, signed; immutable"},{"method":"POST","path":"/agent/v1/reports","summary":"Agent: counters and sampled events; idempotent by batchId"},{"method":"POST","path":"/agent/v1/inventory","summary":"Agent: one part of the packages the app's lockfile installs; idempotent"},{"method":"POST","path":"/agent/v1/socket/ticket","summary":"Agent: a single-use ticket to open the control channel"},{"method":"POST","path":"/agent/v1/goodbye","summary":"Agent: the process is stopping"},{"method":"GET","path":"/agent/v1/keys","summary":"The public keys rule sets are signed with"},{"method":"GET","path":"/v1/orgs/:org/agents","summary":"Agents of every app of the organization, by app"},{"method":"GET","path":"/v1/orgs/:org/apps/:app/agents","summary":"Running agents of an app and whether each runs the published version"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/tail","summary":"Ask the app agents for every event for the next minute (Live traffic is open)"},{"method":"GET","path":"/v1/orgs/:org/dependencies","summary":"Inventories of every app and the advisories found in them"},{"method":"GET","path":"/v1/orgs/:org/apps/:app/dependencies/packages","summary":"Every package of the app's last inventory"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/dependencies/scan","summary":"Check the app's inventory against the advisory source again"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/dependencies/:advisory/snooze","summary":"Stop listing an advisory as to do in this app for some days"},{"method":"DELETE","path":"/v1/orgs/:org/apps/:app/dependencies/:advisory/snooze","summary":"List a snoozed advisory again"},{"method":"GET","path":"/v1/orgs/:org/patches","summary":"Vulnerabilities of every app with their virtual patches"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/patches/:advisory/draft","summary":"Ask the rule author for a virtual patch (again)"},{"method":"PUT","path":"/v1/orgs/:org/apps/:app/patches/:advisory/status","summary":"Turn a virtual patch on, test it in shadow mode, or turn it off; publishes"},{"method":"POST","path":"/scan/v1/lockfiles","summary":"CI: check packages of a lockfile for known vulnerabilities; nothing is kept"},{"method":"GET","path":"/v1/orgs/:org/proposals","summary":"Suggested rule changes of every app, pending first"},{"method":"POST","path":"/v1/orgs/:org/proposals/generate","summary":"Ask the rule author for suggestions from every app's last 24 hours"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/proposals/generate","summary":"Ask the rule author for suggestions from the app's last 24 hours"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/proposals/:proposal/accept","summary":"Publish a suggestion on top of the version in force"},{"method":"POST","path":"/v1/orgs/:org/apps/:app/proposals/:proposal/dismiss","summary":"Dismiss a suggestion; it is not made again for 30 days"}]}