View

Draw your backend, read exactly what would be built, deploy it in one transaction. Then open the screen everybody else makes you build yourself: your users, columns you added, the licence each one bought, and what the database will actually hand them.

Scroll
01/04
0

To build. Your users, your own columns on them, their licence and their sessions — the internal tool every product ends up writing, already there.

0

Monthly active users on the free tier — with the database, the users table, storage and the canvas included.

0

@authsy/client for the backend — users, queries, documents, files. Separate SDKs for Node, Python and C# cover licensing, and a documented REST API covers everything.

0

From signing up to a deployed table your app can query over REST.

Every product ends up writing the same internal tool. A page that lists your users, so support can find the one who wrote in. A column for the thing your product actually tracks. A way to see what they paid for, and to unstick them. It is a week of work nobody scoped, it is never finished, and it is the least safe code you own. Authsy ships it — because the backend already knows who your users are, what they hold, and what the database will hand them.

A backend platform Web · mobile · desktop · games
Handled for you
  • Real SQL

    Tables you can index, join and explain — not a key-value store with a query language bolted on.

  • See it as they do

    Put on a user’s identity and ask the database what it will actually hand them. Measured, not inferred — and it cannot write.

  • Draw, read, deploy

    A plan shows every change before one is applied, and the deploy is one transaction — step seven of nine failing leaves nothing half-built.

  • Rules the database keeps

    One rule per table becomes a policy in PostgreSQL, so a forgotten WHERE cannot leak one of your users to another.

  • Your users, in one table

    Sign-up, sign-in and sessions per project — and a grid you actually run support from. Ban, verify, promote, correct an address, all in place.

  • Columns you add

    plan, credits, trial_ends — whatever your product tracks about a person. Typed, validated, and private unless you say otherwise.

  • Documents too

    Indexed JSON collections you can query the way you already would — $gt, $in, $regex, $group — in the same database and the same backup.

  • REST you already know

    A filter grammar of ?status=eq.paid, over every table you deploy.

  • Files beside the rows

    Buckets under the same tenancy rules, browsable from the dashboard.

  • Licences, on their row

    A licence is issued to an email and a user has one, so the join needs no setup. Suspend it, extend it or free every machine without leaving the person.

(Two halves of the same job)

Draw

Deploy

Between the two is a plan: exactly what would be created, altered or dropped, before any of it is. Reading it is free and changes nothing, which is the point — a migration you can look at first is a different thing from one you run and hope about.

Integrate

One endpoint per table.

Deploy a table and it is queryable immediately, addressed by the name you gave it on the canvas. Filters read as ?column=op.value, which takes about a minute to learn — no client to install, no schema to keep in step by hand.

  • GET/db/:tableFilter, select, order, paginate
  • POST/db/:tableOne row, or a thousand
  • PATCH/db/:tableFiltered — an unfiltered update is refused
  • POST/storage/:bucket/*Files, under the same tenancy rules
// Paid orders over $10, newest first.
const res = await fetch('https://authsy.net/api/v1/db/orders' +
  '?status=eq.paid&total=gte.10&order=created_at.desc&limit=20', {
  headers: { 'x-api-key': process.env.AUTHSY_CLIENT_KEY }
});

const { data, count } = await res.json();

// Insert. tenant_id and the timestamps are filled in for you.
await fetch('https://authsy.net/api/v1/db/orders', {
  method: 'POST', headers,
  body: JSON.stringify({ status: 'pending', total: 42 })
});

Deployed table

························

  1. Created in this project’s own schema
  2. Row level security enabled, and forced
  3. Queryable at /db/orders immediately

Pricing

Every tier gets the whole platform — database, users, storage and licensing, with nothing held back on free. What you pay for is how many projects you run.

Free

$0

1 project

The whole platform

  • Tables, collections and file storage
  • Your app’s own users, with sign-in and sessions
  • Row access rules enforced by the database
  • A users table you can edit, with columns you define
  • Unlimited licence keys, device locks and seats
  • REST API, with Node, Python and C# clients
Start free

Studio

$29/ month

10 projects

Everything in Indie, plus

  • Ten projects — a client each, if that is the work
  • Priority support
Get Studio

Enterprise

Custom

Unlimited projects

Everything in Studio, plus

  • No ceiling on projects
  • Priority support
  • Custom terms & invoicing
  • Onboarding assistance
Talk to us

The backend — database, users table, storage, canvas — is included on every tier. Licensing bills on monthly active users, never on keys: +$5 per 1,000 over your plan. Key System and RoDecomp are subscribed separately and both have free tiers.

users tablecolumns you addlicences joinedrow rulessee it as they dodocumentsfile storagedevice locksoffline graceaudit trail

What you get

What you get
Group

The backend, and the screen you run it from

Users, tables, documents and files — drawn on a canvas, deployed in one transaction, and managed from one grid.

  • A users table you edit in place — ban, verify, promote, fix an addressadmin
  • Columns of your own on every user, typed, validated and private by defaultyour columns
  • Ordinary SQL tables in a schema of each project’s ownreal tables
  • A plan that shows every change before a single one is appliedno surprises
  • Sign-up, sign-in and sessions for your app’s own users, per projectapp auth
  • Isolation enforced by the database, not by a WHERE your code has to rememberRLS
  • What each user owns, beside what the database will actually hand themmeasured
  • Schemaless documents as indexed JSON, in the same database and the same backupscollections
  • REST over every table, with filters, ordering and paginationquery API
  • Buckets for files, under the same tenancy rules as the rowsstorage
Group

Keeping a paid build paid for

The controls that decide who gets in, on which machine, and for how long.

  • Keys signed per tenant, verified per responseHMAC
  • Activations bound to a hashed device id, with limits and remote resetHWID
  • Shared seat pools that release themselves on a missed heartbeatfloating
  • Expiry carried on the licence, checked on every validationwall clock
Group

Turning installs into revenue

Selling, upgrading and renewing — without a storefront of your own.

  • A buy link for any offer, ready to paste anywhereno code
  • Verified payments that issue the license by themselvesidempotent
  • Feature flags per license, so one plan can unlock more than anotherentitlements
  • Schemaless collections for settings, saves and statejsonb
  • Every lifecycle event recorded and readable back over the APIevents
Group

Running it day to day

Support work, access control, and a record of what happened.

  • Find the person who wrote in, see what they hold, and unstick them from their rowsupport
  • Usage, revenue and activation dashboards per productanalytics
  • Teammates with admin or viewer roles, and TOTP two-factorteams
  • API keys scoped to client or manage, revocable on their ownscoped
  • A full audit trail of every licence, key and settings changeevents
  • An end-user portal so buyers reset their own devicesself-serve
FAQs

The questions that decide it.

No, and that is the part worth the money. Every other backend hands you a list of users with a delete button, which is why every product ends up writing its own internal tool — a week nobody scoped, never finished, and the least reviewed code in the building.

You get a grid you actually work from. Ban and unban, verify an address, correct one, grant a role, sign somebody out everywhere — in place, in the row.

The columns are yours. plan, credits, trial_ends, referred_by — declare what your product tracks about a person and it is typed, validated and sorted like anything else. New columns are private to your server unless you deliberately let users edit them, because a credits column your own customers can write is not a feature.

And their licence is already on the row. A licence is issued to an email address and a user has one, so nothing needs wiring up: suspend it, move the expiry, or free every machine it is stuck on, from the row of the person who wrote in.

Draw a table on the canvas, press Deploy, and it is queryable straight away. There is no schema file to keep in step — the API reads the live columns, so a column you add is queryable immediately and one you drop stops being.

From an app it is one package:

const authsy = createClient(url, publishableKey);

await authsy.auth.signUp({ email, password });
await authsy.from('notes').insert({ body: 'mine' });

// Only theirs. No filter written anywhere.
const { data } = await authsy.from('notes').select();

Nothing there says “belonging to me”, and it does not have to — the rule on the table decides. Or skip the client: every table is at /db/<name> with filters that read as ?status=eq.paid&order=created_at.desc, about a minute to learn and the same shape for every table.

Real SQL against real tables. Indexes, joins, foreign keys, JSON columns you can query into, transactions that actually roll back — not a document store with a query language painted on, and not a subset that runs out the first time you need a join.

Every row is readable back out over the same API that put it in, paged, with no export ticket to file — and what it comes out of is an ordinary table in an ordinary schema, not a format you have to escape from later. Isolation is enforced by the database rather than by a filter in a query builder, so the guarantee survives a bug in the layer above it — that is the one thing here you could not have written yourself in an afternoon.

Because you can look. Every tool in this space will tell you a policy exists; none of them tells you what it does, which is why “the policy looks right” is how row security fails.

The access review puts on each caller’s identity in turn — nobody signed in, a signed-in stranger, the user who owns the row — asks the database what each one can read, write and delete, and rolls all of it back. What you get is a table of measured numbers, not an opinion about your SQL, and it names anything worth acting on: a table anyone with your shipped key can read, a rule stricter than it looks, row security switched off.

The same question, asked of one person, is on their row in the users table: what they own, beside what the database will actually hand them. When those two numbers disagree, the rule is not doing what it looks like — and no amount of reading the policy would have told you. Looking cannot write: the database refuses it, rather than the page promising not to.

Every response is HMAC-signed with your tenant secret and echoes a nonce you generate, so a replayed or hand-crafted "valid" doesn't verify.

That raises the cost of cracking considerably, but nothing running on someone else's machine is unbreakable — treat it as a strong lock, not a guarantee. Validate on your own server wherever the architecture allows it.

They keep working. Licenses can be issued as Ed25519-signed files your app verifies locally, and offline grace tokens cover a period away from the network.

Paying customers shouldn't be locked out by a dropped connection — that's the fastest way to turn a refund request into a chargeback.

The database, storage and the canvas are on every tier, free included — nothing in the deploy or data path checks a plan. What the tiers price is monthly active users on the licensing side, never keys or seats.

Free covers 2,000 users on one product; Indie is $9/mo for 10,000 across three; Studio is $29/mo for 50,000 across ten. Go over and it's +$5 per 1,000 extra users rather than a forced upgrade.

Yes. Connect your own Stripe, take crypto, or point any processor at a signed custom webhook — a verified payment issues the license automatically, and repeats can't double-issue.

Authsy Pay is the alternative if you'd rather not run that yourself: hosted checkout and payouts at 2.9% + 30¢ per charge, with no monthly fee.

You have one. That is the product: tables and JSON collections you design on a canvas, deployed into a schema of the project’s own, reachable over REST straight away.

Your app also gets its own users — sign-up, sign-in, sessions — separate from your Authsy account and from every other project. Each table carries a rule saying who may read a row: nobody but your server, each user their own rows, any signed-in user, or anyone. It becomes a policy in the database when you deploy, so select() returns that user’s rows without a filter you had to remember, and keeps doing so for the endpoint somebody adds next year.

And you get somewhere to look at it. The users table lists the people, the columns you added about them, and what each one can actually reach — so “where has my order gone” is a search, not a query you write against production.

Being honest: it is a separate product that happens to live on the same account. A Luau decompiler — control-flow lifting, semantic naming, automatic deobfuscation, a Dex-style explorer and live capture from an executor.

It shares the account and the licensing layer, so a licensed app of yours can call the same engine through the client API instead of you hosting one. Free runs with checkpoints; Pro is $12/mo.

Free tier, no card, no expiry.

Start free
Ready when you are
Start free tonight
Open the portal

Draw the first table, deploy it, query it from your app — then open the users table and watch the first person who signs up appear in it, with every control you need beside them. No card, no expiry.

— Real SQL, and every row readable back out