Tra cứu API v2 — Cửa hàng (Front)

🌐 Ngôn ngữ: 🇻🇳 Tiếng Việt (hiện tại) · 🇬🇧 English · 🇯🇵 日本語

Tra cứu API v2 — Cửa hàng (Front)

Trang này được sinh từ openapi.json bằng tools/openapi-to-markdown.php — không sửa tay.

Mọi endpoint dưới api/v2/front — cửa hàng, tài khoản khách hàng, giỏ hàng và đặt hàng — kèm ai được gọi, tham số, ví dụ gọi và kết quả trả về.

Mới dùng API? Bắt đầu với Bắt đầu nhanh. Quy tắc chung cho mọi endpoint (định dạng phản hồi, phân trang, fields, include, 304) nằm ở Quy ước; từng mã lỗi được giải thích ở Xử lý sự cố.

Mục lục

Front · Thông tin site

Những gì cửa hàng cung cấp: phiên bản API, phiên bản các gói, ngôn ngữ và tiền tệ.

Mô tả API — GET /api/v2/front/meta

Trả về phiên bản API, các gói GP247 đã cài (chỉ tên), các ngôn ngữ đang bật, ngôn ngữ mặc định và cửa hàng phục vụ tên miền đang gọi. Công khai.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ front 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/meta" \
  -H "Accept: application/json"

Phản hồi 200 — data: Meta

{
    "data": {
        "api_version": "2",
        "packages": [
            "gp247/core",
            "gp247/front",
            "gp247/shop"
        ],
        "languages": [
            "en",
            "vi"
        ],
        "locale": "en",
        "store_id": "1"
    }
}

Front · Danh mục sản phẩm

Sản phẩm, danh mục và thương hiệu mà cửa hàng của tên miền đang gọi hiển thị.

Lấy một thương hiệu — GET /api/v2/front/brand/detail/{id}

Trả về một thương hiệu đang bật. Công khai; thương hiệu đã tắt trả 404.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/brand/detail/123" \
  -H "Accept: application/json"

Phản hồi 200 — data: Brand

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "name": "Acme",
        "alias": "acme",
        "image": "/data/brand/acme.png",
        "url": "https://acme.example.com",
        "sort": 0,
        "status": 1,
        "store_id": "1",
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00"
    }
}

Lỗi: not_found · validation_failed

Danh sách thương hiệu — GET /api/v2/front/brand/list

Trả về các thương hiệu đang bật, theo từng trang. Sắp xếp theo sort hoặc name, tìm theo tên. Công khai.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
page[number] query integer Trang cần đọc, bắt đầu từ 1.
page[size] query integer Số dòng mỗi trang (mặc định 20, tối đa 100).
filter query object filter[<name>]=value — tên được phép theo từng loại dữ liệu, xem api-introduction mục 8; tên không có = 422
sort query string <name> tăng dần, -<name> giảm dần; tên không có = 422
q query string Từ khoá tìm kiếm
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/brand/list" \
  -H "Accept: application/json"

Phản hồi 200 — data: danh sách Brand — kèm meta (phân trang) và links.

{
    "meta": {
        "current_page": 1,
        "per_page": 20,
        "total": 135,
        "last_page": 7,
        "next_after": "eyJ0IjoiMjAyNi0xMC0zMSAwODowMDowMCIsImsiOiI5ZjBjIn0",
        "has_more": true,
        "sync_until": "2026-10-31T08:00:00+07:00"
    },
    "links": {
        "first": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=1&page%5Bsize%5D=20",
        "last": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=7&page%5Bsize%5D=20",
        "prev": null,
        "next": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=2&page%5Bsize%5D=20"
    },
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "name": "Acme",
            "alias": "acme",
            "image": "/data/brand/acme.png",
            "url": "https://acme.example.com",
            "sort": 0,
            "status": 1,
            "store_id": "1",
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00"
        }
    ]
}

Lỗi: validation_failed

Lấy một danh mục — GET /api/v2/front/category/detail/{id}

Trả về một danh mục đang hiển thị trên cửa hàng. Công khai.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/category/detail/123" \
  -H "Accept: application/json"

Phản hồi 200 — data: Category

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "alias": "t-shirts",
        "name": "T-shirts",
        "keyword": "t-shirt",
        "description": "All our T-shirts.",
        "image": "/data/category/tshirts.jpg",
        "parent": null,
        "top": 1,
        "sort": 0,
        "status": 1,
        "store_id": "1",
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00"
    }
}

Lỗi: not_found · validation_failed

Danh sách danh mục — GET /api/v2/front/category/list

Trả về các danh mục cửa hàng hiển thị, theo từng trang, bằng ngôn ngữ chọn qua ?lang=. Lọc theo danh mục cha hoặc top, sắp xếp theo sort hoặc created_at, tìm theo tên. Công khai.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
page[number] query integer Trang cần đọc, bắt đầu từ 1.
page[size] query integer Số dòng mỗi trang (mặc định 20, tối đa 100).
filter query object filter[<name>]=value — tên được phép theo từng loại dữ liệu, xem api-introduction mục 8; tên không có = 422
sort query string <name> tăng dần, -<name> giảm dần; tên không có = 422
q query string Từ khoá tìm kiếm
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/category/list" \
  -H "Accept: application/json"

Phản hồi 200 — data: danh sách Category — kèm meta (phân trang) và links.

{
    "meta": {
        "current_page": 1,
        "per_page": 20,
        "total": 135,
        "last_page": 7,
        "next_after": "eyJ0IjoiMjAyNi0xMC0zMSAwODowMDowMCIsImsiOiI5ZjBjIn0",
        "has_more": true,
        "sync_until": "2026-10-31T08:00:00+07:00"
    },
    "links": {
        "first": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=1&page%5Bsize%5D=20",
        "last": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=7&page%5Bsize%5D=20",
        "prev": null,
        "next": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=2&page%5Bsize%5D=20"
    },
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "alias": "t-shirts",
            "name": "T-shirts",
            "keyword": "t-shirt",
            "description": "All our T-shirts.",
            "image": "/data/category/tshirts.jpg",
            "parent": null,
            "top": 1,
            "sort": 0,
            "status": 1,
            "store_id": "1",
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00"
        }
    ]
}

Lỗi: validation_failed

Lấy một sản phẩm — GET /api/v2/front/product/detail/{id}

Trả về một sản phẩm đang bán trên cửa hàng kèm nội dung HTML, ảnh phụ, lựa chọn thuộc tính và tình trạng còn hàng. Công khai; sản phẩm bị ẩn trả 404.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.
include query string Các bản ghi liên quan cần lấy kèm, cách nhau bằng dấu phẩy (một cấp, tối đa 3): images, brand (chỉ thương hiệu đang bật), categories (chỉ danh mục đang hiển thị). Giá trị khác = 422. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/product/detail/123" \
  -H "Accept: application/json"

Phản hồi 200 — data: Product

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "sku": "TSHIRT-RED-M",
        "alias": "red-t-shirt",
        "name": "Red T-shirt",
        "keyword": "t-shirt, red",
        "description": "Soft cotton T-shirt.",
        "content": "<p>Soft cotton T-shirt.</p>",
        "image": "/data/product/tshirt.jpg",
        "images": [
            "/data/product/tshirt-2.jpg"
        ],
        "price": 200000,
        "price_final": 180000,
        "tax_id": "auto",
        "kind": 0,
        "product_type": "physical",
        "brand_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "category_ids": [
            "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f"
        ],
        "minimum": 1,
        "weight": 0.3,
        "weight_class": "kg",
        "length": 30,
        "width": 20,
        "height": 2,
        "length_class": "cm",
        "date_available": "2026-11-01",
        "store_id": "1",
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00",
        "image_sizes": {
            "original": "https://shop.example.com/data/product/tshirt.jpg",
            "thumb": "https://shop.example.com/data/product/thumb/tshirt.jpg"
        },
        "stock_status": "in_stock",
        "attributes": [
            {
                "group_id": "1",
                "name": "Color",
                "required": true,
                "options": [
                    {
                        "value": "Red",
                        "add_price": 0
                    }
                ]
            }
        ],
        "cost": 120000,
        "stock": 15,
        "sold": 42,
        "status": 1,
        "approve": 1,
        "supplier_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "view": 310
    }
}

Lỗi: not_found · validation_failed

Danh sách sản phẩm — GET /api/v2/front/product/list

Trả về các sản phẩm mà cửa hàng của tên miền đang gọi đang bán, theo từng trang, kèm giá bán (price_final), lựa chọn thuộc tính và tình trạng còn hàng (không bao giờ kèm số lượng tồn kho). Giá là null khi cửa hàng ẩn giá. Bộ lọc: category_id, brand_id, kind, product_type, price_min, price_max; sắp xếp theo price, created_at, sort hoặc sku; tìm theo SKU hoặc tên; fields[product] và include=images,brand,categories. Công khai và lưu tạm được.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
page[number] query integer Trang cần đọc, bắt đầu từ 1.
page[size] query integer Số dòng mỗi trang (mặc định 20, tối đa 100).
filter query object filter[<name>]=value — tên được phép theo từng loại dữ liệu, xem api-introduction mục 8; tên không có = 422
sort query string <name> tăng dần, -<name> giảm dần; tên không có = 422
q query string Từ khoá tìm kiếm
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.
include query string Các bản ghi liên quan cần lấy kèm, cách nhau bằng dấu phẩy (một cấp, tối đa 3): images, brand (chỉ thương hiệu đang bật), categories (chỉ danh mục đang hiển thị). Giá trị khác = 422. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/product/list" \
  -H "Accept: application/json"

Phản hồi 200 — data: danh sách Product — kèm meta (phân trang) và links.

{
    "meta": {
        "current_page": 1,
        "per_page": 20,
        "total": 135,
        "last_page": 7,
        "next_after": "eyJ0IjoiMjAyNi0xMC0zMSAwODowMDowMCIsImsiOiI5ZjBjIn0",
        "has_more": true,
        "sync_until": "2026-10-31T08:00:00+07:00"
    },
    "links": {
        "first": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=1&page%5Bsize%5D=20",
        "last": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=7&page%5Bsize%5D=20",
        "prev": null,
        "next": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=2&page%5Bsize%5D=20"
    },
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "sku": "TSHIRT-RED-M",
            "alias": "red-t-shirt",
            "name": "Red T-shirt",
            "keyword": "t-shirt, red",
            "description": "Soft cotton T-shirt.",
            "content": "<p>Soft cotton T-shirt.</p>",
            "image": "/data/product/tshirt.jpg",
            "images": [
                "/data/product/tshirt-2.jpg"
            ],
            "price": 200000,
            "price_final": 180000,
            "tax_id": "auto",
            "kind": 0,
            "product_type": "physical",
            "brand_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "category_ids": [
                "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f"
            ],
            "minimum": 1,
            "weight": 0.3,
            "weight_class": "kg",
            "length": 30,
            "width": 20,
            "height": 2,
            "length_class": "cm",
            "date_available": "2026-11-01",
            "store_id": "1",
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00",
            "image_sizes": {
                "original": "https://shop.example.com/data/product/tshirt.jpg",
                "thumb": "https://shop.example.com/data/product/thumb/tshirt.jpg"
            },
            "stock_status": "in_stock",
            "attributes": [
                {
                    "group_id": "1",
                    "name": "Color",
                    "required": true,
                    "options": [
                        {
                            "value": "Red",
                            "add_price": 0
                        }
                    ]
                }
            ],
            "cost": 120000,
            "stock": 15,
            "sold": 42,
            "status": 1,
            "approve": 1,
            "supplier_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "view": 310
        }
    ]
}

Lỗi: validation_failed

Front · Nội dung

Banner và trang nội dung của cửa hàng.

Lấy một banner — GET /api/v2/front/banner/detail/{id}

Trả về một banner đang hiển thị trên cửa hàng của tên miền đang gọi. Công khai; banner bị ẩn trả 404.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ front 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/banner/detail/123" \
  -H "Accept: application/json"

Phản hồi 200 — data: Banner

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "name": "Autumn sale",
        "image": "/data/banner/autumn.jpg",
        "url": "https://shop.example.com/sale",
        "target": "_self",
        "html": null,
        "type": "banner",
        "sort": 0,
        "status": 1,
        "store_id": "1",
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00",
        "click": 57
    }
}

Lỗi: not_found

Danh sách banner — GET /api/v2/front/banner/list

Trả về các banner mà cửa hàng của tên miền đang gọi hiển thị, theo từng trang. Công khai. Lọc theo type, sắp xếp theo sort hoặc created_at, tìm theo tên.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ front 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
page[number] query integer Trang cần đọc, bắt đầu từ 1.
page[size] query integer Số dòng mỗi trang (mặc định 20, tối đa 100).
filter query object filter[<name>]=value — tên được phép theo từng loại dữ liệu, xem api-introduction mục 8; tên không có = 422
sort query string <name> tăng dần, -<name> giảm dần; tên không có = 422
q query string Từ khoá tìm kiếm
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/banner/list" \
  -H "Accept: application/json"

Phản hồi 200 — data: danh sách Banner — kèm meta (phân trang) và links.

{
    "meta": {
        "current_page": 1,
        "per_page": 20,
        "total": 135,
        "last_page": 7,
        "next_after": "eyJ0IjoiMjAyNi0xMC0zMSAwODowMDowMCIsImsiOiI5ZjBjIn0",
        "has_more": true,
        "sync_until": "2026-10-31T08:00:00+07:00"
    },
    "links": {
        "first": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=1&page%5Bsize%5D=20",
        "last": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=7&page%5Bsize%5D=20",
        "prev": null,
        "next": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=2&page%5Bsize%5D=20"
    },
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "name": "Autumn sale",
            "image": "/data/banner/autumn.jpg",
            "url": "https://shop.example.com/sale",
            "target": "_self",
            "html": null,
            "type": "banner",
            "sort": 0,
            "status": 1,
            "store_id": "1",
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00",
            "click": 57
        }
    ]
}

Lỗi: validation_failed

Lấy một trang CMS — GET /api/v2/front/page/detail/{id}

Trả về một trang CMS đang hiển thị kèm nội dung HTML, bằng ngôn ngữ chọn qua ?lang=. Công khai.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ front 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/page/detail/123" \
  -H "Accept: application/json"

Phản hồi 200 — data: Page

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "alias": "about-us",
        "image": null,
        "name": "About us",
        "keyword": "about",
        "description": "Who we are.",
        "content": "<p>Who we are.</p>",
        "status": 1,
        "store_id": "1",
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00"
    }
}

Lỗi: not_found

Danh sách trang CMS — GET /api/v2/front/page/list

Trả về các trang CMS đang hiển thị trên cửa hàng, theo từng trang, không kèm nội dung HTML. Văn bản bằng ngôn ngữ chọn qua ?lang=. Công khai.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ front 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
page[number] query integer Trang cần đọc, bắt đầu từ 1.
page[size] query integer Số dòng mỗi trang (mặc định 20, tối đa 100).
filter query object filter[<name>]=value — tên được phép theo từng loại dữ liệu, xem api-introduction mục 8; tên không có = 422
sort query string <name> tăng dần, -<name> giảm dần; tên không có = 422
q query string Từ khoá tìm kiếm
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/page/list" \
  -H "Accept: application/json"

Phản hồi 200 — data: danh sách Page — kèm meta (phân trang) và links.

{
    "meta": {
        "current_page": 1,
        "per_page": 20,
        "total": 135,
        "last_page": 7,
        "next_after": "eyJ0IjoiMjAyNi0xMC0zMSAwODowMDowMCIsImsiOiI5ZjBjIn0",
        "has_more": true,
        "sync_until": "2026-10-31T08:00:00+07:00"
    },
    "links": {
        "first": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=1&page%5Bsize%5D=20",
        "last": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=7&page%5Bsize%5D=20",
        "prev": null,
        "next": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=2&page%5Bsize%5D=20"
    },
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "alias": "about-us",
            "image": null,
            "name": "About us",
            "keyword": "about",
            "description": "Who we are.",
            "content": "<p>Who we are.</p>",
            "status": 1,
            "store_id": "1",
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00"
        }
    ]
}

Lỗi: validation_failed

Front · Đăng nhập & phiên

Đăng nhập khách hàng, làm mới token, đăng nhập hai bước và danh sách thiết bị đang đăng nhập.

Khách hàng đăng nhập — POST /api/v2/front/login

Đăng nhập khách hàng đang hoạt động bằng e-mail và mật khẩu, trả về bearer token (kèm with_refresh=true thì có thêm refresh token). Nếu ứng dụng gửi X-Cart-Token của giỏ khách vãng lai, giỏ đó được gộp vào tài khoản và phản hồi báo cart_merge. Khi plugin yêu cầu bước thứ hai thì trả 401 challenge_required. Số lần đăng nhập sai bị giới hạn.

Đăng nhập Không cần — công khai.
Có từ shop 3.3.0

Nội dung yêu cầu: CustomerLoginV2

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/login" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"email":"","password":"","remember_me":false,"with_refresh":false,"device_name":""}'

Phản hồi 200 — data: SessionToken

{
    "data": {
        "access_token": "12|XyZ...plain-token",
        "token_type": "Bearer",
        "scopes": [
            "user"
        ],
        "expires_at": "2026-11-03 09:00:00",
        "expires_in": 3600,
        "session_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "refresh_token": "a1b2c3...64chars",
        "refresh_expires_at": "2026-12-03 08:00:00",
        "cart_merge": {
            "merged": 2,
            "dropped": 0
        }
    }
}

Lỗi: validation_failed · unauthenticated · too_many_attempts · challenge_required · challenge_invalid

Khách hàng đăng xuất — POST /api/v2/front/logout

Đăng xuất phiên hiện tại (cả access token và refresh token).

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.3.0

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/logout" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontLogoutResult

{
    "data": {
        "revoked": true
    }
}

Hoàn tất đăng nhập MFA của khách hàng — POST /api/v2/front/login/challenge

Gửi ticket từ phản hồi challenge_required kèm các trường của plugin; khi thành công thì trả lời như login (kể cả gộp giỏ hàng khách vãng lai).

Đăng nhập Không cần — công khai.
Có từ shop 3.4.0

Nội dung yêu cầu: LoginChallengeAnswer

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/login/challenge" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"ticket":""}'

Phản hồi 200 — data: SessionToken

{
    "data": {
        "access_token": "12|XyZ...plain-token",
        "token_type": "Bearer",
        "scopes": [
            "user"
        ],
        "expires_at": "2026-11-03 09:00:00",
        "expires_in": 3600,
        "session_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "refresh_token": "a1b2c3...64chars",
        "refresh_expires_at": "2026-12-03 08:00:00",
        "cart_merge": {
            "merged": 2,
            "dropped": 0
        }
    }
}

Lỗi: validation_failed · challenge_invalid · too_many_attempts

Làm mới access token của khách hàng — POST /api/v2/front/refresh

Đổi một refresh token lấy cặp access + refresh token mới; mỗi refresh token chỉ dùng được một lần và gửi lại lần nữa sẽ đăng xuất phiên.

Đăng nhập Không cần — công khai.
Có từ shop 3.4.0

Nội dung yêu cầu: RefreshRequest

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/refresh" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"refresh_token":""}'

Phản hồi 200 — data: SessionToken

{
    "data": {
        "access_token": "12|XyZ...plain-token",
        "token_type": "Bearer",
        "scopes": [
            "user"
        ],
        "expires_at": "2026-11-03 09:00:00",
        "expires_in": 3600,
        "session_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "refresh_token": "a1b2c3...64chars",
        "refresh_expires_at": "2026-12-03 08:00:00",
        "cart_merge": {
            "merged": 2,
            "dropped": 0
        }
    }
}

Lỗi: validation_failed · not_found · refresh_token_invalid · refresh_token_reused · refresh_in_progress · unauthenticated

Danh sách phiên của tôi — GET /api/v2/front/member/sessions

Trả về các phiên API còn hiệu lực (thiết bị) của khách hàng đang đăng nhập, có đánh dấu phiên hiện tại. Không phân trang.

Đăng nhập Token của khách hàng (Bearer).
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.4.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/member/sessions" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: danh sách Session

{
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "name": "Pixel 8",
            "ip": "203.0.113.5",
            "created_at": "2026-10-31T08:00:00+07:00",
            "last_used_at": "2026-10-31T08:00:00+07:00",
            "refreshable": true,
            "refresh_expires_at": "2026-11-30T08:00:00+07:00",
            "current": true
        }
    ]
}

Đăng xuất một phiên của tôi — DELETE /api/v2/front/member/sessions/{id}

Đăng xuất một phiên của chính khách hàng. Id phiên của người khác trả 404.

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.4.0

Ví dụ yêu cầu

curl -X DELETE "https://shop.example.com/api/v2/front/member/sessions/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontMemberSessionsDeleteResult

{
    "data": {
        "revoked": true
    }
}

Lỗi: not_found

Front · Tài khoản khách hàng

Đăng ký, lấy lại mật khẩu, hồ sơ, sổ địa chỉ và xác minh email của khách hàng đang đăng nhập.

Khách hàng đang đăng nhập (cơ bản) — GET /api/v2/front/info

Trả về hồ sơ của khách hàng đang đăng nhập (không có trường cửa hàng hay xác minh). member/profile trả về cùng nội dung, thêm trạng thái xác minh và địa chỉ mặc định.

Đăng nhập Token của khách hàng (Bearer).
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/info" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: Customer

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "first_name": "An",
        "last_name": "Nguyen",
        "first_name_kana": null,
        "last_name_kana": null,
        "email": "an@example.com",
        "phone": "0901234567",
        "sex": 1,
        "birthday": "1990-05-20",
        "company": null,
        "country": "VN",
        "postcode": "700000",
        "city": "Ho Chi Minh City",
        "district": "District 1",
        "ward": "Ben Nghe",
        "address1": "1 Le Loi",
        "address2": null,
        "address3": null,
        "status": 1,
        "group": 1,
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00",
        "store_id": "1",
        "email_verified_at": "2026-10-01 08:00:00"
    }
}

Đăng ký và đăng nhập — POST /api/v2/front/register

Tạo tài khoản khách hàng theo quy tắc trường riêng của cửa hàng (và captcha khi được bật) rồi đăng nhập luôn; trả 201 kèm hồ sơ và dữ liệu token. Giỏ khách vãng lai gửi kèm X-Cart-Token sẽ được gộp. Giới hạn theo IP.

Đăng nhập Không cần — công khai.
Có từ shop 3.4.0

Nội dung yêu cầu: Register

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/register" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"","email":"","password":"","password_confirmation":"","with_refresh":false,"device_name":""}'

Phản hồi 201 — data: FrontRegisterResult

{
    "data": {
        "customer": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "first_name": "An",
            "last_name": "Nguyen",
            "first_name_kana": null,
            "last_name_kana": null,
            "email": "an@example.com",
            "phone": "0901234567",
            "sex": 1,
            "birthday": "1990-05-20",
            "company": null,
            "country": "VN",
            "postcode": "700000",
            "city": "Ho Chi Minh City",
            "district": "District 1",
            "ward": "Ben Nghe",
            "address1": "1 Le Loi",
            "address2": null,
            "address3": null,
            "status": 1,
            "group": 1,
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00",
            "email_verified": true,
            "email_verification_required": false,
            "default_address_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "default_address": {}
        },
        "access_token": "12|XyZ...plain-token",
        "token_type": "Bearer",
        "scopes": [
            "user"
        ],
        "expires_at": "2026-11-03 09:00:00",
        "expires_in": 3600,
        "session_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "refresh_token": "a1b2c3...64chars",
        "refresh_expires_at": "2026-12-03 08:00:00",
        "cart_merge": {
            "merged": 2,
            "dropped": 0
        }
    }
}

Lỗi: validation_failed · challenge_required · challenge_invalid

Gửi mail đặt lại mật khẩu — POST /api/v2/front/password/forgot

Gửi e-mail đặt lại mật khẩu. Phản hồi giống nhau dù e-mail có tài khoản hay không, nên không thể dùng để dò tài khoản. Giới hạn theo IP.

Đăng nhập Không cần — công khai.
Có từ shop 3.4.0

Nội dung yêu cầu: ForgotPassword

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/password/forgot" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"email":""}'

Phản hồi 200 — data: FrontPasswordForgotResult

{
    "data": {
        "sent": true
    }
}

Lỗi: validation_failed

Đặt lại mật khẩu bằng token — POST /api/v2/front/password/reset

Đặt mật khẩu mới bằng token trong e-mail đặt lại và đăng xuất mọi phiên API của tài khoản. Không tự đăng nhập; hãy gọi login với mật khẩu mới. Token sai hoặc hết hạn trả 422 ở trường token.

Đăng nhập Không cần — công khai.
Có từ shop 3.4.0

Nội dung yêu cầu: ResetPassword

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/password/reset" \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -d '{"email":"","token":"","password":"","password_confirmation":""}'

Phản hồi 200 — data: FrontPasswordResetResult

{
    "data": {
        "reset": true
    }
}

Lỗi: validation_failed · too_many_attempts

Lấy hồ sơ của tôi — GET /api/v2/front/member/profile

Trả về hồ sơ của khách hàng đang đăng nhập kèm trạng thái xác minh e-mail và địa chỉ mặc định.

Đăng nhập Token của khách hàng (Bearer).
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.4.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/member/profile" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: CustomerProfile

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "first_name": "An",
        "last_name": "Nguyen",
        "first_name_kana": null,
        "last_name_kana": null,
        "email": "an@example.com",
        "phone": "0901234567",
        "sex": 1,
        "birthday": "1990-05-20",
        "company": null,
        "country": "VN",
        "postcode": "700000",
        "city": "Ho Chi Minh City",
        "district": "District 1",
        "ward": "Ben Nghe",
        "address1": "1 Le Loi",
        "address2": null,
        "address3": null,
        "status": 1,
        "group": 1,
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00",
        "email_verified": true,
        "email_verification_required": false,
        "default_address_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "default_address": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "first_name": "An",
            "last_name": "Nguyen",
            "first_name_kana": null,
            "last_name_kana": null,
            "phone": "0901234567",
            "country": "VN",
            "postcode": "700000",
            "city": "Ho Chi Minh City",
            "district": "District 1",
            "ward": "Ben Nghe",
            "address1": "1 Le Loi",
            "address2": null,
            "address3": null,
            "is_default": true,
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00"
        }
    }
}

Cập nhật hồ sơ của tôi — PUT /api/v2/front/member/profile

Cập nhật các trường hồ sơ mà cửa hàng đã bật và trả về hồ sơ sau khi cập nhật.

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.4.0

Nội dung yêu cầu: Profile

Ví dụ yêu cầu

curl -X PUT "https://shop.example.com/api/v2/front/member/profile" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"","email":""}'

Phản hồi 200 — data: CustomerProfile

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "first_name": "An",
        "last_name": "Nguyen",
        "first_name_kana": null,
        "last_name_kana": null,
        "email": "an@example.com",
        "phone": "0901234567",
        "sex": 1,
        "birthday": "1990-05-20",
        "company": null,
        "country": "VN",
        "postcode": "700000",
        "city": "Ho Chi Minh City",
        "district": "District 1",
        "ward": "Ben Nghe",
        "address1": "1 Le Loi",
        "address2": null,
        "address3": null,
        "status": 1,
        "group": 1,
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00",
        "email_verified": true,
        "email_verification_required": false,
        "default_address_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "default_address": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "first_name": "An",
            "last_name": "Nguyen",
            "first_name_kana": null,
            "last_name_kana": null,
            "phone": "0901234567",
            "country": "VN",
            "postcode": "700000",
            "city": "Ho Chi Minh City",
            "district": "District 1",
            "ward": "Ben Nghe",
            "address1": "1 Le Loi",
            "address2": null,
            "address3": null,
            "is_default": true,
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00"
        }
    }
}

Lỗi: validation_failed

Đổi mật khẩu của tôi — PUT /api/v2/front/member/password

Đổi mật khẩu sau khi kiểm tra mật khẩu cũ (mật khẩu cũ sai trả 422). Phiên này vẫn giữ đăng nhập; mọi phiên khác bị đăng xuất.

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.4.0

Nội dung yêu cầu: ChangePassword

Ví dụ yêu cầu

curl -X PUT "https://shop.example.com/api/v2/front/member/password" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"password_old":"","password":"","password_confirmation":""}'

Phản hồi 200 — data: FrontMemberPasswordUpdateResult

{
    "data": {
        "changed": true
    }
}

Lỗi: validation_failed · too_many_attempts

Gửi lại e-mail xác minh — POST /api/v2/front/member/email/verify

Gửi lại đường link xác minh e-mail khi cửa hàng yêu cầu xác minh; sent là false khi cửa hàng không yêu cầu.

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.4.0

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/member/email/verify" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontMemberEmailVerifyResult

{
    "data": {
        "sent": true
    }
}

Danh sách địa chỉ của tôi — GET /api/v2/front/member/address/list

Trả về sổ địa chỉ của khách hàng đang đăng nhập, cũ nhất trước, có đánh dấu địa chỉ mặc định. Không phân trang.

Đăng nhập Token của khách hàng (Bearer).
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.4.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/member/address/list" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: danh sách CustomerAddress

{
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "first_name": "An",
            "last_name": "Nguyen",
            "first_name_kana": null,
            "last_name_kana": null,
            "phone": "0901234567",
            "country": "VN",
            "postcode": "700000",
            "city": "Ho Chi Minh City",
            "district": "District 1",
            "ward": "Ben Nghe",
            "address1": "1 Le Loi",
            "address2": null,
            "address3": null,
            "is_default": true,
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00"
        }
    ]
}

Thêm địa chỉ — POST /api/v2/front/member/address

Thêm một địa chỉ theo quy tắc trường địa chỉ của cửa hàng; default: true đặt nó làm địa chỉ mặc định. Trả 201 kèm địa chỉ.

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.4.0

Nội dung yêu cầu: Address

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/member/address" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"","address1":"","default":false}'

Phản hồi 201 — data: CustomerAddress

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "first_name": "An",
        "last_name": "Nguyen",
        "first_name_kana": null,
        "last_name_kana": null,
        "phone": "0901234567",
        "country": "VN",
        "postcode": "700000",
        "city": "Ho Chi Minh City",
        "district": "District 1",
        "ward": "Ben Nghe",
        "address1": "1 Le Loi",
        "address2": null,
        "address3": null,
        "is_default": true,
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00"
    }
}

Lỗi: validation_failed

Cập nhật địa chỉ — PUT /api/v2/front/member/address/{id}

Cập nhật một địa chỉ của chính khách hàng. Id của khách hàng khác trả 404.

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.4.0

Nội dung yêu cầu: Address

Ví dụ yêu cầu

curl -X PUT "https://shop.example.com/api/v2/front/member/address/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"","address1":"","default":false}'

Phản hồi 200 — data: CustomerAddress

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "first_name": "An",
        "last_name": "Nguyen",
        "first_name_kana": null,
        "last_name_kana": null,
        "phone": "0901234567",
        "country": "VN",
        "postcode": "700000",
        "city": "Ho Chi Minh City",
        "district": "District 1",
        "ward": "Ben Nghe",
        "address1": "1 Le Loi",
        "address2": null,
        "address3": null,
        "is_default": true,
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00"
    }
}

Lỗi: not_found · validation_failed

Xoá địa chỉ — DELETE /api/v2/front/member/address/{id}

Xoá một địa chỉ của chính khách hàng. Không xoá được địa chỉ mặc định (422).

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.4.0

Ví dụ yêu cầu

curl -X DELETE "https://shop.example.com/api/v2/front/member/address/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontMemberAddressDeleteResult

{
    "data": {
        "deleted": true
    }
}

Lỗi: not_found · validation_failed

Front · Giỏ hàng

Giỏ hàng của khách hàng đã đăng nhập hoặc của khách vãng lai (cart token): các dòng hàng và mã khuyến mãi.

Lấy giỏ hàng — GET /api/v2/front/cart

Trả về giỏ hàng nhóm theo cửa hàng, giá do máy chủ tính, và đánh dấu từng dòng không còn mua được. Dùng được với bearer token của khách hàng, hoặc với header X-Cart-Token cho khách vãng lai khi cửa hàng cho phép khách vãng lai đặt hàng.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/cart" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: Cart

{
    "data": {
        "stores": [
            {
                "store_id": "1",
                "lines": [],
                "subtotal": 360000
            }
        ],
        "line_count": 1,
        "item_count": 2,
        "currency": "VND"
    }
}

Lỗi: login_required · cart_conflict

Thêm sản phẩm vào giỏ — POST /api/v2/front/cart/items

Thêm một sản phẩm kèm lựa chọn thuộc tính (phải chọn đủ mọi nhóm thuộc tính); cùng sản phẩm với cùng lựa chọn thì tăng số lượng của dòng đó. Trả 201 kèm toàn bộ giỏ. Khách vãng lai chưa có giỏ nhận header phản hồi X-Cart-Token mới để giữ lại.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Nội dung yêu cầu: FrontCartItemsRequest

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/cart/items" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"product_id":"","qty":0,"options":{}}'

Phản hồi 201 — data: Cart

{
    "data": {
        "stores": [
            {
                "store_id": "1",
                "lines": [],
                "subtotal": 360000
            }
        ],
        "line_count": 1,
        "item_count": 2,
        "currency": "VND"
    }
}

Lỗi: login_required · cart_conflict · validation_failed · not_found · product_not_for_sale · cart_line_limit · insufficient_stock

Đặt số lượng của một dòng — PATCH /api/v2/front/cart/items/{rowId}

Đặt số lượng của một dòng trong giỏ; 0 hoặc nhỏ hơn thì xoá dòng. Trả về toàn bộ giỏ. Dùng được với bearer token của khách hàng, hoặc với header X-Cart-Token cho khách vãng lai khi cửa hàng cho phép khách vãng lai đặt hàng.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
rowId (bắt buộc) path string Id của dòng trong giỏ (lấy từ giỏ hàng).

Nội dung yêu cầu: FrontCartItemsUpdateRequest

Ví dụ yêu cầu

curl -X PATCH "https://shop.example.com/api/v2/front/cart/items/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"qty":0}'

Phản hồi 200 — data: Cart

{
    "data": {
        "stores": [
            {
                "store_id": "1",
                "lines": [],
                "subtotal": 360000
            }
        ],
        "line_count": 1,
        "item_count": 2,
        "currency": "VND"
    }
}

Lỗi: login_required · cart_conflict · validation_failed · not_found · insufficient_stock

Xoá một dòng trong giỏ — DELETE /api/v2/front/cart/items/{rowId}

Xoá một dòng và trả về toàn bộ giỏ. Dùng được với bearer token của khách hàng, hoặc với header X-Cart-Token cho khách vãng lai khi cửa hàng cho phép khách vãng lai đặt hàng.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
rowId (bắt buộc) path string Id của dòng trong giỏ (lấy từ giỏ hàng).

Ví dụ yêu cầu

curl -X DELETE "https://shop.example.com/api/v2/front/cart/items/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: Cart

{
    "data": {
        "stores": [
            {
                "store_id": "1",
                "lines": [],
                "subtotal": 360000
            }
        ],
        "line_count": 1,
        "item_count": 2,
        "currency": "VND"
    }
}

Lỗi: login_required · cart_conflict · not_found

Áp dụng khuyến mãi — POST /api/v2/front/cart/promotions/{pluginKey}

Áp dụng khuyến mãi (mã giảm giá, điểm...) qua plugin khuyến mãi có tên trong đường dẫn, kèm payload của nó. Trả về thông báo của plugin và tổng tiền mới; bị từ chối thì trả 422 promotion_refused.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
pluginKey (bắt buộc) path string Khoá của plugin khuyến mãi (lấy từ phản hồi giỏ hàng).
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng

Nội dung yêu cầu: FrontCartPromotionsRequest

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/cart/promotions/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"payload":{}}'

Phản hồi 200 — data: FrontCartPromotionsResult

{
    "data": {
        "result": {
            "msg": "Coupon applied"
        },
        "totals": {
            "store_id": "1",
            "lines": [
                {
                    "code": "total",
                    "title": "Total",
                    "value": 426000,
                    "text": "426,000 VND"
                }
            ],
            "currency": "VND"
        }
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity · not_found · promotion_refused

Gỡ khuyến mãi — DELETE /api/v2/front/cart/promotions/{pluginKey}

Gỡ khuyến mãi của plugin được chỉ định và trả về tổng tiền mới.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
pluginKey (bắt buộc) path string Khoá của plugin khuyến mãi (lấy từ phản hồi giỏ hàng).
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng

Ví dụ yêu cầu

curl -X DELETE "https://shop.example.com/api/v2/front/cart/promotions/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontCartPromotionsDeleteResult

{
    "data": {
        "totals": {
            "store_id": "1",
            "lines": [
                {
                    "code": "total",
                    "title": "Total",
                    "value": 426000,
                    "text": "426,000 VND"
                }
            ],
            "currency": "VND"
        }
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity · not_found

Front · Đặt hàng

Chọn địa chỉ, giao hàng và thanh toán, xem tổng tiền và đặt đơn.

Lấy trạng thái đặt hàng — GET /api/v2/front/checkout

Trả về các lựa chọn đặt hàng đã chọn đến lúc này cho một cửa hàng trong giỏ: địa chỉ, phương thức giao hàng, phương thức thanh toán và khuyến mãi. Khi giỏ có hàng của nhiều cửa hàng, gửi store_id; chọn cửa hàng khác thì các lựa chọn đặt hàng của cửa hàng đó bắt đầu lại từ đầu.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/checkout" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: CheckoutState

{
    "data": {
        "store_id": "1",
        "address": null,
        "save_address": false,
        "shipping_method": null,
        "payment_method": null,
        "promotions": []
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity

Đặt địa chỉ giao hàng — PUT /api/v2/front/checkout/address

Đặt địa chỉ giao hàng từ các trường nhập vào hoặc từ một địa chỉ đã lưu (address_id, cho khách hàng đã đăng nhập). Đổi địa chỉ sẽ xoá phương thức giao hàng đã chọn. Trả về trạng thái đặt hàng.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng

Nội dung yêu cầu: FrontCheckoutAddressUpdateRequest

Ví dụ yêu cầu

curl -X PUT "https://shop.example.com/api/v2/front/checkout/address" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"first_name":"","last_name":"","first_name_kana":"","last_name_kana":"","email":"","phone":"","city":"","district":"","ward":"","address1":"","address2":"","address3":"","postcode":"","country":"","company":"","comment":"","address_id":"","save_address":false}'

Phản hồi 200 — data: CheckoutState

{
    "data": {
        "store_id": "1",
        "address": null,
        "save_address": false,
        "shipping_method": null,
        "payment_method": null,
        "promotions": []
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity · validation_failed · not_found

Báo giá các phương thức giao hàng — GET /api/v2/front/checkout/shipping-methods

Trả về các phương thức giao hàng được báo giá cho địa chỉ và giỏ hàng đang đặt. Khi cửa hàng không dùng giao hàng, required là false và rates rỗng. Phải đặt địa chỉ trước.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/checkout/shipping-methods" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontCheckoutShippingMethodsResult

{
    "data": {
        "required": true,
        "rates": [],
        "unquotable": [
            "ShippingExpress"
        ],
        "selected": null
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity · address_required

Chọn phương thức giao hàng — PUT /api/v2/front/checkout/shipping-method

Chọn một phương thức đã báo giá theo rate_id; giá đã báo được giữ cho đơn hàng. Trả về trạng thái đặt hàng.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng

Nội dung yêu cầu: FrontCheckoutShippingMethodUpdateRequest

Ví dụ yêu cầu

curl -X PUT "https://shop.example.com/api/v2/front/checkout/shipping-method" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"rate_id":""}'

Phản hồi 200 — data: CheckoutState

{
    "data": {
        "store_id": "1",
        "address": null,
        "save_address": false,
        "shipping_method": null,
        "payment_method": null,
        "promotions": []
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity · validation_failed · method_unavailable

Danh sách phương thức thanh toán — GET /api/v2/front/checkout/payment-methods

Trả về các phương thức thanh toán dùng được qua API: loại không có bước trực tuyến (type none) và cổng thanh toán có trang thanh toán riêng (type hosted). Phương thức chỉ chạy trên website thì bị bỏ ra.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/checkout/payment-methods" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontCheckoutPaymentMethodsResult

{
    "data": {
        "required": true,
        "methods": [],
        "selected": null
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity

Chọn phương thức thanh toán — PUT /api/v2/front/checkout/payment-method

Chọn một phương thức thanh toán theo key trong số các phương thức dùng được. Trả về trạng thái đặt hàng.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng

Nội dung yêu cầu: FrontCheckoutPaymentMethodUpdateRequest

Ví dụ yêu cầu

curl -X PUT "https://shop.example.com/api/v2/front/checkout/payment-method" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"key":""}'

Phản hồi 200 — data: CheckoutState

{
    "data": {
        "store_id": "1",
        "address": null,
        "save_address": false,
        "shipping_method": null,
        "payment_method": null,
        "promotions": []
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity · validation_failed · method_unavailable

Lấy tổng tiền đặt hàng — GET /api/v2/front/checkout/totals

Trả về các dòng tổng tiền sẽ tính (tạm tính, phí giao hàng, thuế, giảm giá, tổng cộng). Các con số này được lưu lại và so lại khi đặt đơn.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
store_id query string Cửa hàng cần đặt hàng khi giỏ có hàng của nhiều cửa hàng
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/checkout/totals" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: CheckoutTotals

{
    "data": {
        "store_id": "1",
        "lines": [
            {
                "code": "total",
                "title": "Total",
                "value": 426000,
                "text": "426,000 VND"
            }
        ],
        "currency": "VND"
    }
}

Lỗi: login_required · cart_conflict · cart_empty · store_required · invalid_quantity

Đặt đơn — POST /api/v2/front/checkout/place

Đặt đơn cho cửa hàng đang đặt hàng, một lần cho mỗi header Idempotency-Key: gửi lại cùng khoá sẽ trả về đơn đã đặt (200 thay vì 201). Đặt đơn qua API bị tắt cho đến khi chủ site bật (403 api_checkout_disabled). Khi giá đã thay đổi kể từ lúc hiện tổng tiền, 409 price_changed kèm tổng tiền mới; hiện tổng tiền mới rồi đặt lại. Khách vãng lai nhận access_token để xem hoặc huỷ đơn sau này; phương thức thanh toán dạng hosted trả về URL của trang thanh toán.

Đăng nhập Token của khách hàng (Bearer), hoặc cart token của giỏ khách vãng lai.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
Idempotency-Key (bắt buộc) header string Khoá duy nhất bạn tự chọn cho mỗi thay đổi (vd một UUID); gửi lại cùng yêu cầu với cùng khoá sẽ không áp dụng hai lần.

Nội dung yêu cầu: FrontCheckoutPlaceRequest

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/checkout/place" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>" \
  -H "Content-Type: application/json" \
  -d '{"store_id":"","return_url":""}'

Phản hồi 201 — data: FrontCheckoutPlaceResult

{
    "data": {
        "order": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "store_id": "1",
            "status": 1,
            "payment_status": 1,
            "total": 426000,
            "balance": 426000,
            "currency": "VND"
        },
        "access_token": "oat_8f3c...",
        "payment": {
            "type": "hosted",
            "url": "https://pay.example.com/checkout/abc"
        }
    }
}

Lỗi: api_checkout_disabled · idempotency_key_required · idempotency_key_reused · login_required · cart_conflict · cart_empty · store_required · invalid_quantity · address_required · shipping_method_required · payment_method_required · method_unavailable · minimum_not_met · price_changed · create_failed · token_missing · input_empty · shipping_unquotable

Front · Đơn hàng

Đơn hàng của khách hàng (hoặc của khách vãng lai có token truy cập đơn): danh sách, chi tiết, thanh toán và huỷ đơn.

Lấy một đơn hàng của tôi — GET /api/v2/front/member/order/detail/{id}

Trả về một đơn hàng của khách hàng đang đăng nhập kèm các dòng hàng và tổng tiền. Đơn của khách hàng khác trả 404.

Đăng nhập Token của khách hàng (Bearer).
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/member/order/detail/123" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: Order

{
    "data": {
        "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "customer_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
        "status": 1,
        "payment_status": 1,
        "shipping_status": 1,
        "currency": "VND",
        "exchange_rate": 1,
        "subtotal": 360000,
        "tax": 36000,
        "shipping": 30000,
        "discount": 0,
        "other_fee": 0,
        "total": 426000,
        "received": 0,
        "balance": 426000,
        "first_name": "An",
        "last_name": "Nguyen",
        "email": "an@example.com",
        "phone": "0901234567",
        "company": null,
        "country": "VN",
        "postcode": "700000",
        "city": "Ho Chi Minh City",
        "district": "District 1",
        "ward": "Ben Nghe",
        "address1": "1 Le Loi",
        "address2": null,
        "address3": null,
        "comment": "Call before delivery",
        "payment_method": "Cash",
        "shipping_method": "ShippingStandard",
        "store_id": "1",
        "details": [],
        "totals": [],
        "created_at": "2026-10-31T08:00:00+07:00",
        "updated_at": "2026-10-31T08:00:00+07:00",
        "ip": "203.0.113.5",
        "user_agent": "MyShopApp/1.0",
        "device_type": "phone",
        "domain": "shop.example.com",
        "transaction": null
    }
}

Lỗi: not_found · validation_failed

Danh sách đơn hàng của tôi — GET /api/v2/front/member/order/list

Trả về đơn hàng của chính khách hàng đang đăng nhập, theo từng trang, kèm các dòng hàng và tổng tiền nhưng không có dữ liệu yêu cầu dành cho quản trị. Lọc theo status, sắp xếp theo created_at hoặc total; nhận fields[order].

Đăng nhập Token của khách hàng (Bearer).
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.3.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
page[number] query integer Trang cần đọc, bắt đầu từ 1.
page[size] query integer Số dòng mỗi trang (mặc định 20, tối đa 100).
filter query object filter[<name>]=value — tên được phép theo từng loại dữ liệu, xem api-introduction mục 8; tên không có = 422
sort query string <name> tăng dần, -<name> giảm dần; tên không có = 422
q query string Từ khoá tìm kiếm
lang query string Ngôn ngữ của tên/mô tả
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.
fields query object fields[<type>]=a,b chỉ giữ các trường đó (và id) của bản ghi và của các bản ghi lấy kèm. Kiểu hoặc trường không có = 422. Không gửi thì nội dung giữ nguyên. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/member/order/list" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: danh sách Order — kèm meta (phân trang) và links.

{
    "meta": {
        "current_page": 1,
        "per_page": 20,
        "total": 135,
        "last_page": 7,
        "next_after": "eyJ0IjoiMjAyNi0xMC0zMSAwODowMDowMCIsImsiOiI5ZjBjIn0",
        "has_more": true,
        "sync_until": "2026-10-31T08:00:00+07:00"
    },
    "links": {
        "first": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=1&page%5Bsize%5D=20",
        "last": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=7&page%5Bsize%5D=20",
        "prev": null,
        "next": "https://shop.example.com/api/v2/front/product/list?page%5Bnumber%5D=2&page%5Bsize%5D=20"
    },
    "data": [
        {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "customer_id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "status": 1,
            "payment_status": 1,
            "shipping_status": 1,
            "currency": "VND",
            "exchange_rate": 1,
            "subtotal": 360000,
            "tax": 36000,
            "shipping": 30000,
            "discount": 0,
            "other_fee": 0,
            "total": 426000,
            "received": 0,
            "balance": 426000,
            "first_name": "An",
            "last_name": "Nguyen",
            "email": "an@example.com",
            "phone": "0901234567",
            "company": null,
            "country": "VN",
            "postcode": "700000",
            "city": "Ho Chi Minh City",
            "district": "District 1",
            "ward": "Ben Nghe",
            "address1": "1 Le Loi",
            "address2": null,
            "address3": null,
            "comment": "Call before delivery",
            "payment_method": "Cash",
            "shipping_method": "ShippingStandard",
            "store_id": "1",
            "details": [],
            "totals": [],
            "created_at": "2026-10-31T08:00:00+07:00",
            "updated_at": "2026-10-31T08:00:00+07:00",
            "ip": "203.0.113.5",
            "user_agent": "MyShopApp/1.0",
            "device_type": "phone",
            "domain": "shop.example.com",
            "transaction": null
        }
    ]
}

Lỗi: validation_failed

Trạng thái thanh toán đơn của tôi — GET /api/v2/front/member/orders/{id}/payment

Trả về trạng thái thanh toán và số tiền của một đơn hàng của khách hàng đang đăng nhập, theo xác nhận của cổng thanh toán. Đơn của khách hàng khác trả 404.

Đăng nhập Token của khách hàng (Bearer).
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/member/orders/123/payment" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontMemberOrdersPaymentResult

{
    "data": {
        "order": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "store_id": "1",
            "status": 1,
            "payment_status": 2,
            "total": 426000,
            "received": 426000,
            "balance": 0,
            "currency": "VND"
        },
        "payment": {
            "type": "hosted",
            "status": "paid"
        }
    }
}

Lỗi: not_found

Trạng thái thanh toán đơn của khách vãng lai — GET /api/v2/front/orders/{id}/payment

Trả về trạng thái thanh toán của đơn khách vãng lai, mở bằng token truy cập đơn trong header X-Order-Access (lấy từ checkout/place). Token sai trả cùng lỗi 404 như đơn không tồn tại.

Đăng nhập Không cần — công khai.
Lưu tạm (cache) ETag — gửi If-None-Match để nhận 304 khi không có gì thay đổi.
Có từ shop 3.5.0

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
X-Order-Access (bắt buộc) header string access_token nhận được khi khách vãng lai đặt đơn
If-None-Match header string ETag của lần trả lời trước; trả 304 với nội dung rỗng khi không có gì thay đổi. Có từ core 3.8.0.

Ví dụ yêu cầu

curl "https://shop.example.com/api/v2/front/orders/123/payment" \
  -H "Accept: application/json"

Phản hồi 200 — data: FrontOrdersPaymentResult

{
    "data": {
        "order": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "store_id": "1",
            "status": 1,
            "payment_status": 2,
            "total": 426000,
            "received": 426000,
            "balance": 0,
            "currency": "VND"
        },
        "payment": {
            "type": "hosted",
            "status": "paid"
        }
    }
}

Lỗi: not_found

Huỷ đơn chưa thanh toán của tôi — POST /api/v2/front/member/orders/{id}/cancel

Huỷ một đơn chưa thanh toán của khách hàng đang đăng nhập, đặt qua API và chưa được xử lý; tồn kho được trả lại. Trả về trạng thái thanh toán mới. Đơn khác trả 409 order_not_cancellable.

Đăng nhập Token của khách hàng (Bearer).
Có từ shop 3.5.1

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/member/orders/123/cancel" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer <customer-token>"

Phản hồi 200 — data: FrontMemberOrdersCancelResult

{
    "data": {
        "order": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "store_id": "1",
            "status": 1,
            "payment_status": 2,
            "total": 426000,
            "received": 426000,
            "balance": 0,
            "currency": "VND"
        },
        "payment": {
            "type": "hosted",
            "status": "paid"
        }
    }
}

Lỗi: not_found · order_not_cancellable

Huỷ đơn chưa thanh toán của khách vãng lai — POST /api/v2/front/orders/{id}/cancel

Huỷ một đơn chưa thanh toán của khách vãng lai đặt qua API, mở bằng token X-Order-Access; tồn kho được trả lại. Trả về trạng thái thanh toán mới.

Đăng nhập Không cần — công khai.
Có từ shop 3.5.1

Tham số

Tên Vị trí Kiểu Ý nghĩa
id (bắt buộc) path string Id của bản ghi (UUID).
X-Order-Access (bắt buộc) header string access_token nhận được khi khách vãng lai đặt đơn

Ví dụ yêu cầu

curl -X POST "https://shop.example.com/api/v2/front/orders/123/cancel" \
  -H "Accept: application/json"

Phản hồi 200 — data: FrontOrdersCancelResult

{
    "data": {
        "order": {
            "id": "9f0c2a3e-6b1d-4c5e-8a7f-2d3b4c5d6e7f",
            "store_id": "1",
            "status": 1,
            "payment_status": 2,
            "total": 426000,
            "received": 426000,
            "balance": 0,
            "currency": "VND"
        },
        "payment": {
            "type": "hosted",
            "status": "paid"
        }
    }
}

Lỗi: not_found · order_not_cancellable

Đối tượng dữ liệu

Các trường của đối tượng mà các endpoint ở trên gửi và trả về. Ngày giờ là chuỗi ISO 8601; tiền là số theo tiền tệ của bản ghi.

Meta

Trường Kiểu Ý nghĩa
api_version string Luôn là '2'.
packages danh sách string Các gói GP247 đã cài (chỉ tên, không có phiên bản).
languages danh sách string Mã các ngôn ngữ đang bật.
locale string Ngôn ngữ mặc định của site.
store_id string Cửa hàng phục vụ tên miền đang gọi.

Brand

Trường Kiểu Ý nghĩa
id string Id thương hiệu.
name string Tên thương hiệu.
alias string Slug trên URL.
image string | null Đường dẫn logo.
url string | null Website của thương hiệu.
sort integer Thứ tự sắp xếp.
status integer 1 = đang bật.
store_id string | null Id cửa hàng.
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).

Category

Trường Kiểu Ý nghĩa
id string Id danh mục.
alias string Slug trên URL.
name string | null Tên bằng ngôn ngữ được yêu cầu.
keyword string | null Từ khoá SEO bằng ngôn ngữ được yêu cầu.
description string | null Mô tả bằng ngôn ngữ được yêu cầu.
image string | null Đường dẫn ảnh.
parent string | null Id danh mục cha.
top integer 1 = hiện ở menu trên cùng.
sort integer Thứ tự sắp xếp.
status integer 1 = đang bật.
store_id string | null Id cửa hàng.
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).

Product

Trường Kiểu Ý nghĩa
id string Id sản phẩm (UUID).
sku string Mã SKU (mã quản lý hàng tồn kho).
alias string Slug URL của sản phẩm.
name string | null Tên sản phẩm bằng ngôn ngữ được yêu cầu (không có thì dùng ngôn ngữ đầu tiên).
keyword string | null Từ khoá SEO bằng ngôn ngữ được yêu cầu.
description string | null Mô tả ngắn bằng ngôn ngữ được yêu cầu.
content string | null Nội dung HTML bằng ngôn ngữ được yêu cầu; chỉ có ở phản hồi chi tiết (không có trong danh sách). (chỉ ở chi tiết)
image string | null Đường dẫn ảnh chính như đã lưu.
images danh sách string Đường dẫn các ảnh phụ; có giá trị ở phản hồi chi tiết hoặc khi gửi include=images, còn lại là mảng rỗng trong danh sách.
price number | null Giá niêm yết; null khi cửa hàng ẩn giá trên cửa hàng (quản trị viên luôn thấy).
price_final number | null Giá cửa hàng tính cho khách (đã áp khuyến mãi); null khi cửa hàng ẩn giá.
tax_id string | null Id quy tắc thuế; '0' = không thuế, 'auto' = thuế mặc định của cửa hàng.
kind integer Loại sản phẩm: 0 đơn lẻ, 1 build (ghép từ các thành phần), 2 nhóm.
product_type string | null Kiểu sản phẩm, vd hàng vật lý hoặc hàng số.
brand_id string | null Id thương hiệu.
category_ids danh sách string Id các danh mục của sản phẩm (ở cửa hàng: chỉ danh mục mà cửa hàng hiển thị).
minimum number Số lượng tối thiểu mỗi đơn.
weight number Khối lượng.
weight_class string | null Đơn vị khối lượng.
length number Chiều dài.
width number Chiều rộng.
height number Chiều cao.
length_class string | null Đơn vị chiều dài.
date_available string | null Ngày sản phẩm bắt đầu có hàng (Y-m-d, giá trị gốc của cột).
store_id string | null Cửa hàng sở hữu sản phẩm.
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).
image_sizes object URL tuyệt đối của ảnh chính: {original, thumb} (ảnh thay thế của site khi không có ảnh).
stock_status string in_stock hoặc out_of_stock; luôn là in_stock khi cửa hàng không theo dõi tồn kho hoặc cho bán khi hết hàng.
attributes danh sách ProductAttributeGroup Các nhóm thuộc tính người mua phải chọn để thêm sản phẩm vào giỏ.
cost number chỉ API quản trị. Giá vốn. (chỉ API quản trị)
stock number chỉ API quản trị. Số lượng tồn kho. (chỉ API quản trị)
sold number chỉ API quản trị. Số lượng đã bán. (chỉ API quản trị)
status integer chỉ API quản trị. 1 = đang bật, 0 = đã tắt. (chỉ API quản trị)
approve integer chỉ API quản trị. Cờ kiểm duyệt: 1 = đã duyệt. (chỉ API quản trị)
supplier_id string | null chỉ API quản trị. Id nhà cung cấp. (chỉ API quản trị)
view integer chỉ API quản trị. Số lượt xem. (chỉ API quản trị)
brand Brand Chỉ khi có include=brand: thương hiệu (ở cửa hàng: chỉ thương hiệu đang bật). (chỉ khi có include brand)
categories danh sách Category Chỉ khi có include=categories: đầy đủ các danh mục. (chỉ khi có include categories)
Trường Kiểu Ý nghĩa
id string Id banner.
name string | null Tên banner.
image string | null Đường dẫn ảnh.
url string | null Đích của liên kết.
target string | null Cửa sổ mở liên kết, vd _self hoặc _blank.
html string | null Nội dung HTML (không bắt buộc).
type string Mã vị trí/loại banner.
sort integer Thứ tự sắp xếp.
status integer 1 = đang bật.
store_id string | null Id cửa hàng.
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).
click integer chỉ API quản trị. Số lượt nhấp. (chỉ API quản trị)

Page

Trường Kiểu Ý nghĩa
id string Id trang.
alias string Slug trên URL.
image string | null Đường dẫn ảnh.
name string | null Tiêu đề bằng ngôn ngữ được yêu cầu.
keyword string | null Từ khoá SEO.
description string | null Mô tả ngắn.
content string | null Nội dung HTML; chỉ có ở phản hồi chi tiết (không có trong danh sách). (chỉ ở chi tiết)
status integer 1 = đang bật.
store_id string | null Id cửa hàng.
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).

SessionToken

Trường Kiểu Ý nghĩa
access_token string Bearer token để gửi dưới dạng Authorization: Bearer <token>.
token_type string Luôn là Bearer.
scopes danh sách string Các quyền (ability) của token.
expires_at string | null Thời điểm access token hết hạn, dạng 'Y-m-d H:i:s' theo múi giờ của site (không phải ISO 8601).
expires_in integer | null Số giây còn lại trước khi access token hết hạn.
session_id string Id phiên API; có khi site đã chạy gp247:update (đã có bảng phiên).
refresh_token string Chỉ khi with_refresh=true: refresh token dùng một lần, chỉ hiện một lần.
refresh_expires_at string Chỉ khi with_refresh=true: thời điểm refresh token hết hạn, dạng 'Y-m-d H:i:s'.
cart_merge object Chỉ ở đăng nhập khách hàng, khi có gửi giỏ khách vãng lai qua X-Cart-Token: số dòng {merged, dropped}.

CustomerLoginV2

Trường Kiểu Ý nghĩa
email string (email) Email của tài khoản khách hàng. (bắt buộc)
password string Mật khẩu của tài khoản. (bắt buộc)
remember_me boolean Token sống lâu hơn (giống "ghi nhớ đăng nhập" trên website).
with_refresh boolean Cấp thêm refresh token xoay vòng; khi đó access token chỉ sống 60 phút
device_name string Hiện trong danh sách phiên

FrontLogoutResult

Trường Kiểu Ý nghĩa
revoked boolean Luôn là true.

LoginChallengeAnswer

Cộng các trường do plugin xác thực bước hai định nghĩa (vd code)

Trường Kiểu Ý nghĩa
ticket string Ticket lấy từ phản hồi challenge_required của login. (bắt buộc)

RefreshRequest

Trường Kiểu Ý nghĩa
refresh_token string Refresh token lấy từ login hoặc từ lần làm mới trước; mỗi token chỉ dùng được một lần. (bắt buộc)

Session

Trường Kiểu Ý nghĩa
id string Id phiên.
name string | null Tên thiết bị gửi lúc đăng nhập, nếu không có thì là user agent.
ip string | null Địa chỉ IP lúc đăng nhập.
created_at string | null Thời điểm đăng nhập (ISO 8601).
last_used_at string | null Lần dùng gần nhất (ISO 8601).
refreshable boolean Phiên có refresh token hay không.
refresh_expires_at string | null Thời điểm hết hạn làm mới (ISO 8601).
current boolean True với phiên của token đang gọi.

FrontMemberSessionsDeleteResult

Trường Kiểu Ý nghĩa
revoked boolean Luôn là true.

Customer

Trường Kiểu Ý nghĩa
id string Id khách hàng.
first_name string | null Tên.
last_name string | null Họ.
first_name_kana string | null Tên viết kana (cửa hàng Nhật Bản).
last_name_kana string | null Họ viết kana (cửa hàng Nhật Bản).
email string Địa chỉ e-mail (tên đăng nhập).
phone string | null Số điện thoại.
sex integer | null 0 = nữ, 1 = nam (giá trị gốc của cột).
birthday string | null Ngày sinh (Y-m-d, giá trị gốc của cột).
company string | null Công ty.
country string | null Mã quốc gia.
postcode string | null Mã bưu chính.
city string | null Thành phố.
district string | null Quận/huyện.
ward string | null Phường/xã.
address1 string | null Địa chỉ dòng 1.
address2 string | null Địa chỉ dòng 2.
address3 string | null Địa chỉ dòng 3.
status integer 1 = đang hoạt động, 0 = bị khoá.
group integer Nhóm khách hàng (giá trị gốc của cột).
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).
store_id string | null chỉ API quản trị. Cửa hàng của tài khoản. (chỉ API quản trị)
email_verified_at string | null chỉ API quản trị. Thời điểm e-mail được xác minh, giá trị gốc 'Y-m-d H:i:s' (không phải ISO 8601); null nếu chưa từng xác minh. (chỉ API quản trị)

FrontRegisterResult

Trường Kiểu Ý nghĩa
customer CustomerProfile Tài khoản mới.
access_token string Bearer token để gửi dưới dạng Authorization: Bearer <token>.
token_type string Luôn là Bearer.
scopes danh sách string Các quyền (ability) của token.
expires_at string | null Thời điểm access token hết hạn, dạng 'Y-m-d H:i:s' theo múi giờ của site (không phải ISO 8601).
expires_in integer | null Số giây còn lại trước khi access token hết hạn.
session_id string Id phiên API; có khi site đã chạy gp247:update (đã có bảng phiên).
refresh_token string Chỉ khi with_refresh=true: refresh token dùng một lần, chỉ hiện một lần.
refresh_expires_at string Chỉ khi with_refresh=true: thời điểm refresh token hết hạn, dạng 'Y-m-d H:i:s'.
cart_merge object Chỉ ở đăng nhập khách hàng, khi có gửi giỏ khách vãng lai qua X-Cart-Token: số dòng {merged, dropped}.

Register

Các trường khách hàng khác theo cấu hình của cửa hàng (last_name, phone, address1…, trường tuỳ biến, trường captcha khi được bật); with_refresh, device_name như ở login

Trường Kiểu Ý nghĩa
first_name string Tên. (bắt buộc)
email string (email) Email; cũng là tên đăng nhập.
password string Mật khẩu (áp dụng quy tắc mật khẩu của site). (bắt buộc)
password_confirmation string Nhập lại mật khẩu. (bắt buộc)
with_refresh boolean Trả thêm refresh token.
device_name string Tên hiện trong danh sách thiết bị đang đăng nhập.

FrontPasswordForgotResult

Trường Kiểu Ý nghĩa
sent boolean Luôn là true.

ForgotPassword

Trường Kiểu Ý nghĩa
email string (email) Email của tài khoản; phản hồi giống nhau dù tài khoản có tồn tại hay không. (bắt buộc)

FrontPasswordResetResult

Trường Kiểu Ý nghĩa
reset boolean Luôn là true.

ResetPassword

Trường Kiểu Ý nghĩa
email string (email) Email của tài khoản. (bắt buộc)
token string Token trong email đặt lại mật khẩu. (bắt buộc)
password string Mật khẩu mới. (bắt buộc)
password_confirmation string Nhập lại mật khẩu. (bắt buộc)

CustomerProfile

Trường Kiểu Ý nghĩa
id string Id khách hàng.
first_name string | null Tên.
last_name string | null Họ.
first_name_kana string | null Tên viết kana (cửa hàng Nhật Bản).
last_name_kana string | null Họ viết kana (cửa hàng Nhật Bản).
email string Địa chỉ e-mail (tên đăng nhập).
phone string | null Số điện thoại.
sex integer | null 0 = nữ, 1 = nam (giá trị gốc của cột).
birthday string | null Ngày sinh (Y-m-d, giá trị gốc của cột).
company string | null Công ty.
country string | null Mã quốc gia.
postcode string | null Mã bưu chính.
city string | null Thành phố.
district string | null Quận/huyện.
ward string | null Phường/xã.
address1 string | null Địa chỉ dòng 1.
address2 string | null Địa chỉ dòng 2.
address3 string | null Địa chỉ dòng 3.
status integer 1 = đang hoạt động, 0 = bị khoá.
group integer Nhóm khách hàng (giá trị gốc của cột).
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).
email_verified boolean Địa chỉ e-mail đã được xác minh hay chưa.
email_verification_required boolean Cửa hàng có yêu cầu xác minh e-mail hay không.
default_address_id string | null Id của địa chỉ mặc định.
default_address CustomerAddress Địa chỉ mặc định (dạng CustomerAddress), hoặc null.

Profile

Các trường khách hàng theo cấu hình của cửa hàng; status và password bị bỏ qua

Trường Kiểu Ý nghĩa
first_name string Tên.
email string (email) Email; đổi email có thể cần xác minh địa chỉ mới.

FrontMemberPasswordUpdateResult

Trường Kiểu Ý nghĩa
changed boolean Luôn là true.

ChangePassword

Trường Kiểu Ý nghĩa
password_old string Mật khẩu hiện tại. (bắt buộc)
password string Mật khẩu mới. (bắt buộc)
password_confirmation string Nhập lại mật khẩu. (bắt buộc)

FrontMemberEmailVerifyResult

Trường Kiểu Ý nghĩa
sent boolean True khi đã gửi mail (cửa hàng yêu cầu xác minh).

CustomerAddress

Trường Kiểu Ý nghĩa
id string Id địa chỉ.
first_name string | null Tên.
last_name string | null Họ.
first_name_kana string | null Tên viết kana.
last_name_kana string | null Họ viết kana.
phone string | null Điện thoại.
country string | null Mã quốc gia.
postcode string | null Mã bưu chính.
city string | null Thành phố.
district string | null Quận/huyện.
ward string | null Phường/xã.
address1 string | null Địa chỉ dòng 1.
address2 string | null Địa chỉ dòng 2.
address3 string | null Địa chỉ dòng 3.
is_default boolean True với địa chỉ mặc định của khách hàng.
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).

Address

Các trường địa chỉ khác theo cấu hình của cửa hàng; "default": true đặt nó làm địa chỉ mặc định

Trường Kiểu Ý nghĩa
first_name string Tên người nhận. (bắt buộc)
address1 string Dòng địa chỉ thứ nhất. (bắt buộc)
default boolean Đặt làm địa chỉ mặc định.

FrontMemberAddressDeleteResult

Trường Kiểu Ý nghĩa
deleted boolean Luôn là true.

Cart

Trường Kiểu Ý nghĩa
stores danh sách object Các dòng trong giỏ nhóm theo cửa hàng: {store_id, lines: [CartLine], subtotal}; subtotal chỉ cộng các dòng còn mua được.
line_count integer Số dòng.
item_count number Tổng số lượng của mọi dòng.
currency string Tiền tệ hiển thị của giá.

FrontCartItemsRequest

Trường Kiểu Ý nghĩa
product_id string Id của sản phẩm. (bắt buộc)
qty number Số lượng cần thêm. (bắt buộc)
options object id nhóm thuộc tính => tên lựa chọn

FrontCartItemsUpdateRequest

Trường Kiểu Ý nghĩa
qty number Số lượng mới của dòng. (bắt buộc)

FrontCartPromotionsResult

Trường Kiểu Ý nghĩa
result object {msg}: thông báo của plugin khuyến mãi.
totals CheckoutTotals Tổng tiền mới (dạng CheckoutTotals).

FrontCartPromotionsRequest

Trường Kiểu Ý nghĩa
payload object Theo dữ liệu plugin cần, vd {"code": "SUMMER"}

FrontCartPromotionsDeleteResult

Trường Kiểu Ý nghĩa
totals CheckoutTotals Tổng tiền mới (dạng CheckoutTotals).

CheckoutState

Trường Kiểu Ý nghĩa
store_id string Cửa hàng đang đặt hàng.
address object | null Địa chỉ giao hàng đã đặt đến lúc này: first_name, last_name, first_name_kana, last_name_kana, email, phone, city, district, ward, address1, address2, address3, postcode, country, company, comment (tất cả là chuỗi).
save_address boolean Địa chỉ có được lưu vào sổ địa chỉ của khách hàng hay không.
shipping_method object | null Phương thức giao hàng đã chọn (dạng ShippingRate, hoặc {plugin_key} khi không giữ báo giá); null khi chưa chọn.
payment_method string | null Key của plugin thanh toán đã chọn.
promotions danh sách string Key của các plugin khuyến mãi đã áp dụng.

FrontCheckoutAddressUpdateRequest

Trường Kiểu Ý nghĩa
first_name string Tên người nhận.
last_name string Họ người nhận.
first_name_kana string Tên viết kana (cửa hàng Nhật Bản).
last_name_kana string Họ viết kana (cửa hàng Nhật Bản).
email string Email nhận xác nhận đơn hàng.
phone string Số điện thoại.
city string Thành phố hoặc tỉnh.
district string Quận/huyện.
ward string Phường/xã.
address1 string Dòng địa chỉ thứ nhất.
address2 string Dòng địa chỉ thứ hai.
address3 string Dòng địa chỉ thứ ba.
postcode string Mã bưu chính.
country string Mã quốc gia (ISO 3166-1 alpha-2, vd VN).
company string Tên công ty.
comment string Ghi chú cho cửa hàng.
address_id string Một trong các địa chỉ đã lưu của khách hàng
save_address boolean Khách hàng đã đăng nhập: lưu luôn vào sổ địa chỉ.

FrontCheckoutShippingMethodsResult

Trường Kiểu Ý nghĩa
required boolean Cửa hàng có yêu cầu chọn phương thức giao hàng hay không.
rates danh sách ShippingRate Các phương thức đã báo giá.
unquotable danh sách string Key của các plugin giao hàng không báo giá được cho kiện hàng này.
selected string | null Id của phương thức đã chọn, khi còn hợp lệ với địa chỉ và giỏ hàng này.

FrontCheckoutShippingMethodUpdateRequest

Trường Kiểu Ý nghĩa
rate_id string Id của một phương thức giao hàng lấy từ checkout/shipping-methods. (bắt buộc)

FrontCheckoutPaymentMethodsResult

Trường Kiểu Ý nghĩa
required boolean Cửa hàng có yêu cầu phương thức thanh toán hay không.
methods danh sách PaymentMethod Các phương thức dùng được.
selected string | null Key của phương thức đã chọn.

FrontCheckoutPaymentMethodUpdateRequest

Trường Kiểu Ý nghĩa
key string Key của một phương thức thanh toán lấy từ checkout/payment-methods. (bắt buộc)

CheckoutTotals

Trường Kiểu Ý nghĩa
store_id string Cửa hàng đang đặt hàng.
lines danh sách OrderTotal Các dòng tổng tiền (cùng dạng với OrderTotal): code, title, value, text.
currency string Tiền tệ hiển thị.

FrontCheckoutPlaceRequest

Trường Kiểu Ý nghĩa
store_id string Cửa hàng có các dòng cần đặt (một giỏ có thể chứa hàng của nhiều cửa hàng).
return_url string Nơi người trả tiền quay về sau cổng thanh toán; chỉ dùng khi nằm trong danh sách được phép của site (GP247_PAYMENT_RETURN_URLS)

FrontCheckoutPlaceResult

Trường Kiểu Ý nghĩa
order object {id, store_id, status, payment_status, total, balance, currency} của đơn vừa đặt.
access_token string Chỉ khách vãng lai: token truy cập đơn, gửi dưới dạng X-Order-Access ở orders/{id}/payment và orders/{id}/cancel.
payment object {type: none} hoặc {type: hosted, url}: url của trang cổng thanh toán, null khi cổng thanh toán không khởi động được (thử lại với cùng khoá) hoặc không có gì phải trả.

Order

Trường Kiểu Ý nghĩa
id string Id đơn hàng.
customer_id string | null Id khách hàng ('0' hoặc rỗng với đơn của khách vãng lai).
status integer Id trạng thái đơn hàng (các trạng thái cấu hình trên màn quản trị đơn hàng).
payment_status integer Id trạng thái thanh toán.
shipping_status integer Id trạng thái giao hàng.
currency string Tiền tệ của đơn hàng.
exchange_rate number Tỷ giá dùng cho đơn hàng.
subtotal number Tổng các dòng.
tax number Thuế.
shipping number Phí giao hàng.
discount number Giảm giá.
other_fee number Phí khác.
total number Số tiền phải trả.
received number Số tiền đã nhận đến lúc này.
balance number Số tiền còn phải trả.
first_name string | null Tên người nhận hàng.
last_name string | null Họ người nhận hàng.
email string | null E-mail người mua.
phone string | null Điện thoại người mua.
company string | null Công ty.
country string | null Mã quốc gia.
postcode string | null Mã bưu chính.
city string | null Thành phố.
district string | null Quận/huyện.
ward string | null Phường/xã.
address1 string | null Địa chỉ dòng 1.
address2 string | null Địa chỉ dòng 2.
address3 string | null Địa chỉ dòng 3.
comment string | null Ghi chú của người mua.
payment_method string | null Key của plugin thanh toán.
shipping_method string | null Key của plugin giao hàng.
store_id string | null Cửa hàng của đơn hàng.
details danh sách OrderLine Các dòng của đơn hàng.
totals danh sách OrderTotal Các dòng tổng tiền theo thứ tự hiển thị.
created_at string | null Thời điểm tạo (ISO 8601).
updated_at string | null Thời điểm thay đổi gần nhất (ISO 8601).
ip string | null chỉ API quản trị. Địa chỉ IP mà đơn hàng gửi tới từ đó. (chỉ API quản trị)
user_agent string | null chỉ API quản trị. User agent của trình duyệt / ứng dụng. (chỉ API quản trị)
device_type string | null chỉ API quản trị. Loại thiết bị (desktop, phone, tablet, other). (chỉ API quản trị)
domain string | null chỉ API quản trị. Tên miền site nơi đặt đơn. (chỉ API quản trị)
transaction string | null chỉ API quản trị. Mã giao dịch kiểu cũ. (chỉ API quản trị)
transactions danh sách OrderTransaction chỉ API quản trị, khi có include=transactions: các khoản thu chi tiền của đơn hàng. (chỉ API quản trị, chỉ khi có include transactions)
histories danh sách OrderHistory chỉ API quản trị, khi có include=histories: các dòng lịch sử đơn hàng (văn bản thuần). (chỉ API quản trị, chỉ khi có include histories)

FrontMemberOrdersPaymentResult

Trường Kiểu Ý nghĩa
order object {id, store_id, status, payment_status, total, received, balance, currency}; không có địa chỉ, không có các dòng hàng.
payment object {type: none|hosted, status: paid|partially_paid|refunded|unpaid} theo ghi nhận từ cổng thanh toán.

FrontOrdersPaymentResult

Trường Kiểu Ý nghĩa
order object {id, store_id, status, payment_status, total, received, balance, currency}; không có địa chỉ, không có các dòng hàng.
payment object {type: none|hosted, status: paid|partially_paid|refunded|unpaid} theo ghi nhận từ cổng thanh toán.

FrontMemberOrdersCancelResult

Trường Kiểu Ý nghĩa
order object {id, store_id, status, payment_status, total, received, balance, currency}; không có địa chỉ, không có các dòng hàng.
payment object {type: none|hosted, status: paid|partially_paid|refunded|unpaid} theo ghi nhận từ cổng thanh toán.

FrontOrdersCancelResult

Trường Kiểu Ý nghĩa
order object {id, store_id, status, payment_status, total, received, balance, currency}; không có địa chỉ, không có các dòng hàng.
payment object {type: none|hosted, status: paid|partially_paid|refunded|unpaid} theo ghi nhận từ cổng thanh toán.

ProductAttributeGroup

Trường Kiểu Ý nghĩa
group_id string Id nhóm thuộc tính; giỏ hàng nhận lựa chọn dưới dạng options[group_id].
name string Tên nhóm, vd Màu sắc.
required boolean Luôn là true: phải chọn mọi nhóm.
options danh sách object Các lựa chọn của nhóm: {value, add_price}; add_price là phụ phí, null khi giá bị ẩn.

ShippingRate

Trường Kiểu Ý nghĩa
id string Id báo giá để gửi dưới dạng rate_id.
plugin_key string Key của plugin giao hàng.
service_code string Mã dịch vụ bên trong plugin.
title string Nhãn để hiển thị.
amount number Giá theo tiền tệ hiển thị.
currency string Tiền tệ hiển thị.
eta_min_days integer | null Thời gian giao nhanh nhất, tính bằng ngày.
eta_max_days integer | null Thời gian giao chậm nhất, tính bằng ngày.

PaymentMethod

Trường Kiểu Ý nghĩa
key string Key của plugin thanh toán để gửi dưới dạng key.
title string Nhãn.
note string Ghi chú thêm của phương thức.
type string none = không có bước thanh toán trực tuyến; hosted = người trả tiền được chuyển tới trang của cổng thanh toán.

OrderTotal

Trường Kiểu Ý nghĩa
code string Mã dòng, vd subtotal, tax, shipping, discount, total.
title string Nhãn của dòng.
value number Số tiền.
text string Số tiền đã định dạng để hiển thị.

OrderLine

Trường Kiểu Ý nghĩa
id string Id dòng.
product_id string Id sản phẩm.
sku string | null SKU tại thời điểm đặt đơn.
name string | null Tên sản phẩm tại thời điểm đặt đơn.
price number Đơn giá.
qty number Số lượng.
discount number Giảm giá của dòng.
tax number Thuế của dòng.
tax_rate number Thuế suất tính bằng phần trăm.
total_price number Thành tiền của dòng.
attribute string | null Các thuộc tính đã chọn dưới dạng chuỗi mã hoá JSON {group_id: 'name__price[__slug]'}, giá trị gốc của cột.

OrderTransaction

Trường Kiểu Ý nghĩa
id string Id giao dịch.
type string Loại khoản thu chi (vd payment, refund).
amount number Số tiền.
currency string Tiền tệ.
method string | null Key của phương thức thanh toán.
gateway_transaction_id string | null Mã tham chiếu tại cổng thanh toán.
paid_at string | null Thời điểm thanh toán (ISO 8601).
created_at string | null Thời điểm ghi nhận (ISO 8601).

OrderHistory

Trường Kiểu Ý nghĩa
id string Id dòng lịch sử.
content string Nội dung dòng lịch sử (đã bỏ HTML).
order_status_id integer Trạng thái đơn hàng tại thời điểm ghi dòng.
admin_id string | null Quản trị viên đã ghi dòng này.
customer_id string | null Khách hàng đã ghi dòng này.
created_at string | null Thời điểm ghi (ISO 8601).

📅 Cập nhật lần cuối: 2026-11-03 · ✍️ Tác giả (Author): GP247