openapi: 3.0.3
info:
title: 'TallCMS API Documentation'
description: 'REST API for managing TallCMS content including pages, posts, categories, media, and webhooks.'
version: 1.0.0
servers:
-
url: 'https://tallcms.com'
tags:
-
name: Authentication
description: ''
-
name: Pages
description: ''
-
name: Posts
description: ''
-
name: Categories
description: ''
-
name: Media
description: ''
-
name: 'Media Collections'
description: ''
-
name: Webhooks
description: ''
components:
securitySchemes:
default:
type: http
scheme: bearer
description: 'Get a token by POSTing to /api/v1/tallcms/auth/token with your email, password, device_name, and abilities. Use the returned token as: Authorization: Bearer {token}'
security:
-
default: []
paths:
/api/v1/tallcms/auth/token:
post:
summary: 'Create a new API token.'
operationId: createANewAPIToken
description: "This endpoint is public but rate-limited by IP+email hash to prevent\nbrute force attacks while not affecting legitimate users on shared IPs."
parameters: []
responses:
201:
description: ''
content:
application/json:
schema:
type: object
example:
data:
token: 1|abc123...
expires_at: '2027-01-27T10:30:00Z'
abilities:
- 'pages:read'
- 'posts:read'
properties:
data:
type: object
properties:
token:
type: string
example: 1|abc123...
expires_at:
type: string
example: '2027-01-27T10:30:00Z'
abilities:
type: array
example:
- 'pages:read'
- 'posts:read'
items:
type: string
401:
description: ''
content:
application/json:
schema:
type: object
example:
error:
message: 'Invalid credentials'
code: invalid_credentials
properties:
error:
type: object
properties:
message:
type: string
example: 'Invalid credentials'
code:
type: string
example: invalid_credentials
429:
description: ''
content:
application/json:
schema:
type: object
example:
error:
message: 'Too many attempts. Try again in 300 seconds.'
code: rate_limit_exceeded
properties:
error:
type: object
properties:
message:
type: string
example: 'Too many attempts. Try again in 300 seconds.'
code:
type: string
example: rate_limit_exceeded
tags:
- Authentication
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
email:
type: string
description: "The user's email address."
example: user@example.com
password:
type: string
description: "The user's password."
example: password123
device_name:
type: string
description: 'A name for the token/device.'
example: 'API Client'
abilities:
type: array
description: 'Token abilities. Must be from the allowed list.'
example:
- 'pages:read'
- 'posts:read'
items:
type: string
expires_in_days:
type: integer
description: 'Optional token expiry in days. Default from config.'
example: 16
required:
- email
- password
- device_name
security: []
delete:
summary: 'Revoke the current token.'
operationId: revokeTheCurrentToken
description: ''
parameters: []
responses:
200:
description: ''
content:
application/json:
schema:
type: object
example:
message: 'Token revoked successfully'
properties:
message:
type: string
example: 'Token revoked successfully'
400:
description: ''
content:
application/json:
schema:
type: object
example:
error:
message: 'No token to revoke'
code: no_token
properties:
error:
type: object
properties:
message:
type: string
example: 'No token to revoke'
code:
type: string
example: no_token
tags:
- Authentication
/api/v1/tallcms/auth/user:
get:
summary: 'Get the authenticated user.'
operationId: getTheAuthenticatedUser
description: ''
parameters: []
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": {"id": 1, "name": "John Doe", "email": "john@example.com", "token": {...}}}'
tags:
- Authentication
/api/v1/tallcms/pages:
get:
summary: 'List all pages.'
operationId: listAllPages
description: ''
parameters:
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
-
in: query
name: per_page
description: 'Items per page (max 100).'
example: 15
required: false
schema:
type: integer
description: 'Items per page (max 100).'
example: 15
-
in: query
name: sort
description: 'Sort field.'
example: created_at
required: false
schema:
type: string
description: 'Sort field.'
example: created_at
-
in: query
name: order
description: 'Sort order (asc, desc).'
example: desc
required: false
schema:
type: string
description: 'Sort order (asc, desc).'
example: desc
-
in: query
name: 'filter[status]'
description: 'Filter by status.'
example: published
required: false
schema:
type: string
description: 'Filter by status.'
example: published
-
in: query
name: 'filter[author_id]'
description: 'Filter by author.'
example: 1
required: false
schema:
type: integer
description: 'Filter by author.'
example: 1
-
in: query
name: 'filter[parent_id]'
description: 'Filter by parent.'
example: null
required: false
schema:
type: integer
description: 'Filter by parent.'
example: null
-
in: query
name: 'filter[is_homepage]'
description: 'Filter by homepage status.'
example: false
required: false
schema:
type: boolean
description: 'Filter by homepage status.'
example: false
-
in: query
name: 'filter[trashed]'
description: 'Include soft-deleted (only, with).'
example: only
required: false
schema:
type: string
description: 'Include soft-deleted (only, with).'
example: only
-
in: query
name: include
description: 'Comma-separated relations (parent, children, author).'
example: author
required: false
schema:
type: string
description: 'Comma-separated relations (parent, children, author).'
example: author
-
in: query
name: with_counts
description: 'Comma-separated count fields (children).'
example: children
required: false
schema:
type: string
description: 'Comma-separated count fields (children).'
example: children
-
in: query
name: locale
description: 'Response locale for translatable fields.'
example: en
required: false
schema:
type: string
description: 'Response locale for translatable fields.'
example: en
-
in: query
name: with_translations
description: 'Include all translations.'
example: false
required: false
schema:
type: boolean
description: 'Include all translations.'
example: false
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": [...], "meta": {...}, "links": {...}}'
tags:
- Pages
post:
summary: 'Create a new page.'
operationId: createANewPage
description: ''
parameters: []
responses: { }
tags:
- Pages
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'This field is required when translations is not present. Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
content:
type: object
description: ''
example: null
properties: { }
meta_title:
type: string
description: 'Must not be greater than 255 characters.'
example: g
nullable: true
meta_description:
type: string
description: 'Must not be greater than 500 characters.'
example: z
nullable: true
translations:
type: object
description: ''
example: null
properties:
title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- m
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- i
items:
type: string
content:
type: array
description: ''
example: null
items:
type: object
meta_title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- 'y'
items:
type: string
nullable: true
meta_description:
type: array
description: 'Must not be greater than 500 characters.'
example:
- v
items:
type: string
nullable: true
status:
type: string
description: ''
example: published
enum:
- draft
- pending
- published
parent_id:
type: integer
description: 'The id of an existing record in the tallcms_pages table.'
example: 16
nullable: true
is_homepage:
type: boolean
description: ''
example: false
content_width:
type: string
description: ''
example: narrow
enum:
- narrow
- standard
- wide
show_breadcrumbs:
type: boolean
description: ''
example: false
sort_order:
type: integer
description: 'Must be at least 0.'
example: 39
'/api/v1/tallcms/pages/{id}':
get:
summary: 'Get a specific page.'
operationId: getASpecificPage
description: ''
parameters:
-
in: query
name: include
description: 'Comma-separated relations (parent, children, author).'
example: author
required: false
schema:
type: string
description: 'Comma-separated relations (parent, children, author).'
example: author
-
in: query
name: with_counts
description: 'Comma-separated count fields (children).'
example: children
required: false
schema:
type: string
description: 'Comma-separated count fields (children).'
example: children
-
in: query
name: locale
description: 'Response locale for translatable fields.'
example: en
required: false
schema:
type: string
description: 'Response locale for translatable fields.'
example: en
-
in: query
name: with_translations
description: 'Include all translations.'
example: false
required: false
schema:
type: boolean
description: 'Include all translations.'
example: false
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": {...}}'
tags:
- Pages
put:
summary: 'Update a page.'
operationId: updateAPage
description: ''
parameters: []
responses: { }
tags:
- Pages
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
content:
type: object
description: ''
example: null
properties: { }
meta_title:
type: string
description: 'Must not be greater than 255 characters.'
example: g
nullable: true
meta_description:
type: string
description: 'Must not be greater than 500 characters.'
example: z
nullable: true
translations:
type: object
description: ''
example: null
properties:
title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- m
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- i
items:
type: string
content:
type: array
description: ''
example: null
items:
type: object
meta_title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- 'y'
items:
type: string
nullable: true
meta_description:
type: array
description: 'Must not be greater than 500 characters.'
example:
- v
items:
type: string
nullable: true
status:
type: string
description: ''
example: published
enum:
- draft
- pending
- published
parent_id:
type: integer
description: 'The id of an existing record in the tallcms_pages table.'
example: 16
nullable: true
is_homepage:
type: boolean
description: ''
example: false
content_width:
type: string
description: ''
example: standard
enum:
- narrow
- standard
- wide
show_breadcrumbs:
type: boolean
description: ''
example: true
sort_order:
type: integer
description: 'Must be at least 0.'
example: 39
delete:
summary: 'Soft-delete a page.'
operationId: softDeleteAPage
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: id
description: 'The ID of the page.'
example: architecto
required: true
schema:
type: string
-
in: path
name: page
description: 'The page ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/tallcms/pages/{page}/revisions':
get:
summary: 'Get page revisions.'
operationId: getPageRevisions
description: ''
parameters:
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
-
in: query
name: per_page
description: 'Items per page (max 100).'
example: 15
required: false
schema:
type: integer
description: 'Items per page (max 100).'
example: 15
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": [...], "meta": {...}, "links": {...}}'
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page ID.'
example: 1
required: true
schema:
type: integer
'/api/v1/tallcms/pages/{page}/restore':
post:
summary: 'Restore a soft-deleted page.'
operationId: restoreASoftDeletedPage
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/pages/{page}/publish':
post:
summary: 'Publish a page.'
operationId: publishAPage
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/pages/{page}/unpublish':
post:
summary: 'Unpublish a page.'
operationId: unpublishAPage
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/pages/{page}/approve':
post:
summary: 'Approve a page.'
operationId: approveAPage
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/pages/{page}/reject':
post:
summary: 'Reject a page.'
operationId: rejectAPage
description: ''
parameters: []
responses: { }
tags:
- Pages
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Must not be greater than 1000 characters.'
example: b
required:
- reason
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/pages/{page}/submit-for-review':
post:
summary: 'Submit a page for review.'
operationId: submitAPageForReview
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/pages/{page}/revisions/{revision}/restore':
post:
summary: 'Restore a page revision.'
operationId: restoreAPageRevision
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
-
in: path
name: revision
description: 'The revision.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/pages/{page}/force':
delete:
summary: 'Force-delete a page.'
operationId: forceDeleteAPage
description: ''
parameters: []
responses: { }
tags:
- Pages
parameters:
-
in: path
name: page
description: 'The page.'
example: architecto
required: true
schema:
type: string
/api/v1/tallcms/posts:
get:
summary: 'List all posts.'
operationId: listAllPosts
description: ''
parameters:
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
-
in: query
name: per_page
description: 'Items per page (max 100).'
example: 15
required: false
schema:
type: integer
description: 'Items per page (max 100).'
example: 15
-
in: query
name: sort
description: 'Sort field.'
example: created_at
required: false
schema:
type: string
description: 'Sort field.'
example: created_at
-
in: query
name: order
description: 'Sort order (asc, desc).'
example: desc
required: false
schema:
type: string
description: 'Sort order (asc, desc).'
example: desc
-
in: query
name: 'filter[status]'
description: 'Filter by status.'
example: published
required: false
schema:
type: string
description: 'Filter by status.'
example: published
-
in: query
name: 'filter[author_id]'
description: 'Filter by author.'
example: 1
required: false
schema:
type: integer
description: 'Filter by author.'
example: 1
-
in: query
name: 'filter[category_id]'
description: 'Filter by category.'
example: 1
required: false
schema:
type: integer
description: 'Filter by category.'
example: 1
-
in: query
name: 'filter[is_featured]'
description: 'Filter by featured status.'
example: false
required: false
schema:
type: boolean
description: 'Filter by featured status.'
example: false
-
in: query
name: 'filter[trashed]'
description: 'Include soft-deleted (only, with).'
example: only
required: false
schema:
type: string
description: 'Include soft-deleted (only, with).'
example: only
-
in: query
name: include
description: 'Comma-separated relations (author, categories).'
example: 'author,categories'
required: false
schema:
type: string
description: 'Comma-separated relations (author, categories).'
example: 'author,categories'
-
in: query
name: with_counts
description: 'Comma-separated count fields (categories).'
example: categories
required: false
schema:
type: string
description: 'Comma-separated count fields (categories).'
example: categories
-
in: query
name: locale
description: 'Response locale for translatable fields.'
example: en
required: false
schema:
type: string
description: 'Response locale for translatable fields.'
example: en
-
in: query
name: with_translations
description: 'Include all translations.'
example: false
required: false
schema:
type: boolean
description: 'Include all translations.'
example: false
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": [...], "meta": {...}, "links": {...}}'
tags:
- Posts
post:
summary: 'Create a new post.'
operationId: createANewPost
description: ''
parameters: []
responses: { }
tags:
- Posts
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'This field is required when translations is not present. Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
excerpt:
type: string
description: 'Must not be greater than 500 characters.'
example: g
nullable: true
content:
type: object
description: ''
example: null
properties: { }
meta_title:
type: string
description: 'Must not be greater than 255 characters.'
example: z
nullable: true
meta_description:
type: string
description: 'Must not be greater than 500 characters.'
example: m
nullable: true
translations:
type: object
description: ''
example: null
properties:
title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- i
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- 'y'
items:
type: string
excerpt:
type: array
description: 'Must not be greater than 500 characters.'
example:
- v
items:
type: string
nullable: true
content:
type: array
description: ''
example: null
items:
type: object
meta_title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- d
items:
type: string
nullable: true
meta_description:
type: array
description: 'Must not be greater than 500 characters.'
example:
- l
items:
type: string
nullable: true
status:
type: string
description: ''
example: pending
enum:
- draft
- pending
- published
is_featured:
type: boolean
description: ''
example: false
featured_image:
type: string
description: 'Must not be greater than 255 characters.'
example: j
nullable: true
category_ids:
type: array
description: 'The id of an existing record in the tallcms_categories table.'
example:
- 16
items:
type: integer
'/api/v1/tallcms/posts/{id}':
get:
summary: 'Get a specific post.'
operationId: getASpecificPost
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Posts
put:
summary: 'Update a post.'
operationId: updateAPost
description: ''
parameters: []
responses: { }
tags:
- Posts
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
title:
type: string
description: 'Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
excerpt:
type: string
description: 'Must not be greater than 500 characters.'
example: g
nullable: true
content:
type: object
description: ''
example: null
properties: { }
meta_title:
type: string
description: 'Must not be greater than 255 characters.'
example: z
nullable: true
meta_description:
type: string
description: 'Must not be greater than 500 characters.'
example: m
nullable: true
translations:
type: object
description: ''
example: null
properties:
title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- i
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- 'y'
items:
type: string
excerpt:
type: array
description: 'Must not be greater than 500 characters.'
example:
- v
items:
type: string
nullable: true
content:
type: array
description: ''
example: null
items:
type: object
meta_title:
type: array
description: 'Must not be greater than 255 characters.'
example:
- d
items:
type: string
nullable: true
meta_description:
type: array
description: 'Must not be greater than 500 characters.'
example:
- l
items:
type: string
nullable: true
status:
type: string
description: ''
example: draft
enum:
- draft
- pending
- published
is_featured:
type: boolean
description: ''
example: true
featured_image:
type: string
description: 'Must not be greater than 255 characters.'
example: j
nullable: true
category_ids:
type: array
description: 'The id of an existing record in the tallcms_categories table.'
example:
- 16
items:
type: integer
delete:
summary: 'Soft-delete a post.'
operationId: softDeleteAPost
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: id
description: 'The ID of the post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/revisions':
get:
summary: 'Get post revisions.'
operationId: getPostRevisions
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/restore':
post:
summary: 'Restore a soft-deleted post.'
operationId: restoreASoftDeletedPost
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/publish':
post:
summary: 'Publish a post.'
operationId: publishAPost
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/unpublish':
post:
summary: 'Unpublish a post.'
operationId: unpublishAPost
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/approve':
post:
summary: 'Approve a post.'
operationId: approveAPost
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/reject':
post:
summary: 'Reject a post.'
operationId: rejectAPost
description: ''
parameters: []
responses: { }
tags:
- Posts
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
reason:
type: string
description: 'Must not be greater than 1000 characters.'
example: b
required:
- reason
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/submit-for-review':
post:
summary: 'Submit a post for review.'
operationId: submitAPostForReview
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/revisions/{revision}/restore':
post:
summary: 'Restore a post revision.'
operationId: restoreAPostRevision
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
-
in: path
name: revision
description: 'The revision.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/posts/{post}/force':
delete:
summary: 'Force-delete a post.'
operationId: forceDeleteAPost
description: ''
parameters: []
responses: { }
tags:
- Posts
parameters:
-
in: path
name: post
description: 'The post.'
example: architecto
required: true
schema:
type: string
/api/v1/tallcms/categories:
get:
summary: 'List all categories.'
operationId: listAllCategories
description: ''
parameters:
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
-
in: query
name: per_page
description: 'Items per page (max 100).'
example: 15
required: false
schema:
type: integer
description: 'Items per page (max 100).'
example: 15
-
in: query
name: sort
description: 'Sort field.'
example: name
required: false
schema:
type: string
description: 'Sort field.'
example: name
-
in: query
name: order
description: 'Sort order (asc, desc).'
example: asc
required: false
schema:
type: string
description: 'Sort order (asc, desc).'
example: asc
-
in: query
name: 'filter[parent_id]'
description: 'Filter by parent category.'
example: 1
required: false
schema:
type: integer
description: 'Filter by parent category.'
example: 1
-
in: query
name: include
description: 'Comma-separated relations (parent, children).'
example: children
required: false
schema:
type: string
description: 'Comma-separated relations (parent, children).'
example: children
-
in: query
name: with_counts
description: 'Comma-separated count fields (posts, children).'
example: posts
required: false
schema:
type: string
description: 'Comma-separated count fields (posts, children).'
example: posts
-
in: query
name: locale
description: 'Response locale for translatable fields.'
example: en
required: false
schema:
type: string
description: 'Response locale for translatable fields.'
example: en
-
in: query
name: with_translations
description: 'Include all translations.'
example: false
required: false
schema:
type: boolean
description: 'Include all translations.'
example: false
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": [...], "meta": {...}, "links": {...}}'
tags:
- Categories
post:
summary: 'Create a new category.'
operationId: createANewCategory
description: ''
parameters: []
responses: { }
tags:
- Categories
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'This field is required when translations is not present. Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
description:
type: string
description: 'Must not be greater than 1000 characters.'
example: 'Animi quos velit et fugiat.'
nullable: true
translations:
type: object
description: ''
example: null
properties:
name:
type: array
description: 'Must not be greater than 255 characters.'
example:
- d
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- l
items:
type: string
description:
type: array
description: 'Must not be greater than 1000 characters.'
example:
- j
items:
type: string
nullable: true
color:
type: string
description: 'Must not be greater than 7 characters.'
example: nikhway
nullable: true
sort_order:
type: integer
description: 'Must be at least 0.'
example: 62
parent_id:
type: integer
description: 'The id of an existing record in the tallcms_categories table.'
example: 16
nullable: true
'/api/v1/tallcms/categories/{id}':
get:
summary: 'Get a specific category.'
operationId: getASpecificCategory
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Categories
put:
summary: 'Update a category.'
operationId: updateACategory
description: ''
parameters: []
responses: { }
tags:
- Categories
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
description:
type: string
description: 'Must not be greater than 1000 characters.'
example: 'Animi quos velit et fugiat.'
nullable: true
translations:
type: object
description: ''
example: null
properties:
name:
type: array
description: 'Must not be greater than 255 characters.'
example:
- d
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- l
items:
type: string
description:
type: array
description: 'Must not be greater than 1000 characters.'
example:
- j
items:
type: string
nullable: true
color:
type: string
description: 'Must not be greater than 7 characters.'
example: nikhway
nullable: true
sort_order:
type: integer
description: 'Must be at least 0.'
example: 62
parent_id:
type: integer
description: 'The id of an existing record in the tallcms_categories table.'
example: 16
nullable: true
delete:
summary: 'Delete a category (hard delete).'
operationId: deleteACategoryhardDelete
description: ''
parameters: []
responses: { }
tags:
- Categories
parameters:
-
in: path
name: id
description: 'The ID of the category.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/categories/{category}/posts':
get:
summary: 'Get posts for a category.'
operationId: getPostsForACategory
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Categories
parameters:
-
in: path
name: category
description: 'The category.'
example: architecto
required: true
schema:
type: string
/api/v1/tallcms/media:
get:
summary: 'List all media.'
operationId: listAllMedia
description: ''
parameters:
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
-
in: query
name: per_page
description: 'Items per page (max 100).'
example: 15
required: false
schema:
type: integer
description: 'Items per page (max 100).'
example: 15
-
in: query
name: sort
description: 'Sort field.'
example: created_at
required: false
schema:
type: string
description: 'Sort field.'
example: created_at
-
in: query
name: order
description: 'Sort order (asc, desc).'
example: desc
required: false
schema:
type: string
description: 'Sort order (asc, desc).'
example: desc
-
in: query
name: 'filter[mime_type]'
description: 'Filter by MIME type (supports wildcard: image/*).'
example: image/jpeg
required: false
schema:
type: string
description: 'Filter by MIME type (supports wildcard: image/*).'
example: image/jpeg
-
in: query
name: 'filter[collection_id]'
description: 'Filter by collection.'
example: 1
required: false
schema:
type: integer
description: 'Filter by collection.'
example: 1
-
in: query
name: 'filter[has_variants]'
description: 'Filter by variant status.'
example: true
required: false
schema:
type: boolean
description: 'Filter by variant status.'
example: true
-
in: query
name: include
description: 'Comma-separated relations (collections).'
example: collections
required: false
schema:
type: string
description: 'Comma-separated relations (collections).'
example: collections
-
in: query
name: with_counts
description: 'Comma-separated count fields (collections).'
example: collections
required: false
schema:
type: string
description: 'Comma-separated count fields (collections).'
example: collections
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": [...], "meta": {...}, "links": {...}}'
tags:
- Media
post:
summary: 'Upload a new media file.'
operationId: uploadANewMediaFile
description: ''
parameters: []
responses: { }
tags:
- Media
requestBody:
required: true
content:
multipart/form-data:
schema:
type: object
properties:
file:
type: string
format: binary
description: 'Must be a file. Must not be greater than 102400 kilobytes.'
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
disk:
type: string
description: ''
example: s3
enum:
- public
- s3
- local
alt_text:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
nullable: true
caption:
type: string
description: 'Must not be greater than 1000 characters.'
example: g
nullable: true
collection_ids:
type: array
description: 'The id of an existing record in the tallcms_media_collections table.'
example:
- 16
items:
type: integer
required:
- file
'/api/v1/tallcms/media/{media}':
get:
summary: 'Get a specific media item.'
operationId: getASpecificMediaItem
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Media
put:
summary: "Update a media item's metadata."
operationId: updateAMediaItemsMetadata
description: ''
parameters: []
responses: { }
tags:
- Media
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
alt_text:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
nullable: true
caption:
type: string
description: 'Must not be greater than 1000 characters.'
example: g
nullable: true
collection_ids:
type: array
description: 'The id of an existing record in the tallcms_media_collections table.'
example:
- 16
items:
type: integer
delete:
summary: 'Delete a media item (hard delete).'
operationId: deleteAMediaItemhardDelete
description: ''
parameters: []
responses: { }
tags:
- Media
parameters:
-
in: path
name: media
description: ''
example: architecto
required: true
schema:
type: string
/api/v1/tallcms/media/collections:
get:
summary: 'List all media collections.'
operationId: listAllMediaCollections
description: ''
parameters:
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
-
in: query
name: per_page
description: 'Items per page (max 100).'
example: 15
required: false
schema:
type: integer
description: 'Items per page (max 100).'
example: 15
-
in: query
name: sort
description: 'Sort field.'
example: name
required: false
schema:
type: string
description: 'Sort field.'
example: name
-
in: query
name: order
description: 'Sort order (asc, desc).'
example: asc
required: false
schema:
type: string
description: 'Sort order (asc, desc).'
example: asc
-
in: query
name: include
description: 'Comma-separated relations (media).'
example: media
required: false
schema:
type: string
description: 'Comma-separated relations (media).'
example: media
-
in: query
name: with_counts
description: 'Comma-separated count fields (media).'
example: media
required: false
schema:
type: string
description: 'Comma-separated count fields (media).'
example: media
-
in: query
name: locale
description: 'Response locale for translatable fields.'
example: en
required: false
schema:
type: string
description: 'Response locale for translatable fields.'
example: en
-
in: query
name: with_translations
description: 'Include all translations.'
example: false
required: false
schema:
type: boolean
description: 'Include all translations.'
example: false
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": [...], "meta": {...}, "links": {...}}'
tags:
- 'Media Collections'
post:
summary: 'Create a new media collection.'
operationId: createANewMediaCollection
description: ''
parameters: []
responses: { }
tags:
- 'Media Collections'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'This field is required when translations is not present. Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
translations:
type: object
description: ''
example: null
properties:
name:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
color:
type: string
description: 'Must not be greater than 7 characters.'
example: miyvdlj
nullable: true
'/api/v1/tallcms/media/collections/{collection}':
get:
summary: 'Get a specific media collection.'
operationId: getASpecificMediaCollection
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- 'Media Collections'
put:
summary: 'Update a media collection.'
operationId: updateAMediaCollection
description: ''
parameters: []
responses: { }
tags:
- 'Media Collections'
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
slug:
type: string
description: 'Must not be greater than 255 characters.'
example: 'n'
translations:
type: object
description: ''
example: null
properties:
name:
type: array
description: 'Must not be greater than 255 characters.'
example:
- g
items:
type: string
slug:
type: array
description: 'Must not be greater than 255 characters.'
example:
- z
items:
type: string
color:
type: string
description: 'Must not be greater than 7 characters.'
example: miyvdlj
nullable: true
delete:
summary: 'Delete a media collection (hard delete).'
operationId: deleteAMediaCollectionhardDelete
description: ''
parameters: []
responses: { }
tags:
- 'Media Collections'
parameters:
-
in: path
name: collection
description: 'The collection.'
example: architecto
required: true
schema:
type: string
/api/v1/tallcms/webhooks:
get:
summary: 'List all webhooks.'
operationId: listAllWebhooks
description: ''
parameters:
-
in: query
name: page
description: 'Page number.'
example: 1
required: false
schema:
type: integer
description: 'Page number.'
example: 1
-
in: query
name: per_page
description: 'Items per page (max 100).'
example: 15
required: false
schema:
type: integer
description: 'Items per page (max 100).'
example: 15
responses:
200:
description: ''
content:
text/plain:
schema:
type: string
example: '{"data": [...], "meta": {...}, "links": {...}}'
tags:
- Webhooks
post:
summary: 'Create a new webhook.'
operationId: createANewWebhook
description: ''
parameters: []
responses: { }
tags:
- Webhooks
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
url:
type: string
description: 'Must be a valid URL. Must not be greater than 2048 characters.'
example: 'http://bailey.com/'
events:
type: array
description: ''
example:
- post.published
items:
type: string
enum:
- '*'
- page.created
- page.updated
- page.published
- page.unpublished
- page.deleted
- page.restored
- post.created
- post.updated
- post.published
- post.unpublished
- post.deleted
- post.restored
- category.created
- category.updated
- category.deleted
- media.created
- media.updated
- media.deleted
is_active:
type: boolean
description: ''
example: false
timeout:
type: integer
description: 'Must be at least 5. Must not be greater than 60.'
example: 17
required:
- name
- url
'/api/v1/tallcms/webhooks/{id}':
get:
summary: 'Get a specific webhook.'
operationId: getASpecificWebhook
description: ''
parameters: []
responses:
401:
description: ''
content:
application/json:
schema:
type: object
example:
message: Unauthenticated.
properties:
message:
type: string
example: Unauthenticated.
tags:
- Webhooks
put:
summary: 'Update a webhook.'
operationId: updateAWebhook
description: ''
parameters: []
responses: { }
tags:
- Webhooks
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
name:
type: string
description: 'Must not be greater than 255 characters.'
example: b
url:
type: string
description: 'Must be a valid URL. Must not be greater than 2048 characters.'
example: 'http://bailey.com/'
events:
type: array
description: ''
example:
- post.deleted
items:
type: string
enum:
- '*'
- page.created
- page.updated
- page.published
- page.unpublished
- page.deleted
- page.restored
- post.created
- post.updated
- post.published
- post.unpublished
- post.deleted
- post.restored
- category.created
- category.updated
- category.deleted
- media.created
- media.updated
- media.deleted
is_active:
type: boolean
description: ''
example: false
timeout:
type: integer
description: 'Must be at least 5. Must not be greater than 60.'
example: 17
delete:
summary: 'Delete a webhook.'
operationId: deleteAWebhook
description: ''
parameters: []
responses: { }
tags:
- Webhooks
parameters:
-
in: path
name: id
description: 'The ID of the webhook.'
example: architecto
required: true
schema:
type: string
'/api/v1/tallcms/webhooks/{webhook}/test':
post:
summary: 'Send a test webhook.'
operationId: sendATestWebhook
description: ''
parameters: []
responses: { }
tags:
- Webhooks
parameters:
-
in: path
name: webhook
description: 'The webhook.'
example: architecto
required: true
schema:
type: string