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