Discounts
14 endpoints. Each needs an API key or OAuth token with the scope shown; the key already names its store, so paths start at /v1/store. Generated from the live contract; also in openapi.json.
Discount codes and automatic discounts with uses and revenue
/v1/store/discountsOr name the store: GET /v1/stores/{storeId}/discounts
Parameters
tab"all" | "active" | "scheduled" | "expired" | "disabled"queryqstring | nullquery
Response ListDiscountsResponse
itemsDiscount[]requiredcountsDiscountCountsrequired
Example
curl "https://api.shopfa.st/v1/store/discounts" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/discounts",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/discounts", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Create a discount
/v1/store/discountsOr name the store: POST /v1/stores/{storeId}/discounts
Body
kind"code" | "automatic"requiredcodestring | nullrequiredtitlestringrequiredvalueType"percent" | "fixed" | "free"requiredvalueintegerrequiredscope"all" | "products" | "collections" | "categories"requiredproductIdsprd_…[]requiredcollectionIdscol_…[]requiredcategoryIdspcat_…[]minSubtotalMinorintegerrequiredusageLimitinteger | nullrequiredperCustomerLimitinteger | nullrequiredstartsAtstringrequiredendsAtstring | nullrequiredcombinablebooleanrequiredautoAddFreeProductsbooleanrequiredenabledbooleanrequireddisabledMethods"card" | "apple_pay" | "google_pay" | "paypal" | "crypto" | "bank_transfer" | "store_credit" | "manual" | "cash_app" | "skins" | "gift_code"[]variantIdsvar_…[]showInAccountbooleanfirstOrderOnlybooleanminQuantityintegerdurations"1d" | "3d" | "7d" | "14d" | "30d" | "90d" | "180d" | "365d" | "lifetime"[]ruleobjectexcludeSaleItemsbooleanpriorityintegeractiveHoursobject | nullbulkCodesboolean
Response Discount
kindDiscountKindrequiredcodeDiscountCode | nullrequiredtitlestringrequiredvalueTypeDiscountValueTyperequiredvalueintegerrequiredscopeDiscountScoperequiredproductIdsProductId[]requiredcollectionIdsCollectionId[]requiredcategoryIdsCategoryId[]requiredminSubtotalMinorMinorUnitsrequired
26 more fields
usageLimitinteger | nullrequiredperCustomerLimitinteger | nullrequiredstartsAtTimestamprequiredendsAtTimestamp | nullrequiredcombinablebooleanrequiredautoAddFreeProductsbooleanrequiredenabledbooleanrequireddisabledMethodsPaymentMethod[]requiredvariantIdsVariantId[]requiredshowInAccountbooleanrequiredfirstOrderOnlybooleanrequiredminQuantityintegerrequireddurationsDurationKey[]requiredruleDiscountRulerequiredexcludeSaleItemsbooleanrequiredpriorityintegerrequiredactiveHoursActiveHours | nullrequiredbulkCodesbooleanrequiredidDiscountIdrequiredstatusDiscountStatusrequiredtimesUsedintegerrequiredrevenueMinorMinorUnitsrequireddiscountedMinorMinorUnitsrequiredcurrencyCurrencyCoderequiredcreatedAtTimestamprequiredupdatedAtTimestamprequired
Example
curl -X POST "https://api.shopfa.st/v1/store/discounts" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": false,
"autoAddFreeProducts": false,
"enabled": false,
"disabledMethods": [],
"variantIds": [],
"showInAccount": false,
"firstOrderOnly": false,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": false,
"priority": 50,
"activeHours": null,
"bulkCodes": false
}'const res = await fetch('https://api.shopfa.st/v1/store/discounts', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": false,
"autoAddFreeProducts": false,
"enabled": false,
"disabledMethods": [],
"variantIds": [],
"showInAccount": false,
"firstOrderOnly": false,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": false,
"priority": 50,
"activeHours": null,
"bulkCodes": false
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/discounts",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": False,
"autoAddFreeProducts": False,
"enabled": False,
"disabledMethods": [],
"variantIds": [],
"showInAccount": False,
"firstOrderOnly": False,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": False,
"priority": 50,
"activeHours": None,
"bulkCodes": False
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/discounts", strings.NewReader(`{
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": false,
"autoAddFreeProducts": false,
"enabled": false,
"disabledMethods": [],
"variantIds": [],
"showInAccount": false,
"firstOrderOnly": false,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": false,
"priority": 50,
"activeHours": null,
"bulkCodes": false
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Update a discount (orders already paid keep their discount)
/v1/store/discounts/{discountId}Or name the store: PUT /v1/stores/{storeId}/discounts/{discountId}
Parameters
discountIddsc_…pathrequired
Body
kind"code" | "automatic"requiredcodestring | nullrequiredtitlestringrequiredvalueType"percent" | "fixed" | "free"requiredvalueintegerrequiredscope"all" | "products" | "collections" | "categories"requiredproductIdsprd_…[]requiredcollectionIdscol_…[]requiredcategoryIdspcat_…[]minSubtotalMinorintegerrequiredusageLimitinteger | nullrequiredperCustomerLimitinteger | nullrequiredstartsAtstringrequiredendsAtstring | nullrequiredcombinablebooleanrequiredautoAddFreeProductsbooleanrequiredenabledbooleanrequireddisabledMethods"card" | "apple_pay" | "google_pay" | "paypal" | "crypto" | "bank_transfer" | "store_credit" | "manual" | "cash_app" | "skins" | "gift_code"[]variantIdsvar_…[]showInAccountbooleanfirstOrderOnlybooleanminQuantityintegerdurations"1d" | "3d" | "7d" | "14d" | "30d" | "90d" | "180d" | "365d" | "lifetime"[]ruleobjectexcludeSaleItemsbooleanpriorityintegeractiveHoursobject | nullbulkCodesboolean
Response Discount
kindDiscountKindrequiredcodeDiscountCode | nullrequiredtitlestringrequiredvalueTypeDiscountValueTyperequiredvalueintegerrequiredscopeDiscountScoperequiredproductIdsProductId[]requiredcollectionIdsCollectionId[]requiredcategoryIdsCategoryId[]requiredminSubtotalMinorMinorUnitsrequired
26 more fields
usageLimitinteger | nullrequiredperCustomerLimitinteger | nullrequiredstartsAtTimestamprequiredendsAtTimestamp | nullrequiredcombinablebooleanrequiredautoAddFreeProductsbooleanrequiredenabledbooleanrequireddisabledMethodsPaymentMethod[]requiredvariantIdsVariantId[]requiredshowInAccountbooleanrequiredfirstOrderOnlybooleanrequiredminQuantityintegerrequireddurationsDurationKey[]requiredruleDiscountRulerequiredexcludeSaleItemsbooleanrequiredpriorityintegerrequiredactiveHoursActiveHours | nullrequiredbulkCodesbooleanrequiredidDiscountIdrequiredstatusDiscountStatusrequiredtimesUsedintegerrequiredrevenueMinorMinorUnitsrequireddiscountedMinorMinorUnitsrequiredcurrencyCurrencyCoderequiredcreatedAtTimestamprequiredupdatedAtTimestamprequired
Example
curl -X PUT "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": false,
"autoAddFreeProducts": false,
"enabled": false,
"disabledMethods": [],
"variantIds": [],
"showInAccount": false,
"firstOrderOnly": false,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": false,
"priority": 50,
"activeHours": null,
"bulkCodes": false
}'const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": false,
"autoAddFreeProducts": false,
"enabled": false,
"disabledMethods": [],
"variantIds": [],
"showInAccount": false,
"firstOrderOnly": false,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": false,
"priority": 50,
"activeHours": null,
"bulkCodes": false
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": False,
"autoAddFreeProducts": False,
"enabled": False,
"disabledMethods": [],
"variantIds": [],
"showInAccount": False,
"firstOrderOnly": False,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": False,
"priority": 50,
"activeHours": None,
"bulkCodes": False
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk", strings.NewReader(`{
"kind": "code",
"code": "string",
"title": "string",
"valueType": "percent",
"value": 0,
"scope": "all",
"productIds": [
"prd_0123456789abcdefghjk"
],
"collectionIds": [
"col_0123456789abcdefghjk"
],
"categoryIds": [],
"minSubtotalMinor": 0,
"usageLimit": 1,
"perCustomerLimit": 1,
"startsAt": "2026-10-21T12:00:00.000Z",
"endsAt": "2026-10-21T12:00:00.000Z",
"combinable": false,
"autoAddFreeProducts": false,
"enabled": false,
"disabledMethods": [],
"variantIds": [],
"showInAccount": false,
"firstOrderOnly": false,
"minQuantity": 0,
"durations": [],
"rule": {
"type": "standard"
},
"excludeSaleItems": false,
"priority": 50,
"activeHours": null,
"bulkCodes": false
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Delete a discount that was never used (disable used ones)
/v1/store/discounts/{discountId}Or name the store: DELETE /v1/stores/{storeId}/discounts/{discountId}
Parameters
discountIddsc_…pathrequired
Response Ok
okbooleanrequired
Example
curl -X DELETE "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"DELETE",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Orders, customers, revenue and a daily series for one discount
/v1/store/discounts/{discountId}/analyticsOr name the store: GET /v1/stores/{storeId}/discounts/{discountId}/analytics
Parameters
discountIddsc_…pathrequireddaysinteger | stringquery
Response DiscountAnalytics
discountIdstringrequiredcurrencyCurrencyCoderequiredordersintegerrequiredcustomersintegerrequiredrevenueMinorMinorUnitsrequireddiscountedMinorMinorUnitsrequiredaverageOrderMinorMinorUnitsrequiredseriesobject[]requireddateIsoDaterequiredordersintegerrequiredrevenueMinorMinorUnitsrequireddiscountedMinorMinorUnitsrequired
recentobject[]requiredorderIdOrderIdrequirednumberstringrequiredemailEmailrequiredtotalMinorMinorUnitsrequireddiscountMinorMinorUnitsrequiredstatusOrderStatusrequiredcreatedAtTimestamprequired
Example
curl "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/analytics" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/analytics', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/analytics",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/analytics", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Delete the chosen discounts; ones already used in orders are disabled instead so their history stays
/v1/store/discounts/bulk-deleteOr name the store: POST /v1/stores/{storeId}/discounts/bulk-delete
Body
idsdsc_…[]required
Response BulkDeleteDiscountsResponse
deletedintegerrequireddisabledintegerrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/discounts/bulk-delete" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"dsc_0123456789abcdefghjk"
]
}'const res = await fetch('https://api.shopfa.st/v1/store/discounts/bulk-delete', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"dsc_0123456789abcdefghjk"
]
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/discounts/bulk-delete",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"ids": [
"dsc_0123456789abcdefghjk"
]
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/discounts/bulk-delete", strings.NewReader(`{
"ids": [
"dsc_0123456789abcdefghjk"
]
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
A discount's generated codes with their uses
/v1/store/discounts/{discountId}/codesOr name the store: GET /v1/stores/{storeId}/discounts/{discountId}/codes
Parameters
discountIddsc_…pathrequiredtab"all" | "unused" | "used" | "disabled"queryqstringquerypageinteger | stringquerysort"created" | "code" | "uses" | "email" | "source" | "last"querydir"asc" | "desc"query
Response DiscountCodePage
itemsDiscountCodeRow[]requiredtotalintegerrequiredcountsobjectrequiredallintegerrequiredunusedintegerrequiredusedintegerrequireddisabledintegerrequired
batchesobject[]requiredidCodeBatchIdrequiredprefixstringrequiredcountintegerrequiredusesPerCodeintegerrequiredcreatedAtTimestamprequired
Example
curl "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Generate unique codes for a discount (prefix, count, uses per code, optional email per code)
/v1/store/discounts/{discountId}/codesOr name the store: POST /v1/stores/{storeId}/discounts/{discountId}/codes
Parameters
discountIddsc_…pathrequired
Body
prefixstringcountintegerrequiredlengthintegerusesPerCodeintegeremailsstring[]
Response GeneratedCodes
batchIdCodeBatchIdrequiredcreatedintegerrequiredsamplestring[]required
Example
curl -X POST "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prefix": "",
"count": 1,
"length": 8,
"usesPerCode": 1,
"emails": []
}'const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"prefix": "",
"count": 1,
"length": 8,
"usesPerCode": 1,
"emails": []
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"prefix": "",
"count": 1,
"length": 8,
"usesPerCode": 1,
"emails": []
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes", strings.NewReader(`{
"prefix": "",
"count": 1,
"length": 8,
"usesPerCode": 1,
"emails": []
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Turn one generated code off or on
/v1/store/discounts/{discountId}/codes/{code}Or name the store: PATCH /v1/stores/{storeId}/discounts/{discountId}/codes/{code}
Parameters
discountIddsc_…pathrequiredcodestringpathrequired
Body
disabledbooleanrequired
Response DiscountCodeRow
codestringrequiredusageLimitintegerrequiredtimesUsedintegerrequiredassignedEmailEmail | nullrequireddisabledbooleanrequiredbatchIdCodeBatchId | nullrequiredsource"batch" | "popup"requiredcreatedAtTimestamprequiredlastUsedAtTimestamp | nullrequired
Example
curl -X PATCH "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/string" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"disabled": false
}'const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/string', {
method: 'PATCH',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"disabled": false
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PATCH",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/string",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"disabled": False
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PATCH", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/string", strings.NewReader(`{
"disabled": false
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Every generated code as CSV (code, uses, limit, email, status)
/v1/store/discounts/{discountId}/codes/exportOr name the store: GET /v1/stores/{storeId}/discounts/{discountId}/codes/export
Parameters
discountIddsc_…pathrequired
Response FileExport
filenamestringrequiredcontentTypestringrequiredbodystringrequiredrowsintegerrequired
Example
curl "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/export" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/export', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/export",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/codes/export", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Orders, revenue, conversion from entered to paid, top products and why codes did not apply
/v1/store/discounts/{discountId}/reportOr name the store: GET /v1/stores/{storeId}/discounts/{discountId}/report
Parameters
discountIddsc_…pathrequireddaysinteger | stringquery
Response CouponReport
discountobjectrequiredidDiscountIdrequiredkindDiscountKindrequiredcodestringrequiredtitlestringrequiredstatusDiscountStatusrequiredbulkCodesbooleanrequired
currencyCurrencyCoderequireddaysintegerrequiredkpisobjectrequiredordersintegerrequiredrevenueMinorMinorUnitsrequireddiscountedMinorMinorUnitsrequiredaverageOrderMinorMinorUnitsrequiredbuyersintegerrequiredenteredintegerrequiredrejectedintegerrequiredconversionBpsintegerrequiredheldintegerrequired
codesobject | nullrequiredseriesobject[]requireddateIsoDaterequiredordersintegerrequiredrevenueMinorMinorUnitsrequireddiscountedMinorMinorUnitsrequiredenteredintegerrequired
topProductsobject[]requiredproductIdstringrequirednamestringrequiredunitsintegerrequiredrevenueMinorMinorUnitsrequired
reasonsobject[]requireddetailstringrequiredcountintegerrequired
Example
curl "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/report" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/report', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/report",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/report", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
The usage log: every time the code was entered, rejected, redeemed or held, newest first (or by `sort`)
/v1/store/discounts/{discountId}/usageOr name the store: GET /v1/stores/{storeId}/discounts/{discountId}/usage
Parameters
discountIddsc_…pathrequiredcursorinteger | string | nullqueryevent"entered" | "rejected" | "redeemed" | "held" | nullquerysort"at" | "event" | "code" | "email" | "order" | "amount"querydir"asc" | "desc"query
Response CouponUsagePage
itemsCouponUsageEntry[]requirednextCursorinteger | nullrequired
Example
curl "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
The usage log as CSV (up to 20,000 rows)
/v1/store/discounts/{discountId}/usage/exportOr name the store: GET /v1/stores/{storeId}/discounts/{discountId}/usage/export
Parameters
discountIddsc_…pathrequired
Response FileExport
filenamestringrequiredcontentTypestringrequiredbodystringrequiredrowsintegerrequired
Example
curl "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage/export" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage/export', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage/export",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/discounts/dsc_0123456789abcdefghjk/usage/export", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Queue deleting discounts for 10 seconds (undo window), then delete like bulkDeleteDiscounts
/v1/store/discounts/bulk-delete-queueOr name the store: POST /v1/stores/{storeId}/discounts/bulk-delete-queue
Body
idsdsc_…[]required
Response PendingAction
idPendingActionIdrequiredkindPendingActionKindrequiredlabelstringrequiredstatePendingActionStaterequiredcommitAtTimestamprequiredcreatedAtTimestamprequiredsettledAtTimestamp | nullrequirederrorstringrequiredtargetobjectrequiredkind"order" | "campaign" | "product" | "products" | "discounts"requiredidstringrequired
actorNamestringrequiredminebooleanrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/discounts/bulk-delete-queue" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ids": [
"dsc_0123456789abcdefghjk"
]
}'const res = await fetch('https://api.shopfa.st/v1/store/discounts/bulk-delete-queue', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"ids": [
"dsc_0123456789abcdefghjk"
]
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/discounts/bulk-delete-queue",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"ids": [
"dsc_0123456789abcdefghjk"
]
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/discounts/bulk-delete-queue", strings.NewReader(`{
"ids": [
"dsc_0123456789abcdefghjk"
]
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)