Skip to main content

What's Missing

Beta

Data API is in beta and isn't open to everyone yet. How to get access and what to expect from these pages is covered in What Data API Is.

Something unsupported responds with a refusal naming the capability, not a silent stub. A silent mismatch costs more than an absence — "it works, but not like that" surfaces at the visitor's end, not the developer's.

Capabilities that don't exist​

What's missingWhat to do instead
Realtime — change subscriptionspoll on an interval
Edge Functions — running your code on our sidelogic lives in database functions; for outbound calls see Outbound calls
/auth/v1/admin/*manage users with your own functions in the api schema
email change, SMS, MFA, enterprise SSO—
RS256/JWKStokens are signed with HS256 using the database's secret
image transforms, resumable upload, S3 protocolprepare the file on your side; upload and serving work

⚠️ "No Edge Functions" does not mean "no outbound calls." Telegram notifications, webhooks, and calls to third-party APIs work — see Outbound calls. What's missing is specifically running your own code on our side.

Boundaries worth knowing about upfront​

WhatValue
Concurrent connections per database4 per gateway process, two processes — so 8; beyond that, a db_too_busy refusal
File in storageup to 50 MB
Daily request limitset per database; unlimited if not set
Databases per organizationone shared, as many dedicated as you need; see database limits
Accepted origins per database50

The dedicated db_too_busy code means "you are overloaded," not "the platform is overloaded": neighboring databases keep working fine.

Client​

Our own package is @layero/data. It's thin: calling database functions and outbound calls through the gateway, with no wrapper over tables.

npm i @layero/data
import { createClient } from "@layero/data";

const db = createClient({
url: import.meta.env.VITE_LAYERO_DATA_URL, // https://data.layero.ru/<database>
key: import.meta.env.VITE_LAYERO_DATA_KEY, // pk_live_…
});

const menu = await db.rpc("menu");

⚠️ Version 0.x: the HTTP contract is still changing, pinning a version in production is mandatory.

For tables, filters, and user sign-in, use @supabase/supabase-js — the contract is compatible, and it can do everything @layero/data can't yet. You can also do without any package — a request fits in a few lines:

const call = (fn, args) =>
fetch(`${import.meta.env.VITE_LAYERO_DATA_URL}/rest/v1/rpc/${fn}`, {
method: "POST",
headers: { "content-type": "application/json",
apikey: import.meta.env.VITE_LAYERO_DATA_KEY },
body: JSON.stringify(args),
}).then((r) => r.json());