New: Application API docs
Pick the API you are reading here — the Merchant API for your own store, the Application API for partner apps.
Everything you need to integrate with the Gini v2 Third-Party API.
Every change to this API that you can observe from your side — new headers, changed payloads, fixed endpoints — newest first. Nothing here requires action unless an entry says so.
POST /products/price-updates is now POST /products/stock-updates, and an item can set a quantity as well as a price. Action needed: send your requests to the new path; the old one now answers 405 Method Not Allowed.
POST /products/bulk-delete deletes up to 500 products by SKU, sent as a JSON list. The request is checked at once, the products are deleted in the background, and the result arrives on your webhook.
POST /products/price-updates now also takes is_visible on an item, to put a product on the storefront or take it off, with or without a new price. Requests you already send work as before.
POST /products/price-updates sets new prices for up to 500 products or variants in one request. The request is checked at once and the prices are written in the background.
A product description may now hold at most 1000 words. Action needed if you send longer ones: shorten them before sending.
Reel videos must now be MP4. MOV and WebM uploads are refused. Action needed if you send either: convert to MP4 before uploading.
A discount can now cover all your products, a category, or some of its subcategories, not only products you pick. It can take a fixed amount off each unit instead of a percentage, and a percentage can be capped per unit.
Claude and other AI assistants can now run your store through an MCP server, signed in with your dashboard login or your API key and secret.
The merchant no longer sets an order to delivered. The delivery company marks it, or the customer confirms by scanning the order\'s QR code.
Once an order is handed to delivery it stays handed over, from the dashboard and from the API.
The promotional videos customers watch in the SuperQi app can now be listed, created, updated and deleted over the API. Previously they were dashboard-only.
An entitlements block listing the features switched on for you: reels, pre-orders, wholesale selling, multiple branches, product labels, installment months and on-site installments.
The product list accepted only search and per_page. It now takes the same nine filters the dashboard offers, plus sorting — and because the exports reuse them, POST /exports/products is no longer limited to a text search either.
The API could read is_pre_order but never set it, and the customer-facing terms were unreachable. Create and update now accept the toggle and its terms, and the terms come back on the product.
Abandoned carts, wholesale orders and the restock stock template can now be queued over the API. The wholesale group had no export at all.
Every merchant that has ordered from your wholesale catalogue, with their lifetime figures.
While a listing check is under review, an is_visible you send is dropped. The response now tells you so, instead of looking like a write that quietly did nothing.
Three fixes to what the product endpoints hand back, each of which made a correct request look like a failed one.
If you have no delivery company there is no carrier to hand an order to. Both delivery-network actions now say that, instead of failing confusingly.
Two places where the docs described something the API does not do.
Two more bulk actions from the dashboard: mark or delete several notifications at once by id, and queue one export of every transaction across the settlements matching your rail/date filter.
The finance endpoints now go beyond the settlement and debt lists: a transaction ledger, aggregate stats for settlements and debts, rail/date filters on settlements, and a queued export of a settlement's transactions.
The order endpoints now cover the rest of the dashboard's order actions: list the valid rejection reasons, hand an order off to delivery and pull it back, and request a delivery cancellation.
Read your notification feed over the API — list (with the dashboard's type filters), unread count, mark one or all read, and delete — matching the dashboard's notifications screen.
Product create and update now accept the remaining dashboard fields: is_used, allow_multiple_addons, sort_order, product_label, client_store_id (branch assignment), and the wholesale fields is_b2b_enabled, b2b_price and b2b_min_quantity. They are also returned on product reads.
Manage a product's add-ons over the API — the optional extras a customer can attach — as a per-product sub-resource under /products/{sku}/addons, matching the dashboard's add-ons editor.
Read and update your own store profile over the API — business details, location, logo and cover — the same data the dashboard's Profile screen manages.
The dashboard's headline figures — wallet stages, order mix, payout totals and abandoned-cart numbers — are now one read on the API, computed the same way the dashboard computes them.
Read and set your store settings over the API: weekly opening hours, the weekly ordering schedule, and delivery settings (fulfilment toggles plus, for self-delivery merchants, per-state charges).
Four more dashboard areas are now full CRUD on the API: product collections, influencers, store branches, and operators (staff sub-accounts).
Four read-only resources are now on the API, matching the dashboard's own screens: your abandoned carts (with the customer's reachable contact number), your reviews, your settlement batches, and your debts wallet.
You can now create, list, update and delete product discounts over the API — the same discounts the dashboard manages, honoured identically on the storefront. See the Discounts section.
Retrying a creating request after a dropped connection used to risk a duplicate. Send an Idempotency-Key header and the retry returns the original response instead of creating a second record.
Every method on /attributes returned 500 because the API queried a relation that does not exist. If you tried to list, read, create, update or delete an attribute and gave up, it works now.
The Webhooks section described two things that were not true. The code did not change; the documentation did.
A 401 used to say only that the signature was invalid, which covered six unrelated mistakes. The rejection now carries a diagnostics object naming the likely cause.