bagisto/bagisto-api
REST and GraphQL API layer for Bagisto 2.3.8+, built on API Platform. Quickly install via Composer and an Artisan installer to get API docs, GraphQL Playground, and shop/admin endpoints for e‑commerce integrations and extensions.
Installation:
composer require bagisto/bagisto-api
php artisan bagisto-api-platform:install
Verify APIs at /api, /api/shop/docs, and /api/graphiql.
First API Call (REST): Fetch shop products via:
curl -X GET "https://your-domain.com/api/shop/products" \
-H "Authorization: Bearer pk_storefront_xxxxxxxxxxxxxxxxxxxxxxxxxx"
First GraphQL Query:
Use the GraphiQL playground at /api/graphiql to run:
query {
products {
edges {
node {
id
name
sku
price
}
}
}
}
curl -X GET "https://your-domain.com/api/shop/products?filter[category]=electronics&filter[price][from]=50"
query {
product(id: "PRODUCT_ID") {
name
variants {
sku
price
stock
}
}
}
?page[size]=20&page[number]=1 for paginated responses.filter[price][from]=50 or filter[status]=enabled.sort=-price (descending) or sort=name.?fields[products]=name,variants.price.Example: Fetch Orders with Embedded Data
curl -X GET "https://your-domain.com/api/admin/orders?fields[orders]=items,addresses,payment" \
-H "Authorization: Bearer id|generated-token"
query {
products {
edges {
node {
id
name
variants {
sku
price
}
}
}
}
categories {
edges {
node {
id
name
products {
edges {
node {
name
}
}
}
}
}
}
}
mutation {
placeOrder(input: {
cartId: "CART_ID",
paymentMethod: { code: "credit_card" },
shippingMethod: { code: "flat_rate" }
}) {
orderId
order {
id
number
}
}
}
Settings → Integration in the admin panel.?format=csv) for large datasets (e.g., orders, products).Integration → History.Example: Bulk Update Product Status
curl -X PATCH "https://your-domain.com/api/admin/products?filter[status]=disabled" \
-H "Authorization: Bearer id|generated-token" \
-H "Content-Type: application/json" \
-d '{"data": {"status": "enabled"}}'
order.placed) via Laravel's events system.Webkul\BagistoApi\Services\ApiService into controllers/services:
public function __construct(private ApiService $apiService) {}
routes/api.php:
Route::middleware('auth:api')->group(function () {
Route::apiResource('custom-endpoint', CustomController::class);
});
api.auth for shop endpoints and api.admin for admin endpoints.ProductSerializer):
public function getCustomField($entity, string $format = null, array $context = [])
{
return $entity->customField;
}
php artisan vendor:publish --tag=api-resources
Then override in app/ApiResources.$products = Cache::remember("api_products_{$category}", 3600, function () {
return $this->apiService->getProducts(['filter[category]' => $category]);
});
.env:
STOREFRONT_RATE_LIMIT=60
ADMIN_RATE_LIMIT=30
pk_storefront_...). Ensure API_PLAYGROUND_AUTO_INJECT_STOREFRONT_KEY=true in .env.Regenerate if lost.formattedPrice) may return null if not configured. Use if in queries:
price: product { price }
formattedPrice: product { formattedPrice }
edges and pageInfo, while REST uses page[size] and page[number]._method=PATCH with ETag) for critical updates.?filter[deleted_at][null]=true).vatId in addresses).storage/logs/laravel.log) for exceptions.query GetProduct($id: ID!) {
product(id: $id) {
name
price
}
}
{ "id": "PRODUCT_ID" }
?fields[products]=name,variants.price to embed data.telescope:install.// app/Http/Controllers/Api/CustomController.php
public function customEndpoint()
{
return $this->apiService->customLogic();
}
// app/GraphQL/Mutations/CustomMutation.php
class CustomMutation extends Mutation
{
public function mutate()
{
// Logic here
}
}
php artisan vendor:publish --tag=api-serializers
Then override in app/Serializers.Product model and update the serializer:
// app/Models/Product.php
public function getCustomFieldAttribute()
{
return $this->custom_field;
}
// app/Serializers/ProductSerializer.php
public function getCustomField($entity)
{
return $entity->custom_field;
}
How can I help you explore Laravel packages today?