ctahosting

Mobile backend · BaaS

Mobile app backend: ready to use from day one

Stop building your app’s backend from scratch. User accounts, a Postgres database, an auto-generated API, file storage and realtime data come ready in one project, so you can focus on your screens and your product.

  • Postgres with an auto-generated REST API
  • Sign-up, login and row-level security (RLS)
  • Fixed monthly price, no usage-based bills
See plansWhat’s included?

From $1.39/month + VAT

Built-in modules

Everything your mobile app needs on the backend, in one project

Every new app means writing the same things again: sign-up, login, a database, an API, file uploads. Here they come ready. Connect your app with its project ID and key, and it works.

  • Authentication

    Sign-up and login with email and password, one-time codes by SMS, Sign in with Google and Apple. Sessions and refresh tokens handled for you.

  • Database

    A dedicated Postgres database for every project. Create tables, relations, indexes and views from the dashboard or with SQL.

  • API

    An auto-generated REST API for your database: add a table and the endpoints for reading, writing, filtering and pagination are ready.

  • Storage

    Upload photos, videos and files. Access rules per bucket and resumable uploads for large files.

  • Realtime

    Live data updates: a change in a table reaches the app instantly. Made for chat, activity feeds and live dashboards.

  • Edge Functions

    Run your own backend code: webhooks, sending emails, calling third-party APIs and custom business logic.

  • Security (RLS)

    Per-user data access: with row-level security policies, each user only sees the rows they are allowed to see.

  • Backups and monitoring

    Weekly database backups, restore, plus request and error logs. Server maintenance and updates are on us.

Plans

Mobile app backend plans

Every plan includes every module: Authentication, Database, API, Storage, Realtime, Edge Functions and RLS. Plans differ only in resources.

  • Starter

    For your first app or MVP

    33% off$2.98

    $1.98/mo + VAT

    $23.80 upfront for 12 months

    Renews at $1.98/mo

    • 1 GB SQL storage (Postgres)
    • 1 SQL database(s) (projects)
    • 1 GB file storage
    • 5,000 monthly active users
    • 100 concurrent realtime connections
    • 250,000 edge function calls per month
    • Weekly backup
    • Free App Store Publishing
    • All modules included
  • Most popular

    Pro

    For growing apps

    29% off$6.97

    $4.97/mo + VAT

    $59.69 upfront for 12 months

    Renews at $4.97/mo

    • 3 GB SQL storage (Postgres)
    • 3 SQL database(s) (projects)
    • 5 GB file storage
    • 25,000 monthly active users
    • 500 concurrent realtime connections
    • 1,000,000 edge function calls per month
    • Weekly backup
    • Free .app domain (1st year)
    • Free App Store Publishing
    • All modules included
  • Business

    For high traffic and multiple apps

    30% off$9.96

    $6.97/mo + VAT

    $83.61 upfront for 12 months

    Renews at $6.97/mo

    • 5 GB SQL storage (Postgres)
    • 5 SQL database(s) (projects)
    • 10 GB file storage
    • 100,000 monthly active users
    • 2,000 concurrent realtime connections
    • 5,000,000 edge function calls per month
    • Weekly backup
    • Free .app domain (1st year)
    • Free App Store Publishing
    • All modules included

Prices are per month, excluding VAT. Longer terms get bigger discounts. Switch plans at any time.

Authentication

User authentication out of the box: sign-up, login, accounts

The login screen is the first thing users see. A bug or a security hole there affects your whole product. User authentication comes with ready-made endpoints for your app.

  • Email and password sign-up, email verification and password reset
  • Passwordless login with a one-time code by SMS
  • Sign in with Google and Sign in with Apple
  • Access and refresh tokens (JWT), per-device sessions, remote sign-out
  • User profiles, roles and custom fields
  • Rate limiting against brute-force attacks
  • In-app account deletion and personal data export (GDPR)

Database · API · RLS

A Postgres database with an instant API

Your data lives in a real relational database: Postgres. The API is ready the moment you create a table, and RLS policies decide who can read and write which rows.

  • A dedicated Postgres database: tables, relations, indexes, views and SQL functions
  • Auto-generated REST API from your tables: filtering, sorting, pagination and related data
  • Row-level security (RLS): rules like “users only see their own records”
  • Realtime: listen to table changes in your app as they happen
  • Custom endpoints, webhooks and scheduled jobs with Edge Functions
  • Table editor and SQL editor in the dashboard
  • Weekly backups and one-click restore

How it works

Your app’s backend, ready in three steps

  1. 1

    Create your project

    Pick a plan. You get your own project ID, database and API keys.

  2. 2

    Set up your tables

    Create tables in the dashboard or with SQL and write your RLS policies. The API endpoints appear on their own.

  3. 3

    Connect your app

    Connect your Flutter, React Native, Swift or Kotlin app with the project ID and key. Users sign up, data flows.

Comparison

Build your own backend, or use a ready-made one?

Typical backend work for a mobile app, done both ways.

TaskBuilding your own backendctahosting mobile app backend
Sign-up, login, password resetWeeks of development and security testing Built in
Sign in with Google and AppleA separate integration for each provider Built in
An API for your databaseWriting endpoints table by table Auto-generated
Per-user data accessManual checks in every endpoint RLS policy
File uploadsSeparate storage and permission setup Built in
Live dataRunning your own WebSocket server Realtime
Servers, backups, updatesYour responsibility Handled by us
PricingPay-as-you-go bills Fixed monthly price

Who it’s for

For any app with user accounts and data

  • Content and e-learning

    Course, video, podcast and article apps, with user progress and favorites.

  • Fitness and health

    Workout, diet and tracking apps, with private records for each user.

  • Bookings and services

    Apps for salons, clinics and consultants, with customer accounts and calendars.

  • Chat and community

    Messaging, comment and feed apps, kept live with Realtime.

  • Mobile SaaS

    Team, business and productivity apps with role-based access.

  • Agencies

    Teams building apps for clients, with a separate environment per project.

Code examples

What it looks like in your editor

Pick your language and scroll through the examples. Every module works over standard HTTP endpoints, no SDK required. The API address is the same for every project (https://alex.ctahosting.com); PROJECT_ID and ANON_KEY are the values shown for your project in the dashboard.

auth.phpPHP
<?php// Project ID and key: in the dashboard under "Overview"$apiUrl    = 'https://alex.ctahosting.com'; // the same address for every project$projectId = getenv('PROJECT_ID');    // e.g. prj_8fK2mQ… (sent as the x-project header)$anonKey   = getenv('ANON_KEY');    // public key (not a secret) // Shared request helper: sends JSON, returns JSONfunction request(string $method, string $url, array $body = [], ?string $token = null): array{    global $anonKey, $projectId;    $ch = curl_init($url);    curl_setopt_array($ch, [        CURLOPT_CUSTOMREQUEST  => $method,        CURLOPT_RETURNTRANSFER => true,        CURLOPT_HTTPHEADER     => array_filter([            'apikey: ' . $anonKey,            'x-project: ' . $projectId,            'Content-Type: application/json',            $token ? 'Authorization: Bearer ' . $token : null,        ]),        CURLOPT_POSTFIELDS     => $body ? json_encode($body) : null,    ]);    $response = json_decode(curl_exec($ch), true);    curl_close($ch);    return $response ?? [];} // 1) Sign up: the verification email is sent automaticallyrequest('POST', "$apiUrl/auth/v1/signup", [    'email'    => 'jane@example.com',    'password' => 'Strong-Pass-123',]); // 2) Log in: returns an access token (access_token)$session = request('POST', "$apiUrl/auth/v1/token?grant_type=password", [    'email'    => 'jane@example.com',    'password' => 'Strong-Pass-123',]);$token = $session['access_token']; // send as Bearer on later requests

01 Sign-up and login (Authentication)

Sign up and log in with email and password. The access token you get back is used on every request after that. Google and Apple sign-in use the same endpoint.

products.phpPHP
<?php// Uses request() and $token from auth.phprequire __DIR__ . '/auth.php'; // 1) Read: the latest 20 products in Istanbul, newest first//    select   → columns to return//    city=eq. → equals filter (gt, lt, like, in … also work)//    order    → sorting, limit → page size$products = request('GET', "$apiUrl/rest/v1/products"    . '?select=id,name,price,city'    . '&city=eq.Istanbul'    . '&order=created_at.desc&limit=20', [], $token); foreach ($products as $u) {    echo $u['name'] . ' — ' . $u['price'] . " USD\n";} // 2) Write: POST to the same endpoint; inserted if RLS allows itrequest('POST', "$apiUrl/rest/v1/products", [    'name'  => 'Coffee mug',    'price' => 12,    'city'  => 'Istanbul',], $token);

02 Reading and writing data (auto-generated REST API)

The endpoint exists as soon as you create the table: filtering, sorting and pagination via query parameters. RLS policies decide which rows come back.

orders_policy.sqlSQL · same in every language
-- -------------------------------------------------------------- Row-level security (RLS): the policy is written once, in the database.-- Every API request is filtered by it, whatever language it comes from.-- ------------------------------------------------------------ -- 1) Enable RLS on the orders table (once enabled, nobody sees anything by default)alter table orders enable row level security; -- 2) Read: users only see their own orders--    auth.uid() = the ID of the user making the request (from the token)create policy "own orders" on orders  for select using (user_id = auth.uid()); -- 3) Insert: users can only add orders for themselvescreate policy "insert own" on orders  for insert with check (user_id = auth.uid()); -- 4) Update: only their own order, and only while it's 'pending'create policy "update while pending" on orders  for update using (user_id = auth.uid() and status = 'pending');

03 Per-user access (RLS)

You write the policy once, in the database, and every request is filtered by it, whatever language it comes from. That’s why this example is the same SQL in every language.

broadcast.phpPHP
<?php// PHP usually doesn't listen, it BROADCASTS: when an order status changes,// every app listening on that channel gets a message instantly.require __DIR__ . '/auth.php'; // Broadcasts use the service_role key: SECRET, keep it on the server only (never in the app)$serviceKey = getenv('SERVICE_ROLE_KEY');$orderId = 1042; // Channel: "order-1042" → everyone who has this order's screen openrequest('POST', "$apiUrl/realtime/v1/api/broadcast", [    'messages' => [[        'topic'   => "order-$orderId",        'event'   => 'status',        'payload' => ['status' => 'shipped', 'carrier' => 'DHL'],    ]],], $serviceKey); // Note: writing to the table works too. Every INSERT reaches apps// listening on the messages table on its own (see the other languages).

04 Live updates (Realtime)

The app listens to a table, and a new row shows up on screen the moment it’s inserted. You can also broadcast a message to all listeners from the server (PHP).

upload.phpPHP
<?phprequire __DIR__ . '/auth.php'; // File from the form (input name="avatar")$file = $_FILES['avatar']['tmp_name'];$userId = 'u_8f2c'; // Path: <bucket>/<file name>  → avatars/u_8f2c.jpg$ch = curl_init("$apiUrl/storage/v1/object/avatars/$userId.jpg");curl_setopt_array($ch, [    CURLOPT_POST           => true,    CURLOPT_RETURNTRANSFER => true,    CURLOPT_HTTPHEADER     => [        'apikey: ' . $anonKey,        'x-project: ' . $projectId,        'Authorization: Bearer ' . $token,        'Content-Type: image/jpeg',        'x-upsert: true',            // overwrite if it exists    ],    CURLOPT_POSTFIELDS     => file_get_contents($file),]);curl_exec($ch);curl_close($ch); // Direct link in a public bucket:echo "$apiUrl/storage/v1/object/public/$projectId/avatars/$userId.jpg";

05 Photo and file uploads (Storage)

Upload profile photos, documents and videos. Bucket rules decide who can upload and view what. Files in public buckets get a direct link.

welcome.phpPHP
<?php// The function runs in your project; PHP only calls it.// (You write the function itself in the dashboard under "Edge Functions".)require __DIR__ . '/auth.php'; // POST /functions/v1/<function name>$result = request('POST', "$apiUrl/functions/v1/welcome", [    'email' => 'jane@example.com',    'name'  => 'Jane',], $token); // JSON returned by the functionif (!empty($result['ok'])) {    echo 'Welcome email sent';}

06 Your own backend code (Edge Functions)

Functions for anything the API doesn’t cover. Here we call a function that sends a welcome email to a new user. Webhooks, third-party APIs and scheduled jobs work the same way.

FAQ

Mobile app backend: frequently asked questions

If you can’t find what you need, write to us; we reply the same day.

Not sure which one fits?

Our sales team can suggest a plan for your needs.

  • It’s the server side that runs behind your app’s screens: it stores user accounts, checks logins, keeps your data and serves it to the app through an API. The app runs on the phone; this work happens on the server. It’s also called a mobile backend service, mobile app server or MBaaS (mobile backend as a service).

Focus on your app. Leave the backend to us.

Authentication, database, API, storage and realtime, ready to go. Pick a plan, and our sales team is here if you have questions.

No setup fee · No commitment · 14-day refund