NEWImage uploads over the API

The headless CMS behind your app.

Moway hosts your content, media and API. You get a private project and an API key — then read and write everything over one GraphQL endpoint, from any web or mobile app, script or agent.

Read
graphql
POST /api/graphql
Authorization: Bearer moway_3f9a…c21
query ($contentTypeSlug: String!) {
contentInstances(contentTypeSlug: $contentTypeSlug) {
title slug data
}
}
# variables { "contentTypeSlug": "post" }
200 OKapplication/json
{ "data": { "contentInstances": [{
"title": "Hello, world",
"slug": "hello-world",
"data": { "body": "…", "image": "https://…" }
}] } }
Upload
multipart
POST /api/media/upload
Authorization: Bearer moway_3f9a…c21
Content-Type: multipart/form-data
file=@cover.webp
200 OKapplication/json
{
"url": "https://media.mowa.nyc/…/cover-8f2k1q.webp",
"contentType": "image/webp",
"bytes": 184320
}
# save the url into any image field

Fully hosted — running on infrastructure you already trust

GraphQL
MongoDB Atlas
Cloudflare R2
Global CDN
Vercel
HTTPS only
THE CORE

Everything your app needs from a CMS. Nothing to host.

Content, media and the API ship together on our infrastructure — your app just makes requests.

One endpoint

Query your content types and entries over GraphQL. Authenticate with a Bearer key — no SDK required.

Bearer moway_…

Read and write

Create, update and delete entries from your app, a script or a CI job — not just fetch them.

createupdatedelete

Media included

Upload images with the same key. They're served from a global CDN, ready to drop into your content.

cover.jpg url

Private by default

Your project is walled off — its own content, media and keys. A key can never reach anyone else's data.

project isolated
HOW IT WORKS

From request to first query.

  1. 1

    Request access

    Tell us what you're building. Once approved, you get an email invitation — your project and API key are waiting when you sign in.

  2. 2

    Shape your content model

    We set up your content types with you — posts, pages, products, whatever your app needs, with 15+ field types.

  3. 3

    Read and write over the API

    One endpoint, one header. Use it from Next.js, a mobile app, Python, curl — anything that speaks HTTP.

curl
$ curl https://moway.mowa.nyc/api/graphql \
-H "Authorization: Bearer moway_3f9a…c21" \
-H "Content-Type: application/json" \
-d '{"query": "{ contentTypes { name slug } }"}'
200 OKresponse
{ "data": { "contentTypes": [
{ "name": "Post", "slug": "post", … },
{ "name": "Page", "slug": "page", … }
] } }
MEDIA

Image uploads, no storage setup.

No bucket to create, no storage keys in your app. Post a file with your project key and get back a URL that’s ready to use.

Your key is the credential

Uploads use the same API key as your queries. Nothing else to configure or rotate.

Fast everywhere

Files are served from a global CDN with long-lived caching, so images load quickly worldwide.

Stays in your project

Every file lands in your project's own space. Other projects can't list or delete it.

PNGJPEGWebPGIFAVIFup to 4 MB
WHAT YOU SKIP

The backend you don’t have to build.

Every app needs a place for its content. With Moway, that’s an API call — not a project of its own.

No database

No cluster to provision, back up or upgrade.

No storage bucket

No S3 account, no credentials, no CDN config.

No auth server

An API key per project. That's the whole setup.

No servers

Nothing to deploy, patch or keep awake.

WHO IT’S FOR

For anything that needs content behind it.

1 project

Web & mobile apps

Content for your website or iOS and Android app without building a backend. Update content without shipping a new build.

Querying in minutes
Media storage included
Plain HTTP + JSON
1 project per client

Agencies & freelancers

Give every client site its own project and key. Nothing is shared between them.

One key per client site
Isolated content and media
No client can see another's data
read + write

Scripts & AI agents

Let automations publish for you — import content, sync products, or have an agent write posts and upload images.

Create and update entries over the API
Upload images with the same key
Scoped to one project, by design
DEVELOPER EXPERIENCE

Fits the stack you already ship.

No proprietary SDK to learn, no build plugin to babysit. It’s an HTTPS endpoint and a key.

API-key auth

A Bearer header. No OAuth dance, no session juggling.

Plain JSON

Standard POST requests and JSON responses. Works with any HTTP client.

Web & mobile

Next.js, React, Swift, Kotlin, Flutter — if it can POST JSON, it works.

Server-side friendly

Keep your key on the server; call Moway from your backend, cron jobs or CI.

Next.jsReact NativeSwiftKotlinFlutterany HTTP client
app/blog/page.tsx
const MOWAY = "https://moway.mowa.nyc/api/graphql";
const query = `query ($contentTypeSlug: String!) {
contentInstances(contentTypeSlug: $contentTypeSlug) {
title slug data
}
}`;
export default async function Blog() {
const res = await fetch(MOWAY, {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.MOWAY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
query, variables: { contentTypeSlug: "post" },
}),
});
const { data } = await res.json();
return data.contentInstances.map((post) => (
<h2 key={post.slug}>{post.title}</h2>
));
}
ON THE ROADMAP

More is on the way.

Everything above works today. Here’s what we’re building next.

Webhooks

Get notified the moment content changes — trigger rebuilds and syncs automatically.

Coming soon

Read-only keys

Keys that can only read, safe to ship inside mobile and browser apps.

Coming soon

Content types over the API

Create and change your content model yourself, straight from the API.

Coming soon

Documentation

Quickstarts, guides and a full API reference.

Coming soon

Your content, one API call away.

Moway is in early access. Tell us about your project and we’ll set you up with a project and a key.