Docs
Dashboard
On this page

    Orders

    22 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.

    Orders with tab counts

    GET/v1/store/orders

    Or name the store: GET /v1/stores/{storeId}/orders

    orders:readlistOrders

    Parameters

    • tab"all" | "pending" | "paid" | "fulfilled" | "refunded" | "disputed" | "failed" | "partially_refunded"query
    • qstring | nullquery
    • cursorstring | nullquery
    • limitinteger | stringquery
    • productIdprd_… | nullquery
    • method"card" | "apple_pay" | "google_pay" | "paypal" | "crypto" | "bank_transfer" | "store_credit" | "manual" | "cash_app" | "skins" | "gift_code" | nullquery
    • provider"shopfast_pay" | "sandbox" | "stripe" | "paypal" | "btcpay" | "manual" | "plugin" | "crypto_direct" | "stripe_keys" | "paypal_keys" | "square" | "mollie" | "razorpay" | "paystack" | "nowpayments" | "cryptomus" | "paypal_email" | "shopify" | "paddle" | "heleket" | "sumup" | "authorize_net" | "nmi" | "skinloop" | "cashapp" | "paypal_ff" | "gift_codes" | nullquery
    • statusesstring | nullquery
    • fromstring | nullquery
    • tostring | nullquery
    • minTotalMinorinteger | string | nullquery
    • maxTotalMinorinteger | string | nullquery
    • discordIdstring | nullquery
    • countrystring | nullquery
    • keystring | nullquery
    • paymentIdstring | nullquery
    • sort"created" | "number" | "customer" | "product" | "amount" | "method" | "country" | "status"query
    • dir"asc" | "desc"query

    Response ListOrdersResponse

    • itemsOrder[]required
    • nextCursorCursor | nullrequired
    • countsOrderCountsrequired
    • checkoutsCheckoutRow[]required
    • sequencestring[]required

    Example

    curl "https://api.shopfa.st/v1/store/orders" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders', {
      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/orders",
        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/orders", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Order with fee breakdown and fulfillment timeline

    GET/v1/store/orders/{orderId}

    Or name the store: GET /v1/stores/{storeId}/orders/{orderId}

    orders:readgetOrder

    Parameters

    • orderIdord_…pathrequired

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk', {
      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/orders/ord_0123456789abcdefghjk",
        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/orders/ord_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Refund in full

    POST/v1/store/orders/{orderId}/refund

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/refund

    orders:writerefundOrder

    Parameters

    • orderIdord_…pathrequired

    Body

    • reasonstringrequired

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "reason": "string"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "reason": "string"
      }),
    });
    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/orders/ord_0123456789abcdefghjk/refund",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "reason": "string"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund", strings.NewReader(`{
      "reason": "string"
    }`))
    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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Email the buyer a review request now

    POST/v1/store/orders/{orderId}/review-request

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/review-request

    orders:writesendReviewRequest

    Parameters

    • orderIdord_…pathrequired

    Response SendReviewRequestResponse

    • sentTostringrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/review-request" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/review-request', {
      method: 'POST',
      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(
        "POST",
        "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/review-request",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/review-request", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Sandbox and test orders only: the processor opens a chargeback (signed webhook through the real pipeline)

    POST/v1/store/orders/{orderId}/simulate-dispute

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/simulate-dispute

    orders:writesimulateDispute

    Parameters

    • orderIdord_…pathrequired

    Body

    • reason"fraudulent" | "not_received" | "not_as_described" | "not_working" | "duplicate" | "unrecognized" | "credit_not_processed" | "subscription_canceled" | "wrong_item" | "general" | "other"
    • stage"chargeback" | "inquiry"

    Response DisputeDetail

    • idDisputeIdrequired
    • kindDisputeKindrequired
    • sourceDisputeSourcerequired
    • statusDisputeStatusrequired
    • reasonDisputeReasonrequired
    • orderIdOrderIdrequired
    • orderNumberstringrequired
    • customerIdCustomerId | nullrequired
    • customerNamestringrequired
    • customerEmailstringrequired
    18 more fields
    • amountMinorMinorUnitsrequired
    • feeMinorMinorUnitsrequired
    • currencyCurrencyCoderequired
    • providerGatewayProviderrequired
    • providerDisputeIdstringrequired
    • dueAtTimestamp | nullrequired
    • resolutionClaimResolution | nullrequired
    • openedAtTimestamprequired
    • closedAtTimestamp | nullrequired
    • stageDisputeStage | nullrequired
    • buyerMessagestringrequired
    • evidenceDisputeEvidencerequired
    • eventsDisputeEvent[]required
    • ledgerobjectrequired
      • heldMinorMinorUnitsrequired
      • returnedMinorMinorUnitsrequired
      • lostMinorMinorUnitsrequired
      • feeMinorMinorUnitsrequired
    • orderStatusOrderStatusrequired
    • isTestbooleanrequired
    • actionsDisputeActionsrequired
    • buyerBlockedbooleanrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/simulate-dispute" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "reason": "fraudulent",
      "stage": "chargeback"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/simulate-dispute', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "reason": "fraudulent",
        "stage": "chargeback"
      }),
    });
    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/orders/ord_0123456789abcdefghjk/simulate-dispute",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "reason": "fraudulent",
          "stage": "chargeback"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/simulate-dispute", strings.NewReader(`{
      "reason": "fraudulent",
      "stage": "chargeback"
    }`))
    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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Orders and revenue per status for today, 7 days, 4 weeks or all time (KPI cards)

    GET/v1/store/orders/stats

    Or name the store: GET /v1/stores/{storeId}/orders/stats

    orders:readrole: orders:readgetOrderStats

    Parameters

    • period"today" | "7d" | "4w" | "all"query

    Response OrderStats

    • periodOrderStatsPeriodrequired
    • currencyCurrencyCoderequired
    • fromTimestamp | nullrequired
    • timezonestringrequired
    • groupsOrderStatusStat[]required
    • totalsobjectrequired
      • ordersintegerrequired
      • grossMinorMinorUnitsrequired
      • refundedMinorMinorUnitsrequired
      • netMinorMinorUnitsrequired
      • averageOrderMinorMinorUnitsrequired
    • awaitingPaymentintegerrequired
    • abandonedintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/orders/stats" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/stats', {
      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/orders/stats",
        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/orders/stats", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Every order matching the tab, search and filters, as CSV or JSON (up to 10,000 rows)

    GET/v1/store/orders/export

    Or name the store: GET /v1/stores/{storeId}/orders/export

    orders:readrole: orders:readexportOrders

    Parameters

    • format"csv" | "json"query
    • tab"all" | "pending" | "paid" | "fulfilled" | "refunded" | "disputed" | "failed" | "partially_refunded"query
    • qstring | nullquery
    • productIdprd_… | nullquery
    • method"card" | "apple_pay" | "google_pay" | "paypal" | "crypto" | "bank_transfer" | "store_credit" | "manual" | "cash_app" | "skins" | "gift_code" | nullquery
    • provider"shopfast_pay" | "sandbox" | "stripe" | "paypal" | "btcpay" | "manual" | "plugin" | "crypto_direct" | "stripe_keys" | "paypal_keys" | "square" | "mollie" | "razorpay" | "paystack" | "nowpayments" | "cryptomus" | "paypal_email" | "shopify" | "paddle" | "heleket" | "sumup" | "authorize_net" | "nmi" | "skinloop" | "cashapp" | "paypal_ff" | "gift_codes" | nullquery
    • statusesstring | nullquery
    • fromstring | nullquery
    • tostring | nullquery
    • minTotalMinorinteger | string | nullquery
    • maxTotalMinorinteger | string | nullquery
    • discordIdstring | nullquery
    • countrystring | nullquery
    • keystring | nullquery
    • paymentIdstring | nullquery
    • sort"created" | "number" | "customer" | "product" | "amount" | "method" | "country" | "status"query
    • dir"asc" | "desc"query

    Response OrderExport

    • filenamestringrequired
    • contentTypestringrequired
    • bodystringrequired
    • rowsintegerrequired

    Example

    curl "https://api.shopfa.st/v1/store/orders/export" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/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/orders/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/orders/export", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Refund part or all of what is left, to the payment method or to store credit. Idempotent per key

    POST/v1/store/orders/{orderId}/refunds

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/refunds

    orders:writerole: orders:writecreateOrderRefund

    Parameters

    • orderIdord_…pathrequired

    Body

    • amountMinorintegerrequired
    • reasonstringrequired
    • destination"original" | "store_credit"
    • idempotencyKeystringrequired
    • bonusboolean

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refunds" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "amountMinor": 1,
      "reason": "string",
      "destination": "original",
      "idempotencyKey": "string",
      "bonus": false
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refunds', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "amountMinor": 1,
        "reason": "string",
        "destination": "original",
        "idempotencyKey": "string",
        "bonus": 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/orders/ord_0123456789abcdefghjk/refunds",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "amountMinor": 1,
          "reason": "string",
          "destination": "original",
          "idempotencyKey": "string",
          "bonus": False
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refunds", strings.NewReader(`{
      "amountMinor": 1,
      "reason": "string",
      "destination": "original",
      "idempotencyKey": "string",
      "bonus": 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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Add a private note to an order

    POST/v1/store/orders/{orderId}/notes

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/notes

    orders:writerole: orders:writeaddOrderNote

    Parameters

    • orderIdord_…pathrequired

    Body

    • bodystringrequired

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/notes" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "body": "string"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/notes', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "body": "string"
      }),
    });
    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/orders/ord_0123456789abcdefghjk/notes",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "body": "string"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/notes", strings.NewReader(`{
      "body": "string"
    }`))
    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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Delete a note

    DELETE/v1/store/orders/{orderId}/notes/{noteId}

    Or name the store: DELETE /v1/stores/{storeId}/orders/{orderId}/notes/{noteId}

    orders:writerole: orders:writedeleteOrderNote

    Parameters

    • orderIdord_…pathrequired
    • noteIdont_…pathrequired

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X DELETE "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/notes/ont_0123456789abcdefghjk" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/notes/ont_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/orders/ord_0123456789abcdefghjk/notes/ont_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/orders/ord_0123456789abcdefghjk/notes/ont_0123456789abcdefghjk", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Block or unblock the buyer's email and/or checkout IP (the store's fraud blocklist)

    PUT/v1/store/orders/{orderId}/block

    Or name the store: PUT /v1/stores/{storeId}/orders/{orderId}/block

    orders:writerole: customers:writeblockOrderBuyer

    Parameters

    • orderIdord_…pathrequired

    Body

    • emailbooleanrequired
    • ipbooleanrequired
    • reasonstring

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X PUT "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/block" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "email": false,
      "ip": false,
      "reason": ""
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/block', {
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "email": false,
        "ip": false,
        "reason": ""
      }),
    });
    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/orders/ord_0123456789abcdefghjk/block",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "email": False,
          "ip": False,
          "reason": ""
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/block", strings.NewReader(`{
      "email": false,
      "ip": false,
      "reason": ""
    }`))
    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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Revoke delivered keys and deliver fresh ones from the pool (the buyer is emailed the new keys)

    POST/v1/store/orders/{orderId}/replace-keys

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/replace-keys

    orders:writerole: orders:writereplaceOrderKeys

    Parameters

    • orderIdord_…pathrequired

    Body

    • keyIdskey_…[]required
    • reasonstring
    • notifyboolean

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/replace-keys" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "keyIds": [
        "key_0123456789abcdefghjk"
      ],
      "reason": "",
      "notify": true
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/replace-keys', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "keyIds": [
          "key_0123456789abcdefghjk"
        ],
        "reason": "",
        "notify": true
      }),
    });
    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/orders/ord_0123456789abcdefghjk/replace-keys",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "keyIds": [
            "key_0123456789abcdefghjk"
          ],
          "reason": "",
          "notify": True
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/replace-keys", strings.NewReader(`{
      "keyIds": [
        "key_0123456789abcdefghjk"
      ],
      "reason": "",
      "notify": true
    }`))
    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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Email the buyer their receipt again, with their license keys and fresh download links (3 per order per hour)

    POST/v1/store/orders/{orderId}/resend-delivery

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/resend-delivery

    orders:writerole: orders:writeresendOrderDelivery

    Parameters

    • orderIdord_…pathrequired

    Response ResendDeliveryResult

    • sentTostringrequired
    • emails"receipt" | "license_key" | "download_ready"[]required
    • keysintegerrequired
    • downloadsintegerrequired
    • remainingintegerrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/resend-delivery" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/resend-delivery', {
      method: 'POST',
      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(
        "POST",
        "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/resend-delivery",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/resend-delivery", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Put failed delivery steps back in the queue and run fulfillment again

    POST/v1/store/orders/{orderId}/retry-delivery

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/retry-delivery

    orders:writerole: orders:writeretryOrderDelivery

    Parameters

    • orderIdord_…pathrequired

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/retry-delivery" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/retry-delivery', {
      method: 'POST',
      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(
        "POST",
        "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/retry-delivery",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/retry-delivery", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Complete an order that is waiting for a manual payment (your own gateway or a test order): runs delivery like a gateway payment

    POST/v1/store/orders/{orderId}/mark-paid

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/mark-paid

    orders:writerole: orders:writemarkOrderPaid

    Parameters

    • orderIdord_…pathrequired

    Body

    • notestring

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/mark-paid" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "note": ""
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/mark-paid', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "note": ""
      }),
    });
    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/orders/ord_0123456789abcdefghjk/mark-paid",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "note": ""
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/mark-paid", strings.NewReader(`{
      "note": ""
    }`))
    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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Deliver an order that was held for review

    POST/v1/store/orders/{orderId}/release-hold

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/release-hold

    orders:writerole: orders:writereleaseOrderHold

    Parameters

    • orderIdord_…pathrequired

    Response OrderDetail

    • idOrderIdrequired
    • numberstringrequired
    • storeIdStoreIdrequired
    • customerCustomerRefrequired
    • itemsOrderItem[]required
    • feesFeeBreakdownrequired
    • providerGatewayProviderrequired
    • paymentMethodPaymentMethodrequired
    • coveredByFreeCover | nullrequired
    • statusOrderStatusrequired
    24 more fields
    • isTestbooleanrequired
    • createdAtTimestamprequired
    • paidAtTimestamp | nullrequired
    • refundedMinorMinorUnitsrequired
    • stepsFulfillmentStep[]required
    • refundsOrderRefund[]required
    • customFieldsobject[]required
      • idstringrequired
      • labelstringrequired
      • valuestringrequired
    • buyerNotestringrequired
    • clientobject | nullrequired
    • discountsobject[]required
      • codestringrequired
      • titlestringrequired
      • amountMinorMinorUnitsrequired
    • giftCardobject | nullrequired
    • storeCreditMinorMinorUnitsrequired
    • affiliateobject | nullrequired
    • paymentobjectrequired
      • providerPaymentIdstringrequired
      • providerUrlstringrequired
      • mode"test" | "live" | nullrequired
    • deliveredobjectrequired
      • keysOrderDeliveredKey[]required
      • downloadsobject[]required
        • productIdProductIdrequired
        • namestringrequired
        • downloadsintegerrequired
      • discordRolesobject[]required
        • roleNamestringrequired
        • statusstringrequired
      • giftCardsobject[]required
        • last4stringrequired
        • amountMinorMinorUnitsrequired
    • notesOrderNote[]required
    • manualobject | nullrequired
    • blockedobjectrequired
      • emailbooleanrequired
      • ipbooleanrequired
    • discordUserIdstringrequired
    • orderPageUrlstringrequired
    • fulfilledAtTimestamp | nullrequired
    • refundedAtTimestamp | nullrequired
    • attentionobject | nullrequired
    • claimsobject[]required
      • idstringrequired
      • kind"claim" | "chargeback"required
      • statusstringrequired
      • reasonstringrequired
      • openedAtTimestamprequired
      • closedAtTimestamp | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/release-hold" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/release-hold', {
      method: 'POST',
      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(
        "POST",
        "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/release-hold",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/release-hold", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    The order’s open (or latest) refund offer and the store’s credit refund settings

    GET/v1/store/orders/{orderId}/refund-offer

    Or name the store: GET /v1/stores/{storeId}/orders/{orderId}/refund-offer

    orders:readrole: orders:readgetOrderRefundOffer

    Parameters

    • orderIdord_…pathrequired

    Response OrderRefundOffers

    • settingsCreditRefundSettingsrequired
    • offerRefundOffer | nullrequired

    Example

    curl "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer', {
      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/orders/ord_0123456789abcdefghjk/refund-offer",
        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/orders/ord_0123456789abcdefghjk/refund-offer", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Offer the buyer a refund they take as store credit with the bonus or as money back (emailed; shown on their order page)

    POST/v1/store/orders/{orderId}/refund-offer

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/refund-offer

    orders:writerole: orders:writecreateRefundOffer

    Parameters

    • orderIdord_…pathrequired

    Body

    • amountMinorintegerrequired
    • reasonstringrequired

    Response OrderRefundOffers

    • settingsCreditRefundSettingsrequired
    • offerRefundOffer | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "amountMinor": 1,
      "reason": "string"
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "amountMinor": 1,
        "reason": "string"
      }),
    });
    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/orders/ord_0123456789abcdefghjk/refund-offer",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "amountMinor": 1,
          "reason": "string"
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer", strings.NewReader(`{
      "amountMinor": 1,
      "reason": "string"
    }`))
    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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Withdraw an offer the buyer has not answered

    POST/v1/store/orders/{orderId}/refund-offer/{offerId}/cancel

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/refund-offer/{offerId}/cancel

    orders:writerole: orders:writecancelRefundOffer

    Parameters

    • orderIdord_…pathrequired
    • offerIdrfo_…pathrequired

    Response OrderRefundOffers

    • settingsCreditRefundSettingsrequired
    • offerRefundOffer | nullrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer/rfo_0123456789abcdefghjk/cancel" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer/rfo_0123456789abcdefghjk/cancel', {
      method: 'POST',
      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(
        "POST",
        "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer/rfo_0123456789abcdefghjk/cancel",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refund-offer/rfo_0123456789abcdefghjk/cancel", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Queue a refund for 10 seconds (undo window), then send it like createOrderRefund

    POST/v1/store/orders/{orderId}/refunds/queue

    Or name the store: POST /v1/stores/{storeId}/orders/{orderId}/refunds/queue

    orders:writerole: orders:writequeueOrderRefund

    Parameters

    • orderIdord_…pathrequired

    Body

    • amountMinorintegerrequired
    • reasonstringrequired
    • destination"original" | "store_credit"
    • idempotencyKeystringrequired
    • bonusboolean

    Response PendingAction

    • idPendingActionIdrequired
    • kindPendingActionKindrequired
    • labelstringrequired
    • statePendingActionStaterequired
    • commitAtTimestamprequired
    • createdAtTimestamprequired
    • settledAtTimestamp | nullrequired
    • errorstringrequired
    • targetobjectrequired
      • kind"order" | "campaign" | "product" | "products" | "discounts"required
      • idstringrequired
    • actorNamestringrequired
    • minebooleanrequired

    Example

    curl -X POST "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refunds/queue" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
      "amountMinor": 1,
      "reason": "string",
      "destination": "original",
      "idempotencyKey": "string",
      "bonus": false
    }'
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refunds/queue', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        "amountMinor": 1,
        "reason": "string",
        "destination": "original",
        "idempotencyKey": "string",
        "bonus": 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/orders/ord_0123456789abcdefghjk/refunds/queue",
        headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
        json={
          "amountMinor": 1,
          "reason": "string",
          "destination": "original",
          "idempotencyKey": "string",
          "bonus": False
        },
    )
    res.raise_for_status()
    data = res.json()
    req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/refunds/queue", strings.NewReader(`{
      "amountMinor": 1,
      "reason": "string",
      "destination": "original",
      "idempotencyKey": "string",
      "bonus": 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

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Subscriptions this order started or renewed, with auto-renew state, charges and the audit trail

    GET/v1/store/orders/{orderId}/auto-renew

    Or name the store: GET /v1/stores/{storeId}/orders/{orderId}/auto-renew

    orders:readrole: orders:readlistOrderAutoRenew

    Parameters

    • orderIdord_…pathrequired

    Response SellerAutoRenewList

    • subscriptionsSellerAutoRenewSubscription[]required

    Example

    curl "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/auto-renew" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/auto-renew', {
      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/orders/ord_0123456789abcdefghjk/auto-renew",
        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/orders/ord_0123456789abcdefghjk/auto-renew", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    The order's invoice and credit notes

    GET/v1/store/orders/{orderId}/invoices

    Or name the store: GET /v1/stores/{storeId}/orders/{orderId}/invoices

    orders:readrole: orders:readlistOrderInvoices

    Parameters

    • orderIdord_…pathrequired

    Response ListOrderInvoicesResponse

    • itemsInvoiceRow[]required

    Example

    curl "https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/invoices" \
      -H "Authorization: Bearer $SHOPFAST_API_KEY"
    const res = await fetch('https://api.shopfa.st/v1/store/orders/ord_0123456789abcdefghjk/invoices', {
      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/orders/ord_0123456789abcdefghjk/invoices",
        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/orders/ord_0123456789abcdefghjk/invoices", nil)
    req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
    res, err := http.DefaultClient.Do(req)
    Try it with your key

    Use a test key on a development store. The key stays in this tab (sessionStorage) and is sent only to the base URL above.

    Was this page helpful?