One GraphQL + SQL endpoint over Postgres, MySQL, SQL Server, AWS Athena, Apache Iceberg and more — with row-level access rules, column masking & encryption, query caching and read-replica routing. Configured, not coded.
eru-ql provides a secure and configurable data API layer designed for modern enterprise applications. Define row-level access policies, column masking, encryption rules, query caching, and replica routing through configuration, while exposing both GraphQL and raw SQL APIs through a unified endpoint.
Security and governance are enforced at the API layer itself, ensuring that every query follows the rules defined for your platform, users, and data. Built to work consistently across platforms, eru-ql enables teams to create scalable and governed data services.
Pick the right tool per query. The same auth, caching, replicas and rules apply to both.
Declarative AND/OR custom rules with operators (eq, in, btw, like, …), variables and templates.
Per-column policy — none, hash or encrypt — applied transparently at read time.
Per-project AES keys. Encrypted on write, decrypted on read — never in your application code.
Multiple replicas per datasource with automatic failover and load distribution.
Datasource-level cache backed by Redis, Redis Cluster, etcd or in-memory — by config.
The @singleTxn directive wraps multiple operations in one transaction with full rollback.
The @dbalias directive routes a query to a specific datasource — no client-side fan-out.
First-class JSON path queries on Postgres. CTEs, window functions and UPSERT all supported.
Security rules and column policies apply before the query touches your data — then the result is decrypted and cached on the way back, across any supported database.
Row rules and column policies are evaluated server-side. The client just asks for fields.
# row rule + column encryption applied transparently query Customers @dbalias(name: "warehouse") { customers(where: { region: { _eq: "APAC" } }) { id name # pan is encrypted at rest, decrypted here pan # ssn is masked with hash policy → always shows hash ssn # row rule auto-injects: region = $user.region orders(where: { status: { _eq: "shipped" } }) { id total } } }