DEV Community

Alex Spinov
Alex Spinov

Posted on

Directus Has a Free API: Turn Any SQL Database Into a REST and GraphQL API Instantly

Directus wraps any SQL database with a REST API, GraphQL API, and admin dashboard — automatically. Point it at your existing Postgres, MySQL, SQLite, or MSSQL database and get a full API in minutes.

Why Directus?

  • Database-first — wraps YOUR existing database, doesn't replace it
  • Auto REST + GraphQL — instant API from any SQL schema
  • Admin UI — beautiful dashboard for content management
  • Auth built-in — users, roles, permissions, SSO
  • Open source — self-host free, unlimited users

Quick Start

npx create-directus-project@latest my-project
cd my-project
npx directus start

# Or Docker
docker run -d -p 8055:8055 directus/directus

# Admin: http://localhost:8055
Enter fullscreen mode Exit fullscreen mode

REST API (Auto-Generated)

BASE="http://localhost:8055"
TOKEN="your-admin-token"

# List all items in a collection
curl "$BASE/items/articles" \
  -H "Authorization: Bearer $TOKEN"

# Get single item
curl "$BASE/items/articles/1" \
  -H "Authorization: Bearer $TOKEN"

# Create item
curl -X POST "$BASE/items/articles" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Hello World",
    "content": "My first article",
    "status": "published"
  }'

# Filter, sort, paginate
curl "$BASE/items/articles?filter[status][_eq]=published&sort=-date_created&limit=10" \
  -H "Authorization: Bearer $TOKEN"

# Deep filtering (relations)
curl "$BASE/items/articles?filter[author][name][_contains]=Alice&fields=title,author.name,tags.name" \
  -H "Authorization: Bearer $TOKEN"

# Aggregate
curl "$BASE/items/articles?aggregate[count]=*&groupBy[]=status" \
  -H "Authorization: Bearer $TOKEN"
Enter fullscreen mode Exit fullscreen mode

GraphQL API

# POST http://localhost:8055/graphql
{
  articles(
    filter: { status: { _eq: "published" } }
    sort: ["-date_created"]
    limit: 10
  ) {
    id
    title
    content
    author {
      name
      avatar {
        id
      }
    }
    tags {
      name
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

JavaScript SDK

import { createDirectus, rest, readItems, createItem } from '@directus/sdk';

const client = createDirectus('http://localhost:8055')
  .with(rest());

// Read items
const articles = await client.request(
  readItems('articles', {
    filter: { status: { _eq: 'published' } },
    fields: ['title', 'content', { author: ['name'] }],
    sort: ['-date_created'],
    limit: 10,
  })
);

// Create item
const newArticle = await client.request(
  createItem('articles', {
    title: 'New Article',
    content: 'Hello from SDK',
    status: 'draft',
  })
);
Enter fullscreen mode Exit fullscreen mode

Key Features

Feature Details
Databases Postgres, MySQL, SQLite, MSSQL, MariaDB, CockroachDB
API REST + GraphQL (auto-generated)
Auth Local, SSO (OAuth, SAML, LDAP)
Files Built-in asset management (S3, local, etc.)
Flows Visual automation builder
Webhooks On create/update/delete events
Roles Granular field-level permissions

Resources


Need a headless CMS or data API? Check my Apify actors or email spinov001@gmail.com.

Top comments (0)