{"openapi":"3.0.3","info":{"title":"BICWeb Landing Page CMS API","version":"1.0.0","description":"API phục vụ landing page BICWeb, xây dựng trên Payload CMS 3.\n\n### Hai lớp API\n- **`/api/v1/*`** — API đã được chuẩn hóa cho frontend: dữ liệu phẳng, ảnh đã resolve sẵn URL tuyệt đối, bọc trong `{ success, data, meta }`. **Nên dùng lớp này.**\n- **`/api/*`** — REST API gốc của Payload, đầy đủ khả năng truy vấn nhưng trả về đúng cấu trúc lưu trữ.\n\n### Xác thực\nToàn bộ endpoint đọc nội dung là công khai. Chỉ thao tác ghi trong admin cần đăng nhập (`POST /api/users/login`) — ngoại lệ là `POST /api/v1/leads` mở cho khách truy cập.\n\n### GraphQL\nPayload cũng expose GraphQL tại `https://cms.smedia24h.com/api/graphql` (playground: `/api/graphql-playground`).","contact":{"name":"BICWeb","email":"contact@bicweb.vn"}},"servers":[{"url":"https://cms.smedia24h.com","description":"Máy chủ hiện tại"},{"url":"http://localhost:3001","description":"Local development"}],"tags":[{"name":"Tổng hợp","description":"Endpoint gộp dữ liệu và tìm kiếm."},{"name":"Cấu hình & Bố cục","description":"Global: header, footer, cấu hình chung, nội dung trang chủ."},{"name":"Nội dung trang chủ","description":"Dịch vụ, giải pháp, cảm nhận, đối tác."},{"name":"Dự án","description":"Danh mục dự án đã triển khai."},{"name":"Tin tức","description":"Bài viết và chuyên mục."},{"name":"Khách hàng","description":"Tiếp nhận yêu cầu liên hệ."},{"name":"Hệ thống","description":"Health check."},{"name":"Payload REST (native)","description":"REST API tự sinh bởi Payload."}],"security":[],"paths":{"/api/v1/health":{"get":{"tags":["Hệ thống"],"summary":"Kiểm tra tình trạng dịch vụ","description":"Trả về trạng thái API và kết nối cơ sở dữ liệu.","responses":{"200":{"description":"Dịch vụ hoạt động bình thường.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Health"}},"required":["success","data"]}}}},"500":{"description":"Không kết nối được cơ sở dữ liệu.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Health"}},"/api/v1/landing":{"get":{"tags":["Tổng hợp"],"summary":"Toàn bộ dữ liệu landing page","description":"Gộp tất cả global và collection cần thiết trong một request duy nhất. Đây là endpoint được khuyến nghị cho lần render đầu tiên của trang chủ.","responses":{"200":{"description":"Dữ liệu landing page.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Landing"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Landing"}},"/api/v1/site-settings":{"get":{"tags":["Cấu hình & Bố cục"],"summary":"Cấu hình chung của site","description":"Logo, thông tin liên hệ, mạng xã hội và SEO mặc định.","responses":{"200":{"description":"Cấu hình chung của site","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SiteSettings"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1SiteSettings"}},"/api/v1/header":{"get":{"tags":["Cấu hình & Bố cục"],"summary":"Header & menu","description":"Menu chính (2 cấp), hotline CTA, ô tìm kiếm.","responses":{"200":{"description":"Header & menu","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Header"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Header"}},"/api/v1/home":{"get":{"tags":["Cấu hình & Bố cục"],"summary":"Nội dung trang chủ","description":"Tiêu đề, mô tả và ảnh của từng khối trên trang chủ.","responses":{"200":{"description":"Nội dung trang chủ","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/HomePage"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Home"}},"/api/v1/footer":{"get":{"tags":["Cấu hình & Bố cục"],"summary":"Footer","description":"Thông tin công ty, liên hệ, liên kết hữu ích, bản quyền.","responses":{"200":{"description":"Footer","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/Footer"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Footer"}},"/api/v1/quick-actions":{"get":{"tags":["Cấu hình & Bố cục"],"summary":"Thanh liên hệ nhanh","description":"Thanh điều hướng dưới cùng trên mobile và cột nút bên phải trên desktop.","responses":{"200":{"description":"Thanh liên hệ nhanh","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/QuickActions"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1QuickActions"}},"/api/v1/services":{"get":{"tags":["Nội dung trang chủ"],"summary":"Danh sách dịch vụ","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Danh sách dịch vụ","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Service"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Services"}},"/api/v1/solutions":{"get":{"tags":["Nội dung trang chủ"],"summary":"Danh sách giải pháp website","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Danh sách giải pháp website","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Solution"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Solutions"}},"/api/v1/testimonials":{"get":{"tags":["Nội dung trang chủ"],"summary":"Danh sách cảm nhận khách hàng","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Danh sách cảm nhận khách hàng","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Testimonial"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Testimonials"}},"/api/v1/partners":{"get":{"tags":["Nội dung trang chủ"],"summary":"Danh sách khách hàng tiêu biểu","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Danh sách khách hàng tiêu biểu","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Partner"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Partners"}},"/api/v1/projects":{"get":{"tags":["Dự án"],"summary":"Danh sách dự án","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."},{"name":"featured","in":"query","schema":{"type":"string","enum":["true"]},"description":"Chỉ lấy dự án nổi bật."},{"name":"industry","in":"query","schema":{"type":"string"},"description":"Lọc theo slug của nhóm giải pháp."}],"responses":{"200":{"description":"Danh sách dự án","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Projects"}},"/api/v1/projects/{slug}":{"get":{"tags":["Dự án"],"summary":"Chi tiết dự án theo slug","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug của dự án, ví dụ: tong-cong-ty-may-10."}],"responses":{"200":{"description":"Chi tiết dự án.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/ProjectDetail"}},"required":["success","data"]}}}},"404":{"description":"Không tìm thấy dự án.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1ProjectsBySlug"}},"/api/v1/posts":{"get":{"tags":["Tin tức"],"summary":"Danh sách bài viết đã xuất bản","parameters":[{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."},{"name":"category","in":"query","schema":{"type":"string"},"description":"Lọc theo slug chuyên mục."},{"name":"search","in":"query","schema":{"type":"string"},"description":"Tìm trong tiêu đề và mô tả ngắn."},{"name":"featured","in":"query","schema":{"type":"string","enum":["true"]},"description":"Chỉ lấy bài nổi bật."}],"responses":{"200":{"description":"Danh sách bài viết đã xuất bản","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"}},"meta":{"$ref":"#/components/schemas/PaginationMeta"}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Posts"}},"/api/v1/posts/{slug}":{"get":{"tags":["Tin tức"],"summary":"Chi tiết bài viết theo slug","description":"Kèm tối đa 3 bài liên quan cùng chuyên mục.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Slug của bài viết."}],"responses":{"200":{"description":"Chi tiết bài viết.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/PostDetail"}},"required":["success","data"]}}}},"404":{"description":"Không tìm thấy bài viết.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1PostsBySlug"}},"/api/v1/categories":{"get":{"tags":["Tin tức"],"summary":"Danh sách chuyên mục","responses":{"200":{"description":"Danh sách chuyên mục.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"type":"array","items":{"$ref":"#/components/schemas/Category"}}},"required":["success","data"]}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Categories"}},"/api/v1/search":{"get":{"tags":["Tổng hợp"],"summary":"Tìm kiếm toàn site","description":"Tìm đồng thời trong bài viết, dự án và giải pháp.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2},"description":"Từ khóa, tối thiểu 2 ký tự."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":20,"default":5},"description":"Số kết quả tối đa cho mỗi nhóm."}],"responses":{"200":{"description":"Kết quả tìm kiếm.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/SearchResult"}},"required":["success","data"]}}}},"400":{"description":"Thiếu hoặc sai tham số q.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getV1Search"}},"/api/v1/leads":{"post":{"tags":["Khách hàng"],"summary":"Gửi yêu cầu liên hệ / gọi lại","description":"Endpoint công khai cho form \"Yêu cầu gọi lại\". Giới hạn 5 lần / 10 phút cho mỗi địa chỉ IP. Trường `website` là honeypot: nếu có giá trị, request được chấp nhận nhưng không lưu.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LeadInput"},"example":{"name":"Nguyễn Văn A","phone":"0904863663","email":"a.nguyen@example.com","message":"Tôi cần báo giá website bán hàng.","source":"callback-form"}}}},"responses":{"201":{"description":"Đã ghi nhận yêu cầu.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","enum":[true]},"data":{"$ref":"#/components/schemas/LeadCreated"}},"required":["success","data"]}}}},"400":{"description":"Dữ liệu không hợp lệ.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Gửi quá nhiều yêu cầu.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"500":{"description":"Lỗi hệ thống.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postV1Leads"}},"/api/media":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"media\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getMedia"}},"/api/media/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"media\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getMediaById"}},"/api/categories":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"categories\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getCategories"}},"/api/categories/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"categories\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getCategoriesById"}},"/api/posts":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"posts\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getPosts"}},"/api/posts/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"posts\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getPostsById"}},"/api/services":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"services\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getServices"}},"/api/services/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"services\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getServicesById"}},"/api/solutions":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"solutions\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getSolutions"}},"/api/solutions/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"solutions\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getSolutionsById"}},"/api/projects":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"projects\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getProjects"}},"/api/projects/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"projects\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getProjectsById"}},"/api/testimonials":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"testimonials\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getTestimonials"}},"/api/testimonials/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"testimonials\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getTestimonialsById"}},"/api/partners":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"partners\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getPartners"}},"/api/partners/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"partners\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getPartnersById"}},"/api/leads":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"leads\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getLeads"}},"/api/leads/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"leads\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getLeadsById"}},"/api/payload-kv":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"payload-kv\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getPayloadKv"}},"/api/payload-kv/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"payload-kv\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getPayloadKvById"}},"/api/payload-locked-documents":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"payload-locked-documents\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getPayloadLockedDocuments"}},"/api/payload-locked-documents/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"payload-locked-documents\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getPayloadLockedDocumentsById"}},"/api/payload-preferences":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"payload-preferences\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getPayloadPreferences"}},"/api/payload-preferences/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"payload-preferences\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getPayloadPreferencesById"}},"/api/payload-migrations":{"get":{"tags":["Payload REST (native)"],"summary":"Truy vấn collection \"payload-migrations\"","description":"REST API gốc của Payload, hỗ trợ đầy đủ `where`, `sort`, `depth`, `page`, `limit`. Xem cú pháp query tại https://payloadcms.com/docs/queries/overview","parameters":[{"name":"where","in":"query","schema":{"type":"string"},"description":"Bộ lọc dạng qs, ví dụ where[slug][equals]=abc"},{"name":"sort","in":"query","schema":{"type":"string"}},{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1},"description":"Trang hiện tại."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"description":"Số bản ghi mỗi trang (tối đa 100)."}],"responses":{"200":{"description":"Kết quả phân trang theo định dạng gốc của Payload.","content":{"application/json":{"schema":{"type":"object","properties":{"docs":{"type":"array","items":{"type":"object","additionalProperties":true}},"totalDocs":{"type":"integer"},"page":{"type":"integer"},"totalPages":{"type":"integer"}}}}}}},"operationId":"getPayloadMigrations"}},"/api/payload-migrations/{id}":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy một bản ghi \"payload-migrations\" theo ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Bản ghi.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"description":"Không tìm thấy.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"getPayloadMigrationsById"}},"/api/globals/site-settings":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy global \"site-settings\"","parameters":[{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}}],"responses":{"200":{"description":"Global.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"operationId":"getGlobalsSiteSettings"}},"/api/globals/header":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy global \"header\"","parameters":[{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}}],"responses":{"200":{"description":"Global.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"operationId":"getGlobalsHeader"}},"/api/globals/home-page":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy global \"home-page\"","parameters":[{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}}],"responses":{"200":{"description":"Global.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"operationId":"getGlobalsHomePage"}},"/api/globals/footer":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy global \"footer\"","parameters":[{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}}],"responses":{"200":{"description":"Global.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"operationId":"getGlobalsFooter"}},"/api/globals/quick-actions":{"get":{"tags":["Payload REST (native)"],"summary":"Lấy global \"quick-actions\"","parameters":[{"name":"depth","in":"query","schema":{"type":"integer","minimum":0,"maximum":10}}],"responses":{"200":{"description":"Global.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}},"operationId":"getGlobalsQuickActions"}},"/api/users/login":{"post":{"tags":["Payload REST (native)"],"summary":"Đăng nhập tài khoản CMS","description":"Trả về JWT dùng cho header `Authorization: users API-Key <token>` hoặc cookie phiên.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["email","password"],"properties":{"email":{"type":"string","format":"email"},"password":{"type":"string","format":"password"}}}}}},"responses":{"200":{"description":"Đăng nhập thành công.","content":{"application/json":{"schema":{"type":"object","properties":{"token":{"type":"string"},"exp":{"type":"integer"},"user":{"type":"object","additionalProperties":true}}}}}},"401":{"description":"Sai thông tin đăng nhập.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"operationId":"postUsersLogin"}}},"components":{"schemas":{"Image":{"type":"object","nullable":true,"description":"Ảnh đã được làm phẳng từ collection media.","properties":{"url":{"type":"string","format":"uri","example":"http://localhost:3001/media/banner.webp"},"alt":{"type":"string","example":"Banner thiết kế website"},"width":{"type":"integer","nullable":true,"example":1920},"height":{"type":"integer","nullable":true,"example":695},"sizes":{"type":"object","additionalProperties":{"type":"string","format":"uri"},"example":{"thumbnail":"http://localhost:3001/media/banner-320x180.webp","card":"http://localhost:3001/media/banner-640x360.webp"}}},"required":["url","alt"]},"PaginationMeta":{"type":"object","properties":{"page":{"type":"integer","example":1},"limit":{"type":"integer","example":12},"totalDocs":{"type":"integer","example":24},"totalPages":{"type":"integer","example":2},"hasNextPage":{"type":"boolean","example":true},"hasPrevPage":{"type":"boolean","example":false}},"required":["page","limit","totalDocs","totalPages","hasNextPage","hasPrevPage"]},"Error":{"type":"object","properties":{"success":{"type":"boolean","enum":[false]},"error":{"type":"object","properties":{"code":{"type":"string","enum":["BAD_REQUEST","NOT_FOUND","RATE_LIMITED","INTERNAL_ERROR"],"example":"NOT_FOUND"},"message":{"type":"string","example":"Không tìm thấy tài nguyên."},"details":{"type":"object","additionalProperties":true,"description":"Lỗi theo từng trường (chỉ có ở lỗi validate)."}},"required":["code","message"]}},"required":["success","error"]},"Health":{"type":"object","properties":{"status":{"type":"string","example":"ok"},"database":{"type":"string","example":"connected"},"postCount":{"type":"integer","example":3},"timestamp":{"type":"string","format":"date-time"}}},"Service":{"type":"object","properties":{"id":{"type":"string","example":"66f0c2a1f1b2c3d4e5f60011"},"title":{"type":"string","example":"Thiết kế & Quản trị website"},"slug":{"type":"string","nullable":true,"example":"thiet-ke-quan-tri-website"},"description":{"type":"string","nullable":true},"href":{"type":"string","example":"#dich-vu"},"icon":{"$ref":"#/components/schemas/Image"},"order":{"type":"integer","example":1}},"required":["id","title","href","order"]},"Solution":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","example":"Thương mại điện tử - Bán hàng"},"slug":{"type":"string","nullable":true,"example":"thuong-mai-dien-tu-ban-hang"},"description":{"type":"string","nullable":true},"href":{"type":"string","example":"#"},"icon":{"$ref":"#/components/schemas/Image"},"order":{"type":"integer"}},"required":["id","title","href","order"]},"Project":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","example":"Tổng công ty May 10"},"slug":{"type":"string","nullable":true,"example":"tong-cong-ty-may-10"},"website":{"type":"string","example":"garco10.com.vn"},"url":{"type":"string","nullable":true,"example":"https://garco10.com.vn"},"summary":{"type":"string","nullable":true},"mockup":{"$ref":"#/components/schemas/Image"},"logo":{"$ref":"#/components/schemas/Image"},"industry":{"$ref":"#/components/schemas/Solution"},"technologies":{"type":"array","items":{"type":"string"},"example":["Next.js","Payload CMS"]},"launchedAt":{"type":"string","format":"date-time","nullable":true},"isFeatured":{"type":"boolean"},"order":{"type":"integer"}},"required":["id","title","website"]},"ProjectDetail":{"allOf":[{"$ref":"#/components/schemas/Project"},{"type":"object","properties":{"content":{"type":"object","nullable":true,"additionalProperties":true,"description":"Nội dung Lexical rich text (JSON)."},"seo":{"$ref":"#/components/schemas/Seo"}}}]},"Testimonial":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","example":"Mr. Bùi Xuân Bách"},"position":{"type":"string","example":"Giám đốc TT CNTT - Tập đoàn Sơn Hà"},"company":{"type":"string","nullable":true},"quote":{"type":"string"},"portrait":{"$ref":"#/components/schemas/Image"},"logo":{"$ref":"#/components/schemas/Image"},"rating":{"type":"integer","nullable":true,"minimum":1,"maximum":5},"projectId":{"type":"string","nullable":true},"order":{"type":"integer"}},"required":["id","name","position","quote"]},"Partner":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string","example":"Cảng Hải Phòng"},"logo":{"$ref":"#/components/schemas/Image"},"website":{"type":"string","nullable":true},"order":{"type":"integer"}},"required":["id","name"]},"Category":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","example":"Tin thiết kế website"},"slug":{"type":"string","nullable":true,"example":"tin-thiet-ke-website"},"description":{"type":"string","nullable":true},"order":{"type":"integer"}},"required":["id","title"]},"Seo":{"type":"object","nullable":true,"properties":{"title":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"keywords":{"type":"string","nullable":true},"ogImage":{"$ref":"#/components/schemas/Image"},"noIndex":{"type":"boolean","nullable":true}}},"PostSummary":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string","example":"Go-live website Grand Plaza Hotel"},"slug":{"type":"string","nullable":true},"excerpt":{"type":"string"},"coverImage":{"$ref":"#/components/schemas/Image"},"category":{"$ref":"#/components/schemas/Category"},"tags":{"type":"array","items":{"type":"string"}},"publishedAt":{"type":"string","format":"date-time","nullable":true},"readingMinutes":{"type":"integer","nullable":true},"isFeatured":{"type":"boolean"}},"required":["id","title","excerpt"]},"PostDetail":{"allOf":[{"$ref":"#/components/schemas/PostSummary"},{"type":"object","properties":{"content":{"type":"object","nullable":true,"additionalProperties":true},"author":{"type":"object","nullable":true,"properties":{"id":{"type":"string"},"name":{"type":"string"}}},"seo":{"$ref":"#/components/schemas/Seo"},"related":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"}}}}]},"NavItem":{"type":"object","properties":{"label":{"type":"string","example":"Dịch vụ"},"href":{"type":"string","example":"#dich-vu"},"openInNewTab":{"type":"boolean"},"children":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"href":{"type":"string"},"openInNewTab":{"type":"boolean"}}}}},"required":["label","href"]},"Header":{"type":"object","properties":{"navigation":{"type":"array","items":{"$ref":"#/components/schemas/NavItem"}},"ctaPhone":{"type":"string","nullable":true,"example":"090.486.3663"},"showSearch":{"type":"boolean"},"searchPlaceholder":{"type":"string","nullable":true}}},"SiteSettings":{"type":"object","properties":{"siteName":{"type":"string","example":"BICWeb"},"tagline":{"type":"string","nullable":true},"logo":{"$ref":"#/components/schemas/Image"},"favicon":{"$ref":"#/components/schemas/Image"},"contact":{"type":"object","properties":{"hotlines":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string","nullable":true},"number":{"type":"string","example":"090.486.3663"},"isPrimary":{"type":"boolean"}}}},"email":{"type":"string","nullable":true,"example":"contact@bicweb.vn"},"address":{"type":"string","nullable":true},"zaloUrl":{"type":"string","nullable":true},"mapEmbedUrl":{"type":"string","nullable":true},"socials":{"type":"array","items":{"type":"object","properties":{"platform":{"type":"string","enum":["facebook","youtube","linkedin","tiktok","zalo","x"]},"url":{"type":"string"}}}}}},"seo":{"type":"object","properties":{"defaultTitle":{"type":"string","nullable":true},"defaultDescription":{"type":"string","nullable":true},"defaultOgImage":{"$ref":"#/components/schemas/Image"},"googleSiteVerification":{"type":"string","nullable":true},"gtmId":{"type":"string","nullable":true}}}}},"Footer":{"type":"object","properties":{"companyLabel":{"type":"string","nullable":true,"example":"Công ty TNHH Đầu tư"},"companyName":{"type":"string","nullable":true,"example":"Bách Hợp"},"badgeImage":{"$ref":"#/components/schemas/Image"},"contactTitle":{"type":"string","nullable":true},"contactItems":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["address","phone","email","other"]},"label":{"type":"string","example":"Địa chỉ"},"value":{"type":"string"},"href":{"type":"string","nullable":true}}}},"linksTitle":{"type":"string","nullable":true},"links":{"type":"array","items":{"type":"object","properties":{"label":{"type":"string"},"href":{"type":"string"},"openInNewTab":{"type":"boolean"}}}},"copyright":{"type":"string","nullable":true},"certificationImage":{"$ref":"#/components/schemas/Image"}}},"QuickActionItem":{"type":"object","properties":{"label":{"type":"string","example":"Zalo"},"href":{"type":"string","example":"https://zalo.me/0904863663"},"openInNewTab":{"type":"boolean"},"icon":{"$ref":"#/components/schemas/Image"}}},"QuickActions":{"type":"object","properties":{"mobileItems":{"type":"array","items":{"$ref":"#/components/schemas/QuickActionItem"}},"desktopItems":{"type":"array","items":{"$ref":"#/components/schemas/QuickActionItem"}}}},"SectionHeading":{"type":"object","nullable":true,"properties":{"heading":{"type":"string","nullable":true},"headingHighlight":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"ctaLabel":{"type":"string","nullable":true},"ctaHref":{"type":"string","nullable":true}}},"HomePage":{"type":"object","properties":{"hero":{"type":"object","properties":{"eyebrow":{"type":"string","nullable":true,"example":"Thiết kế website"},"heading":{"type":"string","nullable":true,"example":"Responsive"},"highlights":{"type":"array","items":{"type":"string"}},"ctaLabel":{"type":"string","nullable":true},"ctaHref":{"type":"string","nullable":true},"background":{"$ref":"#/components/schemas/Image"},"layers":{"type":"array","items":{"type":"object","properties":{"image":{"$ref":"#/components/schemas/Image"},"alt":{"type":"string","nullable":true}}}}}},"intro":{"type":"object","properties":{"heading":{"type":"string","nullable":true},"headingHighlight":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"image":{"$ref":"#/components/schemas/Image"},"stats":{"type":"array","items":{"type":"object","properties":{"value":{"type":"string","example":"99%"},"label":{"type":"string","example":"Khách hàng hài lòng"},"icon":{"$ref":"#/components/schemas/Image"}}}}}},"solutionsSection":{"$ref":"#/components/schemas/SectionHeading"},"projectsSection":{"$ref":"#/components/schemas/SectionHeading"},"testimonialsSection":{"$ref":"#/components/schemas/SectionHeading"},"callbackSection":{"type":"object","nullable":true,"properties":{"eyebrow":{"type":"string","nullable":true},"heading":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"submitLabel":{"type":"string","nullable":true},"successMessage":{"type":"string","nullable":true}}},"newsSection":{"type":"object","nullable":true,"properties":{"heading":{"type":"string","nullable":true},"description":{"type":"string","nullable":true},"ctaLabel":{"type":"string","nullable":true},"ctaHref":{"type":"string","nullable":true},"limit":{"type":"integer","nullable":true,"example":3}}},"seo":{"$ref":"#/components/schemas/Seo"}}},"Landing":{"type":"object","description":"Toàn bộ dữ liệu cần để render landing page.","properties":{"siteSettings":{"$ref":"#/components/schemas/SiteSettings"},"header":{"$ref":"#/components/schemas/Header"},"home":{"$ref":"#/components/schemas/HomePage"},"footer":{"$ref":"#/components/schemas/Footer"},"quickActions":{"$ref":"#/components/schemas/QuickActions"},"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}},"solutions":{"type":"array","items":{"$ref":"#/components/schemas/Solution"}},"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"testimonials":{"type":"array","items":{"$ref":"#/components/schemas/Testimonial"}},"partners":{"type":"array","items":{"$ref":"#/components/schemas/Partner"}},"posts":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"}}}},"SearchResult":{"type":"object","properties":{"query":{"type":"string","example":"website"},"totalResults":{"type":"integer","example":7},"posts":{"type":"array","items":{"$ref":"#/components/schemas/PostSummary"}},"projects":{"type":"array","items":{"$ref":"#/components/schemas/Project"}},"solutions":{"type":"array","items":{"$ref":"#/components/schemas/Solution"}}}},"LeadInput":{"type":"object","required":["name","phone"],"properties":{"name":{"type":"string","maxLength":120,"example":"Nguyễn Văn A"},"phone":{"type":"string","example":"0904863663","description":"Định dạng Việt Nam: 0xxxxxxxxx hoặc +84xxxxxxxxx."},"email":{"type":"string","format":"email","example":"a.nguyen@example.com"},"company":{"type":"string","maxLength":160},"message":{"type":"string","maxLength":2000,"example":"Tôi cần báo giá website bán hàng."},"interestedIn":{"type":"string","description":"ID của giải pháp quan tâm."},"source":{"type":"string","enum":["callback-form","contact-form","quote-form","other"],"default":"callback-form"},"pageUrl":{"type":"string","example":"https://bicweb.vn/#lien-he"},"website":{"type":"string","description":"Honeypot chống bot — luôn để trống ở form thật."}}},"LeadCreated":{"type":"object","properties":{"id":{"type":"string","nullable":true},"status":{"type":"string","example":"new"}}}},"securitySchemes":{"payloadCookie":{"type":"apiKey","in":"cookie","name":"payload-token","description":"Cookie phiên nhận được sau khi gọi POST /api/users/login."},"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}}}}