API Reference

Themes

Theme management β€” colors, fonts, and palette customization.

List themes

Returns a paginated list of the user's themes.

GET
/v1/themes

Authorization

AuthorizationRequiredBearer <token>

NextDocs API key (nxd_xxx format)

In: header

Query Parameters

limitinteger

Number of items to return (1-20).

Default: 20Minimum: 1Maximum: 20
afterstring

Cursor for pagination. Pass the ID of the last item from the previous page.

org_idstring

Organization ID returned by organizations.list. Omit for personal scope.

Minimum length: 1

Response Body

A paginated list of resources.

TypeScript Definitions

Use the response body type in TypeScript.

objectRequiredstring
Value in: "list"
dataRequiredarray<object>
has_moreRequiredboolean

Whether there are more items after this page.

Authentication required or API key is invalid.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject
curl -X GET "https://api.nextdocs.io/v1/themes?limit=20&after=clxyz123...&org_id=org_2abc123" \
  -H "Authorization: Bearer <token>"
fetch("https://api.nextdocs.io/v1/themes?limit=20&after=clxyz123...&org_id=org_2abc123", {
  headers: {
    "Authorization": "Bearer <token>"
  }
})
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func main() {
  url := "https://api.nextdocs.io/v1/themes?limit=20&after=clxyz123...&org_id=org_2abc123"

  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Add("Authorization", "Bearer <token>")
  res, _ := http.DefaultClient.Do(req)
  defer res.Body.Close()
  body, _ := ioutil.ReadAll(res.Body)

  fmt.Println(res)
  fmt.Println(string(body))
}
import requests

url = "https://api.nextdocs.io/v1/themes?limit=20&after=clxyz123...&org_id=org_2abc123"

response = requests.request("GET", url, headers = {
  "Authorization": "Bearer <token>"
})

print(response.text)
{
  "object": "list",
  "data": [
    {
      "object": "theme",
      "id": "abc123",
      "name": "Midnight Blue",
      "is_custom": true,
      "font_primary": "Playfair Display",
      "font_secondary": "Inter",
      "colors": {
        "background": "#FFFFFF",
        "foreground": "#1F1F1F",
        "muted": "#F5F5F5",
        "card": "#FAFAFA",
        "text_on_muted": "#6B7280",
        "text_on_card": "#374151",
        "primary": "#3B82F6",
        "secondary": "#8B5CF6",
        "tertiary": "#EC4899",
        "text_on_primary": "#FFFFFF",
        "text_on_secondary": "#FFFFFF",
        "text_on_tertiary": "#FFFFFF",
        "border": "#E5E7EB"
      },
      "created_at": "2026-01-15T10:30:00.000Z",
      "updated_at": "2026-04-01T08:00:00.000Z"
    }
  ],
  "has_more": false
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}

Create a theme

Creates a custom theme with the specified colors and fonts.

POST
/v1/themes

Authorization

AuthorizationRequiredBearer <token>

NextDocs API key (nxd_xxx format)

In: header

Request Body

application/jsonOptional
org_idstring

Organization ID returned by organizations.list. Omit for personal scope.

Minimum length: 1
nameRequiredstring

Display name for the theme.

Minimum length: 1Maximum length: 100
font_primarystring

Heading font family (Google Fonts name).

Maximum length: 100
font_secondarystring

Body font family (Google Fonts name).

Maximum length: 100
colorsobject

Partial theme color palette. Provide only the fields you want to set.

Response Body

Resource created successfully.

objectRequiredstring
Value in: "theme"
idRequiredstring
nameRequiredstring
is_customRequiredboolean
font_primaryRequiredstring | null | null
font_secondaryRequiredstring | null | null
colorsRequiredobject
created_atRequiredstring
updated_atRequiredstring

Request validation failed.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

Authentication required or API key is invalid.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

The requested resource was not found.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

Rate limit or usage quota exceeded.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject
curl -X POST "https://api.nextdocs.io/v1/themes" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "org_id": "org_2abc123",
    "name": "My Brand Theme",
    "font_primary": "Playfair Display",
    "font_secondary": "Inter",
    "colors": {
      "background": "#FFFFFF",
      "foreground": "#1F1F1F",
      "muted": "#F5F5F5",
      "card": "#FAFAFA",
      "text_on_muted": "#6B7280",
      "text_on_card": "#374151",
      "primary": "#3B82F6",
      "secondary": "#8B5CF6",
      "tertiary": "#EC4899",
      "text_on_primary": "#FFFFFF",
      "text_on_secondary": "#FFFFFF",
      "text_on_tertiary": "#FFFFFF",
      "border": "#E5E7EB"
    }
  }'
const body = JSON.stringify({
  "org_id": "org_2abc123",
  "name": "My Brand Theme",
  "font_primary": "Playfair Display",
  "font_secondary": "Inter",
  "colors": {
    "background": "#FFFFFF",
    "foreground": "#1F1F1F",
    "muted": "#F5F5F5",
    "card": "#FAFAFA",
    "text_on_muted": "#6B7280",
    "text_on_card": "#374151",
    "primary": "#3B82F6",
    "secondary": "#8B5CF6",
    "tertiary": "#EC4899",
    "text_on_primary": "#FFFFFF",
    "text_on_secondary": "#FFFFFF",
    "text_on_tertiary": "#FFFFFF",
    "border": "#E5E7EB"
  }
})

fetch("https://api.nextdocs.io/v1/themes", {
  headers: {
    "Authorization": "Bearer <token>"
  },
  body
})
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
  "strings"
)

func main() {
  url := "https://api.nextdocs.io/v1/themes"
  body := strings.NewReader(`{
    "org_id": "org_2abc123",
    "name": "My Brand Theme",
    "font_primary": "Playfair Display",
    "font_secondary": "Inter",
    "colors": {
      "background": "#FFFFFF",
      "foreground": "#1F1F1F",
      "muted": "#F5F5F5",
      "card": "#FAFAFA",
      "text_on_muted": "#6B7280",
      "text_on_card": "#374151",
      "primary": "#3B82F6",
      "secondary": "#8B5CF6",
      "tertiary": "#EC4899",
      "text_on_primary": "#FFFFFF",
      "text_on_secondary": "#FFFFFF",
      "text_on_tertiary": "#FFFFFF",
      "border": "#E5E7EB"
    }
  }`)
  req, _ := http.NewRequest("POST", url, body)
  req.Header.Add("Authorization", "Bearer <token>")
  req.Header.Add("Content-Type", "application/json")
  res, _ := http.DefaultClient.Do(req)
  defer res.Body.Close()
  body, _ := ioutil.ReadAll(res.Body)

  fmt.Println(res)
  fmt.Println(string(body))
}
import requests

url = "https://api.nextdocs.io/v1/themes"
body = {
  "org_id": "org_2abc123",
  "name": "My Brand Theme",
  "font_primary": "Playfair Display",
  "font_secondary": "Inter",
  "colors": {
    "background": "#FFFFFF",
    "foreground": "#1F1F1F",
    "muted": "#F5F5F5",
    "card": "#FAFAFA",
    "text_on_muted": "#6B7280",
    "text_on_card": "#374151",
    "primary": "#3B82F6",
    "secondary": "#8B5CF6",
    "tertiary": "#EC4899",
    "text_on_primary": "#FFFFFF",
    "text_on_secondary": "#FFFFFF",
    "text_on_tertiary": "#FFFFFF",
    "border": "#E5E7EB"
  }
}
response = requests.request("POST", url, json = body, headers = {
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
})

print(response.text)
{
  "object": "theme",
  "id": "abc123",
  "name": "Midnight Blue",
  "is_custom": true,
  "font_primary": "Playfair Display",
  "font_secondary": "Inter",
  "colors": {
    "background": "#FFFFFF",
    "foreground": "#1F1F1F",
    "muted": "#F5F5F5",
    "card": "#FAFAFA",
    "text_on_muted": "#6B7280",
    "text_on_card": "#374151",
    "primary": "#3B82F6",
    "secondary": "#8B5CF6",
    "tertiary": "#EC4899",
    "text_on_primary": "#FFFFFF",
    "text_on_secondary": "#FFFFFF",
    "text_on_tertiary": "#FFFFFF",
    "border": "#E5E7EB"
  },
  "created_at": "2026-01-15T10:30:00.000Z",
  "updated_at": "2026-04-01T08:00:00.000Z"
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}

Get a theme

Returns a single theme by ID.

GET
/v1/themes/{id}

Authorization

AuthorizationRequiredBearer <token>

NextDocs API key (nxd_xxx format)

In: header

Path Parameters

idRequiredstring

Theme ID

Response Body

The requested resource.

objectRequiredstring
Value in: "theme"
idRequiredstring
nameRequiredstring
is_customRequiredboolean
font_primaryRequiredstring | null | null
font_secondaryRequiredstring | null | null
colorsRequiredobject
created_atRequiredstring
updated_atRequiredstring

Authentication required or API key is invalid.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

The requested resource was not found.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject
curl -X GET "https://api.nextdocs.io/v1/themes/theme_abc123" \
  -H "Authorization: Bearer <token>"
fetch("https://api.nextdocs.io/v1/themes/theme_abc123", {
  headers: {
    "Authorization": "Bearer <token>"
  }
})
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func main() {
  url := "https://api.nextdocs.io/v1/themes/theme_abc123"

  req, _ := http.NewRequest("GET", url, nil)
  req.Header.Add("Authorization", "Bearer <token>")
  res, _ := http.DefaultClient.Do(req)
  defer res.Body.Close()
  body, _ := ioutil.ReadAll(res.Body)

  fmt.Println(res)
  fmt.Println(string(body))
}
import requests

url = "https://api.nextdocs.io/v1/themes/theme_abc123"

response = requests.request("GET", url, headers = {
  "Authorization": "Bearer <token>"
})

print(response.text)
{
  "object": "theme",
  "id": "abc123",
  "name": "Midnight Blue",
  "is_custom": true,
  "font_primary": "Playfair Display",
  "font_secondary": "Inter",
  "colors": {
    "background": "#FFFFFF",
    "foreground": "#1F1F1F",
    "muted": "#F5F5F5",
    "card": "#FAFAFA",
    "text_on_muted": "#6B7280",
    "text_on_card": "#374151",
    "primary": "#3B82F6",
    "secondary": "#8B5CF6",
    "tertiary": "#EC4899",
    "text_on_primary": "#FFFFFF",
    "text_on_secondary": "#FFFFFF",
    "text_on_tertiary": "#FFFFFF",
    "border": "#E5E7EB"
  },
  "created_at": "2026-01-15T10:30:00.000Z",
  "updated_at": "2026-04-01T08:00:00.000Z"
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}

Update a theme

Partially updates a theme. Only provided fields are changed.

PATCH
/v1/themes/{id}

Authorization

AuthorizationRequiredBearer <token>

NextDocs API key (nxd_xxx format)

In: header

Request Body

application/jsonOptional
namestring

Updated display name for the theme.

Minimum length: 1Maximum length: 100
font_primarystring

Updated heading font family.

Maximum length: 100
font_secondarystring

Updated body font family.

Maximum length: 100
colorsobject

Partial theme color palette. Provide only the fields you want to set.

Path Parameters

idRequiredstring

Theme ID

Response Body

Resource updated successfully.

objectRequiredstring
Value in: "theme"
idRequiredstring
nameRequiredstring
is_customRequiredboolean
font_primaryRequiredstring | null | null
font_secondaryRequiredstring | null | null
colorsRequiredobject
created_atRequiredstring
updated_atRequiredstring

Request validation failed.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

Authentication required or API key is invalid.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

The requested resource was not found.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

Rate limit or usage quota exceeded.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject
curl -X PATCH "https://api.nextdocs.io/v1/themes/theme_abc123" \
  -H "Authorization: Bearer <token>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Updated Theme",
    "font_primary": "Playfair Display",
    "font_secondary": "Inter",
    "colors": {
      "background": "#FFFFFF",
      "foreground": "#1F1F1F",
      "muted": "#F5F5F5",
      "card": "#FAFAFA",
      "text_on_muted": "#6B7280",
      "text_on_card": "#374151",
      "primary": "#3B82F6",
      "secondary": "#8B5CF6",
      "tertiary": "#EC4899",
      "text_on_primary": "#FFFFFF",
      "text_on_secondary": "#FFFFFF",
      "text_on_tertiary": "#FFFFFF",
      "border": "#E5E7EB"
    }
  }'
const body = JSON.stringify({
  "name": "Updated Theme",
  "font_primary": "Playfair Display",
  "font_secondary": "Inter",
  "colors": {
    "background": "#FFFFFF",
    "foreground": "#1F1F1F",
    "muted": "#F5F5F5",
    "card": "#FAFAFA",
    "text_on_muted": "#6B7280",
    "text_on_card": "#374151",
    "primary": "#3B82F6",
    "secondary": "#8B5CF6",
    "tertiary": "#EC4899",
    "text_on_primary": "#FFFFFF",
    "text_on_secondary": "#FFFFFF",
    "text_on_tertiary": "#FFFFFF",
    "border": "#E5E7EB"
  }
})

fetch("https://api.nextdocs.io/v1/themes/theme_abc123", {
  headers: {
    "Authorization": "Bearer <token>"
  },
  body
})
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
  "strings"
)

func main() {
  url := "https://api.nextdocs.io/v1/themes/theme_abc123"
  body := strings.NewReader(`{
    "name": "Updated Theme",
    "font_primary": "Playfair Display",
    "font_secondary": "Inter",
    "colors": {
      "background": "#FFFFFF",
      "foreground": "#1F1F1F",
      "muted": "#F5F5F5",
      "card": "#FAFAFA",
      "text_on_muted": "#6B7280",
      "text_on_card": "#374151",
      "primary": "#3B82F6",
      "secondary": "#8B5CF6",
      "tertiary": "#EC4899",
      "text_on_primary": "#FFFFFF",
      "text_on_secondary": "#FFFFFF",
      "text_on_tertiary": "#FFFFFF",
      "border": "#E5E7EB"
    }
  }`)
  req, _ := http.NewRequest("PATCH", url, body)
  req.Header.Add("Authorization", "Bearer <token>")
  req.Header.Add("Content-Type", "application/json")
  res, _ := http.DefaultClient.Do(req)
  defer res.Body.Close()
  body, _ := ioutil.ReadAll(res.Body)

  fmt.Println(res)
  fmt.Println(string(body))
}
import requests

url = "https://api.nextdocs.io/v1/themes/theme_abc123"
body = {
  "name": "Updated Theme",
  "font_primary": "Playfair Display",
  "font_secondary": "Inter",
  "colors": {
    "background": "#FFFFFF",
    "foreground": "#1F1F1F",
    "muted": "#F5F5F5",
    "card": "#FAFAFA",
    "text_on_muted": "#6B7280",
    "text_on_card": "#374151",
    "primary": "#3B82F6",
    "secondary": "#8B5CF6",
    "tertiary": "#EC4899",
    "text_on_primary": "#FFFFFF",
    "text_on_secondary": "#FFFFFF",
    "text_on_tertiary": "#FFFFFF",
    "border": "#E5E7EB"
  }
}
response = requests.request("PATCH", url, json = body, headers = {
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
})

print(response.text)
{
  "object": "theme",
  "id": "abc123",
  "name": "Midnight Blue",
  "is_custom": true,
  "font_primary": "Playfair Display",
  "font_secondary": "Inter",
  "colors": {
    "background": "#FFFFFF",
    "foreground": "#1F1F1F",
    "muted": "#F5F5F5",
    "card": "#FAFAFA",
    "text_on_muted": "#6B7280",
    "text_on_card": "#374151",
    "primary": "#3B82F6",
    "secondary": "#8B5CF6",
    "tertiary": "#EC4899",
    "text_on_primary": "#FFFFFF",
    "text_on_secondary": "#FFFFFF",
    "text_on_tertiary": "#FFFFFF",
    "border": "#E5E7EB"
  },
  "created_at": "2026-01-15T10:30:00.000Z",
  "updated_at": "2026-04-01T08:00:00.000Z"
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}

Delete a theme

Deletes a theme. Fails with 409 if any brand kits still reference it.

DELETE
/v1/themes/{id}

Authorization

AuthorizationRequiredBearer <token>

NextDocs API key (nxd_xxx format)

In: header

Path Parameters

idRequiredstring

Theme ID

Response Body

Resource deleted.

Authentication required or API key is invalid.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

The requested resource was not found.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject

Request conflicts with the current state of the resource.

TypeScript Definitions

Use the response body type in TypeScript.

errorRequiredobject
curl -X DELETE "https://api.nextdocs.io/v1/themes/theme_abc123" \
  -H "Authorization: Bearer <token>"
fetch("https://api.nextdocs.io/v1/themes/theme_abc123", {
  headers: {
    "Authorization": "Bearer <token>"
  }
})
package main

import (
  "fmt"
  "net/http"
  "io/ioutil"
)

func main() {
  url := "https://api.nextdocs.io/v1/themes/theme_abc123"

  req, _ := http.NewRequest("DELETE", url, nil)
  req.Header.Add("Authorization", "Bearer <token>")
  res, _ := http.DefaultClient.Do(req)
  defer res.Body.Close()
  body, _ := ioutil.ReadAll(res.Body)

  fmt.Println(res)
  fmt.Println(string(body))
}
import requests

url = "https://api.nextdocs.io/v1/themes/theme_abc123"

response = requests.request("DELETE", url, headers = {
  "Authorization": "Bearer <token>"
})

print(response.text)
Empty
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}
{
  "error": {
    "code": "NOT_FOUND",
    "message": "The requested resource was not found."
  }
}