All client APIs

Get all orders

End point

https://app.servicepoints.nl/api/v2/client/get-orders-for-client

Method

POST

Parameters

order_idnumberoptional
min_datedate [yyyy-mm-dd]optional
max_datedate [yyyy-mm-dd]optional
pagenumberoptional
store_idnumberoptional
agent_idnumberoptional
admin_supplier_idnumberoptional
shopify_order_idnumberoptional
shopify_order_detail_idnumberoptional
require_raw_shopify_datamust be trueoptional
min_order_idnumberoptional (should always be less than max_order_id)
max_order_idnumberoptional
shopify_store_nametextoptional
customer_nametextoptional
agent_nametextoptional
admin_supplier_nametextoptional
get_orders_quoted_in_last_24_hoursmust be trueoptional
order_statusnumberoptional
shipping_statusnumberoptional
order_payment_statusbooleanoptional
fulfillment_statustext [fulfilled]optional
sort_by_time_quotedvalues [asc/desc]optional
sort_by_sp_order_idvalues [asc/desc]optional

All the parameters should be post in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location --request POST 'https://app.servicepoints.nl/api/v2/client/get-orders-for-client' \ 
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \ 
    --header 'Content-Type: application/json' \ 
    --data-raw '{"page" : 1}' 
                                    
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

"total_quote_price":   Total quote price is the order price of each single merged order item.

"quote_price":   It is the order price of each single merged order item.

"app_order_detail_number":   App order detail number is the order identification number but it can vary on the basis of production quotation unit prices,

"shopify_order_detail_id":   Shopify order detail id is the identification number from Shopify,

"mapped_order_ids":   mapped order ids are the unique order ids which are merged in our system and it will always be the same. If a Shopify order contains multiple variants of the same product and quotation unit prices are the same then we will merge that order item and create a single order in our system.

"created_date":   Created date is the date on which the order was created in Service Points, when the order was fetched from Shopify and created in our system.

"order_created_date":   Order created date is the creation date stored on the order record and can differ from "created_date"; use "created_date" for the Service Points order creation lifecycle timestamp.

"created_at":   Created at is the order creation date from Shopify, while "created_date" is the date on which the order was created in Service Points.

"processing_date" and "processing_started_at":   Both fields return the same value. Processing date is the date on which the order entered the Processing status in Service Points, when the quotation was accepted and the order was sent to the supplier. "processing_started_at" is returned inside the "line_item" object.

"processed_at":   Processed at is Shopify's own order processing timestamp returned as provided by Shopify, while "processing_date" is the Processing status timestamp in Service Points.

"payment_date" and "paid_at":   Both fields return the same value. Payment date is the date on which the order was successfully paid in Service Points, when the order amount was deducted from your balance. It is null while the order is still unpaid.

"in_transit_date":   In transit date is the date of the first In Transit event reported by the carrier and used by Service Points. It is null until an In Transit event is available for the order.

Note:   The "created_date", "processing_date", "payment_date" and "in_transit_date" fields let you measure processing and fulfillment performance, and each one is returned in yyyy-mm-dd hh:mm:ss format. If the order has not reached that stage yet, the field returns null. Older orders may also return null because some of these events were not recorded for historical orders.

Sample error response


{ "success": false, "status_code": 401, "message": "Auth token missing." }
                                    
Sample response


{
        "success": true,
        "status_code": 200,
        "data": {
            "orders_data": [
            {
                "id": "6295",
                "order_group_id": "5195",
                "order_number": "A10115",
                "created_at": "2024-07-02 06:31:51",
                "shopify_order_number": "1393",
                "shopify_order_id": "5916890235192",
                "status": "Waiting for tracking update",
                "is_shipped": "0",
                "total_price": "4.720",
                "subtotal_price": "4.000",
                "total_discounts": "0.000",
                "total_tax": "0.720",
                "total_weight": "0.00",
                "currency": "INR",
                "financial_status": "paid",
                "fulfillment_status": "fulfilled",
                "note": null,
                "processed_at": "2024-07-02T02:31:50-04:00",
                "closed_at": null,
                "location_id": null,
                "email": "testclient@gmail.com",
                "count_of_line_items": "4",
                "order_payment_status": "1",
                "order_json_data": null,
                "total_quantity": "4",
                "total_quote_price": "1.50",
                "account_details_id": "60",
                "is_amount_deducted": "1",
                "order_created_date": "02-07-2024 01:34:26",
                "last_shipping_update": "",
                "local_tracking_number": null,
                "order_invoiced_date": "",
                "refund_invoiced_date": "",
                "discount_invoiced_date": "",
                "discount_refund_invoiced_date": "",
                "paid_at": "2024-07-03 10:18:49",
                "line_item": {
                "id": "6295",
                "app_order_detail_number": "1393-A-1",
                "fulfillable_quantity": "1",
                "gift_card": "0",
                "grams": "0",
                "product_name": "phone_2_july - Gold",
                "quantity": "1",
                "product_title": "phone_2_july",
                "product_variant_title": "Gold",
                "shopify_order_detail_id": "15164175712568",
                "admin_graphql_api_id": "gid://shopify/Product/9465983992120",
                "sku": "",
                "product_id": "575",
                "product_variant_id": "2271",
                "shopify_product_id": "9465983992120",
                "shopify_product_variant_id": "48955798061368",
                "quote_price": "1.50",
                "discount": null,
                "original_quote_price": "1.50",
                "properties": [],
                "notes_category": null,
                "supplier_note": null,
                "note_updated_at": null,
                "processing_started_at": "2024-07-03 10:18:50"
                },
                "mapped_order_ids": [
                "6295",
                "6296",
                "6297",
                "6298"
                ],
                "fulfillments": {
                "id": "5022",
                "created_at": "2024-07-02T02:35:01-04:00",
                "location_id": "92440035640",
                "name": "#1393.3",
                "shopify_order_id": "5916890235192",
                "service": "manual",
                "shipment_status": null,
                "shopify_status": "success",
                "tracking_company": "Other",
                "tracking_number": "SP0901090209793293",
                "tracking_url": "https://t.17track.net/nl#nums=SP0901090209793293&fc=100479",
                "fulfillable_quantity": "0",
                "gift_card": "0",
                "product_name": "phone_2_july - Gold",
                "quantity": "1",
                "product_title": "phone_2_july",
                "product_variant_title": "Gold",
                "sku": ""
                },
                "product_detail": {
                "id": "575",
                "shopify_product_id": "9465983992120",
                "title": "phone_2_july",
                "product_type": "",
                "handle": "phone_2_july",
                "product_link": "https://ecom-15-sep.myshopify.com/products/phone_2_july",
                "product_description_link": null,
                "variant": {
                    "id": "2271",
                    "shopify_variant_id": "48955798061368",
                    "title": "Gold",
                    "sku": "",
                    "option1": "Gold",
                    "option2": "",
                    "option3": "",
                    "image": ""
                }
                },
                "store": {
                "id": "26",
                "name": "ecom-15-sep",
                "shopify_store_name": "ecom-15-sep.myshopify.com"
                },
                "shipping_address": {
                "name": "asdad asdsad",
                "first_name": "asdad",
                "last_name": "asdsad",
                "phone": "+91 82222 22222",
                "email": "testclient@gmail.com",
                "address1": "aa4",
                "address2": "4",
                "city": "Hyderabad",
                "province": "Telangana",
                "country": "India",
                "zip": "500082",
                "company": "456",
                "latitude": null,
                "longitude": null,
                "country_code": "IN",
                "province_code": "TS"
                },
                "tracking": {
                "airway_bill_number": "SP0901090209793293",
                "tracking_url": "https://t.17track.net/nl#nums=SP0901090209793293&fc=100479"
                },
                "admin_supplier": {
                "id": "64",
                "name": "rohit kumar"
                },
                "agent": {
                "id": "91",
                "name": "newsupllier kumar"
                },
                "created_date": "2024-07-02 01:34:26",
                "processing_date": "2024-07-03 10:18:50",
                "payment_date": "2024-07-03 10:18:49",
                "in_transit_date": null
            }
            ],
            "currentPage": 1,
            "perPage": 1000,
            "total": "1",
            "pageCount": 1
        }
}
Filters for listing:

Order status:

Order status idOrder status
0Not quoted
1Processing
2Fulfilled
3In transit
4Hold
5Cancelled
6Delayed
7Address error
8Waiting for tracking update
17Refund
18Resend
41Fulfilled from shopify

Shipping status:

Shipping status idShipping status
8Waiting for tracking update
3In-Transit
9Delivered
10Failed to deliver
11Stuck in-transit
13Available for pickup
15Alert

Create dispute

End point

https://app.servicepoints.nl/api/v2/client/create-dispute

Method

POST

Parameters

mapping_idsnumber(comma separated)required
dispute_issuenumberrequired
dispute_solutionnumberrequired
others_reasontextoptional
dispute_conversiontextoptional
attachmentname(file name)optional
 data(file path converted into base 64 string)  
Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Note: We will convert the attachment(data) from the specified file path into a Base64-encoded string.
online link: https://base64.guru/converter/encode/image

All the parameters should be post in JSON

For eg:


{ 
    "mapping_ids": "4318,4319", 
    "dispute_issue": 1, 
    "dispute_solution": 1,
    "attachment": 
        {
            "name":"screenshot.png", 
            "data":"iVBORw0KGgoAAAANSUhEUgAAB4AAAAQ4CAYAAADo08FDAAAABHNCSVQICAgIfFBQU1HURhRBCCCGEEEIIIYQQQggh6pyigOrn6h+p2TR0ve7KYg7RievqpHEPO" 
        } 
}
                                            
Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/create-dispute' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data '{
    "mapping_ids": "62691,62692",
    "dispute_issue": 1,
    "dispute_solution": 3
}'
                                        
How to get the API key

To get the API key for the Client follow the following steps

Step 1: login as Client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample error response


{ "success": false, "status_code": 401, "message": "Auth token missing." }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": "Dispute raised successfully"
}
                                        
Select listing dispute issue:
NameValue
The customer got wrong product1
The customer got damaged product2
Order processing delay3
Other4
The item has wrong measurements/does not fit5
The product the customer got is bad quality6
The order is lost in transit7
The product is Out of stock8
Select listing dispute solution:
NameValue
Refund1
Resend2
I want the order to be shipped immediately3

Update address

End point

https://app.servicepoints.nl/api/v2/client/update-address

Method

POST

Parameters

order_idnumberrequired
first_nametextrequired
last_nametextoptional
phonetextoptional
emailtextrequired
address1textrequired
address2textoptional
citytextrequired
ziptextrequired
provincetextoptional
country_nametextrequired
companytextoptional
province_codetextoptional

All the parameters should be posted in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/update-address' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data-raw '{
    "order_id": 14322,
    "first_name": "amit",
    "email": "amit@gmail.com",
    "address1": "H-15 New Civil Lines",
    "city": "Hanumangarh",
    "zip": "335512",
    "country_name": "India"
}'
                                        
How to get the API key

To get the API key for the Client follow the following steps

Step 1: login as Client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample response


{
    "success": true,
    "status_code": 200,
    "data": "Shipping address updated successfully."
}
                                        
Sample error response


{ "success": false, "status_code": 401, "message": "Auth token missing." }
                                        

Bypass particular order’s address error

End point

https://app.servicepoints.nl/api/v2/client/update-bypass-address-error-order

Method

POST

Parameters

order_idarrayrequired

All the parameters should be posted in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/update-bypass-address-error-order' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data '{
    "order_id": [14329,14330,14331]
}' 
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample response


{
    "success": true,
    "status_code": 200,
    "data": {
        "success": {
            "message": "successfully bypassed orders address errors",
            "ids": [
                "12864",
                "12865"
            ]
        },
        "error": [
            { 
                "message": "order not found",
                "ids": [
                    "24",
                    "25"
                ]
            },
            {
                "message": "orders without address errors",
                "ids": []
            }
        ]
    }
}
                                        
Sample error response


{ "success": false, "status_code": 401, "message": "Auth token missing." }
{ "success": false, "status_code": 401, "message": "Mismatch AI token."}
                                        

Get all products

End point

https://app.servicepoints.nl/api/v2/client/get-products

Method

POST

Parameters

pagenumberoptional
product_search_keystext (product title / store name)optional
store_idnumberoptional
product_idnumberoptional
product_statustext (see status values below)optional
sortingvalues [asc/desc]optional
from_datedate [yyyy-mm-dd] (order volume window start)optional
to_datedate [yyyy-mm-dd] (order volume window end)optional
show_deleted_storesboolean [0/1]optional
is_out_of_stock_requoteboolean [0/1]optional

All the parameters should be post in JSON. When product_status is empty, products of all statuses are returned. When from_date/to_date are empty, the order volume (total_sold / total_order_count) is calculated for all time.

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location --request POST 'https://app.servicepoints.nl/api/v2/client/get-products' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data-raw '{"page" : 1, "product_status" : "accepted", "from_date" : "2024-01-01", "to_date" : "2024-12-31"}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

"status":   Human readable quote/product status (includes new messages, new variant, add country and special request flags).

"total_sold":   Total units sold for the product within the from_date/to_date window (all time when no dates are passed).

"total_order_count":   Number of order lines for the product within the from_date/to_date window.

"admin_supplier_id" / "agent_supplier_id":   The admin supplier and agent supplier assigned to the product (available once a quotation is accepted).

"country_name":   Comma separated list of ship-to countries quoted for the product.

Sample error response


{ "success": false, "status_code": 401, "message": "Auth token missing." }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": {
        "products_data": [
            {
                "product_id": "575",
                "product_shopify_id": "9465983992120",
                "product_name": "phone_2_july",
                "store_id": "26",
                "account_details_id": "60",
                "store_name": "ecom-15-sep",
                "created_at": "2024-07-02 06:31:51",
                "updated_at": "2024-07-05 10:11:20",
                "published_at": "2024-07-02 06:31:51",
                "status": "Quotation accepted",
                "product_status": "4",
                "quotation_id": "812",
                "status_style": "badge-success",
                "lowest_bid": "1.50",
                "quotation_requested_on": "02-07-2024 06:31",
                "total_sold": 12,
                "total_order_count": 8,
                "min_shipping_time": "5",
                "max_shipping_time": "10",
                "admin_supplier_id": "64",
                "agent_supplier_id": "91",
                "supplier_detail": "Rohit Kumar - Newsupllier Kumar",
                "country_name": "Netherlands,Germany",
                "product_image_link": "https://cdn.shopify.com/s/files/.../phone.jpg"
            }
        ],
        "currentPage": 1,
        "perPage": 1000,
        "total": "1",
        "pageCount": 1
    }
}
                                        
Filters for listing:

product_status (pass any one of the values below):

ValueMeaning
open-quotationsAll open quotations (bidding / requote / new variant / add country / open special request)
acceptedQuotation accepted products
biddingProducts in bidding / requote
new-priceProducts with a new price
new-variantProducts with a new variant
add-countryProducts with an add-country request
quotation-not-doneProducts not yet quoted
stop-fullfilmentProducts with fulfilment stopped
new-messageProducts with unread messages
out-of-stockOut of stock requote products
best-sellerBestseller requotes
open-special-requestProducts with an open special request
close-special-requestProducts with a closed special request

Get quotation history

End point

https://app.servicepoints.nl/api/v2/client/get-quotation-history

Method

POST

Parameters

product_idsarray of product ids, whole numbers (maximum 50 per request)required
pagewhole number (defaults to 1)optional
statuswhole number, values [0/1]optional
is_required_bidwhole number, values [0/1] (defaults to 0)optional

All the parameters should be post in JSON. When status is empty, both open and accepted quotations are returned. Quotations of products that do not belong to the account are never returned.

Every numeric parameter has to be a whole number. A value written with a decimal point or in exponent form - 7777.12, 1.0, 1e5 - is answered with an error instead of being rounded down to another id, page or status.

Bid lines are the biggest part of this response, so they are only read when they are asked for. Send is_required_bid: 1 to get the bids array inside every quotation. With the default 0 the bids key is left out, while bid_count keeps telling how many bids the quotation has.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location --request POST 'https://app.servicepoints.nl/api/v2/client/get-quotation-history' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data-raw '{"page" : 1, "product_ids" : [9912, 9915, 9930], "status" : 0, "is_required_bid" : 1}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Quotation fields

Every status field answers as a pair: value is the number that is stored and text is the wording the client sees in the application, for example "product_status": {"value": "2", "text": "Bidding"}. The tables at the bottom of this page list all the values. Fields that start with is_ are plain true/false.

Anything the answer does not have is null - never an empty text and never a zero. So a status without a wording answers "text": null, a quote without a delay reason answers null, and a supplier that was never measured answers null instead of 0. A zero that is really stored - a zero dispute rate, a zero fee - is answered as 0.

Product and store

"product_id" / "product_store_id":   The product id inside the application and the id of the same product in the Shopify store.

"product_image":   The product's main picture, null when the product has none. It is the picture the product carries right now, not a copy kept from the moment it was quoted, so it follows any later change made to the product.

"store_id" / "store_name" / "store_alias_name":   The store the product belongs to. store_alias_name is the name the client gave the store; it is null when no alias was set.

"product_status":   The status the product carries right now. It comes from the product, so every round of the same product reports the same status.

"is_new_variant" / "is_add_country":   True while a variant or a country was added to the product and is still waiting for a quote.

"special_request_status":   Open or closed while the client has a special request on the product, empty when there is none.

"countries":   The countries the product is quoted for - the shipping countries of the store together with the countries added on the product, each country listed once.

Quotation

"is_approved":   0 Open the quotation is still collecting supplier quotes, 1 Approved one of the quotes was accepted. Quotations that were replaced by a requote or stopped are never returned.

"quotation_status":   The stage of the quotation itself, for example awaiting quotation or quotation accepted.

"round" / "previous_quotation_request_id":   How many times a quotation was raised for that product and which quotation came before this one - use it to follow a requote chain. Every earlier round is counted, also the ones that are no longer returned, so the previous id can point to a quotation that is not in the response.

"is_manual_quotation":   True when the client asked for the quotation itself, false when the application raised it.

"approved_quotation_id":   The quote that was accepted, or null while none was; the accepted quote carries is_approved_quotation: true inside quotations.

"quotation_count" / "bid_count":   Number of quotes returned for the quotation and the total number of bids inside them. Both are answered whether or not the bids themselves were asked for.

"invited_suppliers":   Every agent supplier of the supplier accounts the client is connected to, plus any supplier that quoted. The name is carried as agent_supplier_name, the same way as inside quotations, and has_quoted is true when that supplier submitted a quote.

"cannot_quote" / "excluded_suppliers":   Suppliers that marked themselves unable to quote the product, and suppliers that were excluded from it. Both carry the agent supplier as agent_supplier_name, the same name it has inside quotations.

Quotes inside "quotations"

"quotations":   One quote per supplier, the latest one it submitted. A supplier edit creates a new quote row, so older revisions are not repeated here. The one exception is a product on a new price: there the quote that was accepted before is returned next to the new one, the same way the application shows them side by side.

"is_approved":   The state of that single quote - not approved, approved or stopped.

"quotation_status":   The status stored on the quote, from the same list as the quotation status above.

"price_type":   Only filled while the product sits on a new price: New price on the re-priced quote and Old price on the accepted quote it replaced, the same wording the application shows. null for every other quote.

"supplier_user_id" / "supplier_account_details_id":   The agent supplier and the admin supplier account it belongs to; their names are agent_supplier_name and supplier_name.

"supplier_level":   The level of the supplier account. A supplier that has no level yet answers with value: null and the default level as text.

"processing_time_rate" / "shipping_time_rate" / "dispute_rate":   The measured performance of the supplier, in days for the two times and in percent for the disputes. The two times are null when there is no usable measurement - read the expected day ranges below instead, which is what the application does. The dispute rate is null only when the supplier was never measured; a measured 0 is answered as 0, because no disputes at all is a real - and good - result.

"min_expected_processing_time" / "max_expected_processing_time" / "min_expecting_shipping_time" / "max_expecting_shipping_time":   The day ranges the supplier promised in the quote.

"pcs_per_order":   How many pieces one unit price covers. The four bid prices are for 1, 2, 3 and 4 times this number.

"fee_per_order" / "fee_order_in_percent":   The fee on top of the quoted price - a fixed amount per order and a percentage of the price.

"quality_value":   The product quality the supplier reported on the quote.

"start_fulfillment_delay" / "reason_fulfillment_delay":   The number of days the supplier starts fulfilling later and the reason it gave. The delay is 0 when there is none.

"is_ai_generated":   True when the quote was generated instead of submitted by the supplier.

"is_agreement_approved":   True when the supplier account accepted the service level agreement.

"bids":   Only present when is_required_bid is 1. One bid per country and variant of the quote, with the quoted price for 1, 2, 3 and 4 pcs and the variant id in the application and in Shopify. is_deliver_by_supplier is true when the supplier delivers that variant to that country and false when it does not - the prices of a bid that is not delivered are not quoted prices and should not be shown to a buyer.

"variant_images":   The pictures that belong to the bid's own variant, in the same shape the supplier API answers on get-product-quotation. It is an empty list when the variant carries no picture of its own - the product's picture is answered separately as product_image and is never put here in its place, so a picture in this list always belongs to that exact variant. Like product_image, these are the pictures the variant carries right now rather than copies kept from the moment of the quote.

Sample error response


{ "success": false, "status_code": 401, "message": "A maximum of 50 product_ids are allowed per request" }
                                        
MessageWhen
API token missingThe token header was not sent
Mismatch API token.The token does not belong to a client
Required parameters missingThe body is empty or is not valid JSON
product_ids is requiredproduct_ids was not sent or is empty
product_ids should be an arrayproduct_ids was sent as something other than an array
product_ids should contain positive numbers onlyA product id is not a number or is not above zero
product_ids should contain whole numbers onlyA product id was sent with a decimal point or in exponent form, for example 7777.12 or 1e5
A maximum of 50 product_ids are allowed per requestMore than 50 product ids were sent
Page count should be a numberpage is not a number
Page count should be a positive numberpage is below 1
Page count should be a whole numberpage was sent with a decimal point, for example 1.5 or 2.0
status should be 0 or 1.status holds another value
status should be a whole numberstatus was sent with a decimal point, for example 1.0
is_required_bid should be 0 or 1.is_required_bid holds another value
is_required_bid should be a whole numberis_required_bid was sent with a decimal point, for example 1.0
No quotations foundThe products carry no quotation the client may read, or the page is past the last one
Sample response


{
    "success": true,
    "status_code": 200,
    "message": "Quotations fetched successfully",
    "data": {
        "account_detail_id": "417",
        "quotation_requests": [
            {
                "quotation_request_id": "15579",
                "product_id": "19665",
                "product_name": "Wireless earbuds",
                "product_image": "https://cdn.shopify.com/s/files/1/0790/5584/7726/products/earbuds.jpg?v=1688628792",
                "product_store_id": "8199526514757",
                "store_id": "632",
                "store_name": "my-first-store",
                "store_alias_name": "my-first-store",
                "product_status": {
                    "value": "2",
                    "text": "Bidding"
                },
                "is_new_variant": false,
                "is_add_country": false,
                "special_request_status": {
                    "value": "0",
                    "text": null
                },
                "round": "3",
                "previous_quotation_request_id": "15578",
                "added_on": "2026-08-07 11:47:35",
                "start_time": null,
                "end_time": null,
                "bid_validity": "2026-08-08 11:47:35",
                "modified_at": "2026-08-07 08:49:41",
                "quotation_status": {
                    "value": "1",
                    "text": "Awaiting quotation"
                },
                "is_approved": {
                    "value": "0",
                    "text": "Open"
                },
                "is_manual_quotation": true,
                "approved_quotation_id": null,
                "countries": [
                    {
                        "country_id": "101",
                        "country_name": "India"
                    },
                    {
                        "country_id": "12",
                        "country_name": "Armenia"
                    }
                ],
                "quotation_count": "1",
                "bid_count": "6",
                "invited_suppliers": [
                    {
                        "supplier_id": "211",
                        "agent_supplier_name": "Sophia S",
                        "has_quoted": false
                    },
                    {
                        "supplier_id": "2935",
                        "agent_supplier_name": "Adword sup",
                        "has_quoted": false
                    },
                    {
                        "supplier_id": "3003",
                        "agent_supplier_name": "Henry Ken",
                        "has_quoted": true
                    }
                ],
                "quotations": [
                    {
                        "quotation_id": "99309",
                        "quotation_number": "A14076",
                        "is_approved_quotation": false,
                        "is_approved": {
                            "value": "0",
                            "text": "Not approved"
                        },
                        "quotation_status": {
                            "value": "1",
                            "text": "Awaiting quotation"
                        },
                        "price_type": null,
                        "supplier_account_details_id": "1870",
                        "supplier_user_id": "3003",
                        "supplier_name": "Adam Smith",
                        "agent_supplier_name": "Henry Ken",
                        "supplier_level": {
                            "value": null,
                            "text": "Bronze"
                        },
                        "added_on": "2026-08-07 08:49:41",
                        "updated_on": "2026-08-07 08:49:41",
                        "start_time": null,
                        "end_time": null,
                        "min_expected_processing_time": "3",
                        "max_expected_processing_time": "5",
                        "min_expecting_shipping_time": "7",
                        "max_expecting_shipping_time": "9",
                        "processing_time_rate": null,
                        "shipping_time_rate": null,
                        "dispute_rate": null,
                        "pcs_per_order": "1",
                        "fee_per_order": "0.00",
                        "fee_order_in_percent": "0.00",
                        "quotation_accepting_method": "0",
                        "quality_value": {
                            "value": "4",
                            "text": "UNKNOWN"
                        },
                        "start_fulfillment_delay": "0",
                        "reason_fulfillment_delay": null,
                        "is_ai_generated": false,
                        "is_agreement_approved": false,
                        "bids": [
                            {
                                "bid_id": "403524",
                                "country_id": "101",
                                "country_name": "India",
                                "product_variant_id": "71205",
                                "shopify_variant_id": "45431460200517",
                                "variant_title": "small",
                                "variant_images": [
                                    "https://cdn.shopify.com/s/files/1/0790/5584/7726/files/small-front.jpg?v=1688628795"
                                ],
                                "unit_1_price": "100.000",
                                "unit_2_price": "200.000",
                                "unit_3_price": "300.000",
                                "unit_4_price": "400.000",
                                "is_deliver_by_supplier": true
                            },
                            {
                                "bid_id": "403525",
                                "country_id": "101",
                                "country_name": "India",
                                "product_variant_id": "71206",
                                "shopify_variant_id": "45431460233285",
                                "variant_title": "large",
                                "unit_1_price": "100.000",
                                "unit_2_price": "200.000",
                                "unit_3_price": "300.000",
                                "unit_4_price": "400.000",
                                "is_deliver_by_supplier": true
                            }
                        ]
                    }
                ],
                "cannot_quote": [
                    {
                        "supplier_id": "211",
                        "supplier_admin_id": "147",
                        "agent_supplier_name": "Sophia S",
                        "added_on": "2026-08-07 08:29:00"
                    }
                ],
                "excluded_suppliers": []
            }
        ],
        "currentPage": 1,
        "perPage": 50,
        "total": 1,
        "pageCount": 1
    }
}
                                        
Filters for listing:
FilterTypeUse
product_idsarray of whole numbers, requiredThe products to read the quotations of, maximum 50 per request
pagewhole number, optional (defaults to 1)50 quotations are answered per page; "total" and "pageCount" tell how many there are
statuswhole number 0 or 1, optionalNarrows the listing to the quotations without an accepted quote or to the ones with it; both are answered when it is left out
is_required_bidwhole number 0 or 1, optional (defaults to 0)Whether the bids of every quotation are answered as well

status (pass the is_approved value of the quotation):

ValueMeaning
0Quotations that have no accepted quote yet - still open for supplier quotes
1Quotations where one of the supplier quotes was accepted

For example "status" : 0; "0" and "1" are accepted as well. Leaving the filter out - or sending an empty text - answers both. Any other value is refused, and quotations that were replaced by a requote or stopped are never answered by this API.

The filter picks the quotations, so the quotes and the bids inside them follow it: with 0 the answer carries the bids of the still open quotations, with 1 the bids of the accepted ones. The bids themselves are never filtered - every quotation that is answered carries all of its bids, and bid_count counts only what is answered.

is_required_bid (pass the number below):

ValueResult
0 (default)The "bids" key is left out of every quotation. Nothing else changes - the quotations themselves, "quotation_count" and "bid_count" are answered exactly the same. The bid rows are never read from the database, only counted, which is why this is the lighter and faster call
1Every quotation carries its "bids" array: one entry per country and variant, with the four prices, the variant ids and the delivery flag

For example "is_required_bid" : 1. The values "0", "1", true and false are accepted too. Ask for the bids only when the prices are needed - on a product with many variants and countries the bids are by far the biggest part of the answer.

page:

A number from 1 upwards, for example "page" : 2. Reading past the last page answers "No quotations found".

Status values in the response:

product_status and quotation_status of the quotation:

ValueText
0Not quoted
1Awaiting quotation
2Bidding
3Quotation done
4Quotation accepted
6Stop fulfilment
7Requote - Bidding
8Add country
9New price
11New variant
12Open special request
13Closed special request
14Not able to quote
15Time elapsed
16New message
17Bestseller requotes
18Out-of-stock requotes

A value that is not in this list is answered with an empty text.

is_approved of the quotation:

ValueText
0Open
1Approved

is_approved of a quote inside "quotations":

ValueText
0Not approved
1Approved
2Stopped

price_type of a quote inside "quotations":

TextWhen
nullThe product is not on a new price
New priceThe quote the supplier re-priced
Old priceThe accepted quote that the new price replaced

The quotation_status of a quote uses the same value list as the quotation status above.

special_request_status:

ValueText
0text is null - there is no special request on the product
1Open special request
2Closed special request

supplier_level:

ValueText
nullBronze - the supplier has no level yet, so the default level is reported as text
1Bronze
2Silver
3Gold
4Platinum
5Diamond

quality_value:

ValueText
0text is null - the supplier did not report a quality
1LOW
2AVERAGE
3HIGH
4UNKNOWN

Get disputes

End point

https://app.servicepoints.nl/api/v2/client/get-disputes

Method

POST

Parameters

dispute_typetext [open / action-required / declined / approved]required
pagenumberoptional
min_datedate [yyyy-mm-dd]optional
max_datedate [yyyy-mm-dd]optional
sortingvalues [asc/desc]optional
store_idnumberoptional
dispute_issuenumberoptional
dispute_solutionnumberoptional
shipping_statusnumberoptional
open_dispute_statusnumber [1 / 2] (used only when dispute_type is open)optional
search_termtextoptional
order_idnumberoptional
mapping_idnumberoptional
trackingnumbertextoptional

All the parameters should be post in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/get-disputes' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data '{
    "dispute_type": "open",
    "page": 1
}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample error response


{ "success": false, "status_code": 401, "message": "API token missing" }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{ "success": false, "status_code": 401, "message": "dispute_type parameter missing" }
{ "success": false, "status_code": 400, "message": "Dispute type must be one of open, action-required, declined, approved." }
{ "success": false, "status_code": 400, "message": "Sorting value must be one of asc, desc." }
{ "success": false, "status_code": 400, "message": "No disputes found." }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": {
        "disputes": [
            {
                "order_id": "6295",
                "order_detail_id": "6295",
                "app_order_detail_number": "1393-A-1",
                "product_id": "575",
                "product_title": "phone_2_july",
                "store_name": "ecom-15-sep",
                "order_created_at": "2024-07-02 06:31:51",
                "admin_supplier": {
                    "id": "64",
                    "name": "rohit kumar"
                },
                "agent": {
                    "id": "91",
                    "name": "newsupllier kumar"
                },
                "disputes": [
                    {
                        "dispute_id": "312",
                        "variant_name": "Gold",
                        "dispute_created_at": "2024-07-05 10:15:22",
                        "dispute_issue": "The customer got wrong product",
                        "requested_dispute_solution": "Refund",
                        "dispute_other_reason": "",
                        "dispute_status": "open",
                        "resolution_status": "pending",
                        "resolution_updated_at": null,
                        "resolution_by": null,
                        "resolution_reason": null,
                        "client_accepted": null,
                        "client_accepted_at": null,
                        "dispute_amount": null,
                        "amount_type": null,
                        "currency": null,
                        "dispute_conversation": [
                            {
                                "sender_name": "testclient",
                                "sender_role": "client",
                                "sender_id": 3001,
                                "sender_type": "user",
                                "message": "The customer received the wrong colour variant.",
                                "created_at": "2024-07-05 10:15:22",
                                "is_closed": false,
                                "attachments": [
                                    {
                                        "attachment_link": "https://app.servicepoints.nl/download-attachment-document/{token}/6295/screenshot.png"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ],
        "currentPage": 1,
        "perPage": 1000,
        "total": 1,
        "pageCount": 1
    }
}
                                        
Conversation sender role (dispute_conversation[].sender_role):
ValueDescription
clientThe client who raised the dispute, or someone acting for them
supplierThe admin supplier
agentA supplier agent
adminService Points staff — an administrator, support agent or team leader
Conversation sender identity (dispute_conversation[].sender_id, .sender_type):

sender_id is the platform user id of whoever wrote the message, so two messages from the same account always carry the same id even if the display name changed. Use it instead of matching on sender_name. sender_type names what the id refers to and is always "user". Both are null on the rare message that carries no sender.

Closing message (dispute_conversation[].is_closed):

true on the one message that resolved the dispute — the supplier's approval or refusal, or the client's cancellation. Every other message is false, including the message that raised the dispute and every ordinary reply from either side, so it does not mean "both sides have answered". A dispute that was reopened carries one true message per closing, newest last; resolution_updated_at and resolution_by are taken from the newest one written by the supplier side. A dispute closed without a message carries none at all.

Resolution fields:
FieldDescription
resolution_updated_atWhen the dispute reached its current resolution_status. Taken from the closing message of the dispute. null while the dispute is still pending, and also on disputes that were closed automatically or before this was recorded.
resolution_byObject with name and role of whoever closed the dispute. null in the same cases as resolution_updated_at, and for disputes closed automatically by the system.
resolution_reasonThe reason the dispute was refused, as written by the supplier. Only returned when resolution_status is declined; null otherwise.
client_acceptedWhether the client accepted the supplier's refusal. true only when the client accepted it themselves. false while a refusal is still open, including when the client rejected it and the dispute went back into discussion. null in every other case — the dispute never went through a refusal, or is cancelled, approved or still pending, or the refusal was closed automatically after the waiting period rather than by the client. Combine client_accepted = false with resolution_updated_at to find refusals that have been outstanding for a given number of days.
client_accepted_atWhen the client accepted the refusal. null whenever client_accepted is not true, and also on older disputes where the moment of acceptance was never recorded — client_accepted still reports true in that case.
dispute_amount / amount_type / currencyThe money on this dispute, and which figure it is. "refunded" is the amount actually paid back, answered only where that payment can belong to no other dispute — one settled refund dispute on the order line and one refund on it. "claimed" is what the client asked for on this dispute, taken when it was raised. All three are null on a dispute that did not ask for money back (a resend or an exchange), and on a refund dispute where neither figure is available — a refund on the same order line that could belong to an earlier dispute is never borrowed for this one. Accepting a dispute is not by itself a payment, so an accepted dispute whose refund has not gone through still answers the claimed figure. Amounts are in the platform currency, the same one get-topups answers.
Dispute type (dispute_type):
ValueDescription
openOpen disputes
action-requiredDisputes that require an action
declinedDeclined disputes
approvedApproved disputes
Open dispute status (open_dispute_status):
NameValue
Message send1
Message received2
Filter dispute issue (dispute_issue):
NameValue
The customer got wrong product1
The customer got damaged product2
Order processing delay3
Other4
The item has wrong measurements/does not fit5
The product the customer got is bad quality6
The order is lost in transit7
The product is Out of stock8
Filter dispute solution (dispute_solution):
NameValue
Refund1
Resend2
I want the order to be shipped immediately3
Filter shipping status (shipping_status):
Shipping status idShipping status
8Waiting for tracking update
3In-Transit
9Delivered
10Failed to deliver
11Stuck in-transit
13Available for pickup
15Alert

Get special requests

End point

https://app.servicepoints.nl/api/v2/client/get-special-requests

Method

POST

Parameters

request_typetext [open / closed]required
pagenumberoptional
min_datedate [yyyy-mm-dd]optional
max_datedate [yyyy-mm-dd]optional
sortingvalues [asc/desc]optional
store_idnumberoptional
shipping_statusnumberoptional
search_termtextoptional
order_idnumberoptional
mapping_idnumberoptional
trackingnumbertextoptional
special_request_categorynumberoptional

All the parameters should be post in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/get-special-requests' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data '{
    "request_type": "open",
    "page": 1
}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample error response


{ "success": false, "status_code": 401, "message": "API token missing" }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{ "success": false, "status_code": 401, "message": "Required parameters missing" }
{ "success": false, "status_code": 401, "message": "request_type parameter missing" }
{ "success": false, "status_code": 400, "message": "Request type must be one of open, closed." }
{ "success": false, "status_code": 400, "message": "Sorting value must be one of asc, desc." }
{ "success": false, "status_code": 400, "message": "No special requests found." }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": {
        "special_requests": [
            {
                "order_id": "6295",
                "order_detail_id": "6295",
                "app_order_detail_number": "1393-A-1",
                "product_id": "575",
                "product_title": "phone_2_july",
                "store_name": "ecom-15-sep",
                "order_created_at": "2024-07-02 06:31:51",
                "shipping_status": "Waiting for tracking update",
                "admin_supplier": {
                    "id": "64",
                    "name": "rohit kumar"
                },
                "agent": {
                    "id": "91",
                    "name": "newsupllier kumar"
                },
                "special_requests": [
                    {
                        "special_request_id": "120",
                        "special_request_category": "Requote",
                        "variant_name": "Gold",
                        "request_text": "Please requote this product for a higher quantity.",
                        "special_request_created_at": "2024-07-05 10:15:22",
                        "request_status": "open",
                        "closed_at": null,
                        "conversation": [
                            {
                                "sender_name": "newsupllier kumar",
                                "sender_role": "agent",
                                "sender_id": 3003,
                                "sender_type": "user",
                                "message": "Proof of shipment has been shared.",
                                "created_at": "2024-07-06 09:12:40",
                                "attachments": [
                                    {
                                        "attachment_link": "<?= base_url() ?>/download-special-request-attachment-document/{token}/120/proof.png"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ],
        "currentPage": 1,
        "perPage": 1000,
        "total": 1,
        "pageCount": 1
    }
}
                                        
Request type (request_type):
ValueDescription
openOpen special requests
closedClosed special requests
Special request category (special_request_category):
NameValue
Proof of shipment1
Proof of delivery2
Proof of shipment & proof of delivery3
Others4
Local tracking5
Change size/variant6
Close date (closed_at):

The date and time when request_status became closed. It is null while the request is still open. It can also be null on older requests that were closed before this date started being recorded, and on requests that were closed without a supplier answer (for example when the order was cancelled).

Supplier reply (conversation):

A special request holds a single supplier answer, so conversation is an empty array until the supplier replies and holds exactly one item afterwards. created_at is the reply time and can be null on older requests that were answered before the reply time started being recorded.

sender_roleDescription
admin_supplierReplied by the admin supplier
agentReplied by the agent supplier

sender_id is the platform user id of the supplier who replied, so it stays the same even if their display name changes. sender_type names what the id refers to and is always "user". Both are null if the reply carries no sender.

Filter shipping status (shipping_status):
Shipping status idShipping status
8Waiting for tracking update
3In-Transit
9Delivered
10Failed to deliver
11Stuck in-transit
13Available for pickup
15Alert

Create special request

End point

https://app.servicepoints.nl/api/v2/client/create-special-request

Method

POST

Parameters

mapping_idsarray of numbersrequired
special_request_categorynumberrequired
descriptiontextrequired

Note: All the mapping ids must belong to the same order.

All the parameters should be post in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/create-special-request' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data '{
    "mapping_ids": [62691,62692],
    "special_request_category": 3,
    "description": "Please requote this product for a higher quantity."
}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample error response


{ "success": false, "status_code": 401, "message": "API token missing" }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{ "success": false, "status_code": 401, "message": "Required parameters missing" }
{ "success": false, "status_code": 401, "message": "mapping_ids is required" }
{ "success": false, "status_code": 401, "message": "mapping_ids should be a number" }
{ "success": false, "status_code": 401, "message": "special_request_category is required" }
{ "success": false, "status_code": 401, "message": "description is required" }
{ "success": false, "status_code": 401, "message": "please enter valid value into special_request_category" }
{ "success": false, "status_code": 404, "message": "No order found" }
{ "success": false, "status_code": 404, "message": "Please enter the mapping ids that exists in a certain order." }
{ "success": false, "status_code": 404, "message": "You can not generate a special request for this order because no supplier is assigned to it." }
{ "success": false, "status_code": 404, "message": "You can not generate a special request for this order because the status of the mapping is hold." }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": "Special request generated successfully"
}
                                        
Special request category (special_request_category):
NameValue
Proof of shipment1
Proof of delivery2
Proof of shipment & proof of delivery3
Others4
Local tracking5
Change size/variant6

Get client balance

End point

https://app.servicepoints.nl/api/v2/client/get-client-balance

Method

POST

Parameters

This endpoint does not require any body parameters. The client is identified by the API token sent in the header, and only their own balance is returned.

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/get-client-balance' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

"balance":   The client's available positive balance.

"negative_balance":   The outstanding negative balance (amount owed) on the client's account.

"total_balance":   The net balance of the account (positive balance minus negative balance).

Sample error response


{ "success": false, "status_code": 401, "message": "API token missing" }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{ "success": false, "status_code": 404, "message": "Not Found" }
{ "success": false, "status_code": 500, "message": "Something went wrong" }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": {
        "account_detail_id": 60,
        "client_name": "testclient Sharma",
        "balance": 1500.50,
        "negative_balance": 0,
        "total_balance": 1500.50
    }
}
                                        

Create custom order API

End point

https://app.servicepoints.nl/api/v2/client/create-custom-order

Method

POST

Parameters

product_titletextrequired
product_descriptiontextrequired
quantitynumberrequired
order_amountnumberrequired
supplier_user_idnumberrequired

All the parameters should be post in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location --request POST 'https://app.servicepoints.nl/api/v2/client/create-custom-order'\
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data-raw '{
   "product_title": "test",
   "product_description" : "product description",
   "quantity" : 2,
   "order_amount" : 20,
   "supplier_user_id" : 348500
}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample error response


{ "success": false, "status_code": 401, "message": "API token missing" }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{ "success": false, "status_code": 404, "message": "Not Found" }
{"success":  false, "status_code": 401, "message": "Required parameters missing"}
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": {
        "custom_order_id": 390,
        "is_paid": 1,
        "order_amount": 20,
        "message": "Custom order successfully added"
    }
}
                                        

Get custom orders

End point

https://app.servicepoints.nl/api/v2/client/get-custom-orders

Method

POST

Parameters

idnumberoptional
custom_order_idnumberoptional

Note: When id (or custom_order_id) is sent, only that single custom order is returned. When no id is sent, the client's full list of custom orders is returned. Only the authenticated client's own custom orders are accessible.

All the parameters should be post in JSON

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location --request POST 'https://app.servicepoints.nl/api/v2/client/get-custom-orders' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data-raw '{
   "id" : 390
}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

"count":   The number of custom orders returned in the list (only present in the list response).

"order_status":   The current status of the custom order.

"payment_type":   The payment method used for the custom order.

"is_paid":   1 when the order has been settled (ledger created), otherwise 0.

Sample error response


{ "success": false, "status_code": 401, "message": "API token missing" }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{ "success": false, "status_code": 422, "message": "Invalid custom order id" }
{ "success": false, "status_code": 404, "message": "Custom order not found" }
{ "success": false, "status_code": 500, "message": "Something went wrong" }
                                        
Sample response (single order)


{
    "success": true,
    "status_code": 200,
    "data": {
        "custom_order": {
            "id": 390,
            "product_title": "test",
            "product_description": "product description",
            "quantity": 2,
            "order_amount": 20,
            "order_status": "Processing",
            "payment_type": "balance",
            "is_paid": 1,
            "supplier_account_id": 64,
            "supplier_user_id": 348500,
            "created_at": "2024-07-02 06:31:51"
        }
    }
}
                                        
Sample response (list)


{
    "success": true,
    "status_code": 200,
    "data": {
        "count": 1,
        "custom_orders": [
            {
                "id": 390,
                "product_title": "test",
                "product_description": "product description",
                "quantity": 2,
                "order_amount": 20,
                "order_status": "Processing",
                "payment_type": "balance",
                "is_paid": 1,
                "supplier_account_id": 64,
                "supplier_user_id": 348500,
                "created_at": "2024-07-02 06:31:51"
            }
        ]
    }
}
                                        

Get top-ups

End point

https://app.servicepoints.nl/api/v2/client/get-topups

Method

POST

Parameters

pagenumberoptional, defaults to 1
statusstringoptional, one of approved, pending, failed, declined
from_datedate (YYYY-MM-DD)optional, inclusive
to_datedate (YYYY-MM-DD)optional, inclusive
sortingstringoptional, chronological order on the submission date: "desc" newest first (default) or "asc" oldest first

Note: All parameters are optional. Without any parameter the complete top-up history of the authenticated client is returned along with the balance summary - every top-up the client submitted is included regardless of its status (pending, approved, failed and declined alike), not only the approved ones. Records are returned in chronological order of the submission date: newest first by default, send sorting: "asc" for oldest first. Only the authenticated client's own top-ups are accessible.

All the parameters should be post in JSON

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request

Send an empty body to get the client's complete top-up history. This is the usual call.


curl --location --request POST 'https://app.servicepoints.nl/api/v2/client/get-topups' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data-raw '{}'
                                        

Only add the parameters below when you deliberately want a narrower list. In particular status hides every top-up that is not in that status - sending "status": "approved" will leave pending top-ups out of the response and lower the reported total.


curl --location --request POST 'https://app.servicepoints.nl/api/v2/client/get-topups' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data-raw '{
   "page" : 1,
   "status" : "approved",
   "from_date" : "2026-07-01",
   "to_date" : "2026-08-01",
   "sorting" : "desc"
}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

"balance_summary.balance":   The client's available positive balance.

"amount":   The amount credited to the wallet by this top-up. For payment gateway top-ups the client is charged this amount plus the gateway processing fee and VAT.

"status":   One of approved, pending, failed, declined. Top-ups of every status are returned; send the optional status parameter to narrow the list.

"payment_method":   The payment method used for the top-up, empty when the gateway did not report one.

"reference":   The payment reference of the top-up (gateway transaction reference, or the charge id when no reference exists).

"description":   The remark saved with the top-up, empty when none was given.

"submitted_at":   When the top-up was submitted.

"status_changed_at":   When the top-up was last updated. Falls back to "submitted_at" for top-ups that were never updated after creation.

"pagination.perPage":   The number of top-ups returned per page.

Sample error response


{ "success": false, "status_code": 401, "message": "API token missing" }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{ "success": false, "status_code": 401, "message": "Page count should be a number" }
{ "success": false, "status_code": 401, "message": "status should be one of approved, pending, failed, declined." }
{ "success": false, "status_code": 401, "message": "Invalid from_date" }
{ "success": false, "status_code": 401, "message": "to_date should be greater than or equal to from_date" }
{ "success": false, "status_code": 404, "message": "Not Found" }
{ "success": false, "status_code": 409, "message": "Duplicate request is already being processed. Please retry once it completes." }
{ "success": false, "status_code": 500, "message": "Something went wrong" }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "message": "Top-ups fetched successfully",
    "data": {
        "account_detail_id": 7464,
        "balance_summary": {
            "balance": 1500.50,
        },
        "topups": [
            {
                "id": 88431,
                "type": "topup",
                "amount": "2000.00",
                "currency": "EUR",
                "status": "pending",
                "payment_method": "iDEAL",
                "reference": "1234567890X1a2b3",
                "description": "",
                "submitted_at": "2026-08-01 14:22:10",
                "status_changed_at": "2026-08-01 14:22:10"
            },
            {
                "id": 88300,
                "type": "topup",
                "amount": "500.00",
                "currency": "EUR",
                "status": "approved",
                "payment_method": "Manual payment",
                "reference": "",
                "description": "bank transfer july",
                "submitted_at": "2026-07-28 09:05:44",
                "status_changed_at": "2026-07-28 11:40:02"
            }
        ],
        "pagination": {
            "currentPage": 1,
            "perPage": 1000,
            "total": 2,
            "pageCount": 1
        }
    }
}
                                        
Sample response (client with no top-ups)


{
    "success": true,
    "status_code": 200,
    "message": "Top-ups fetched successfully",
    "data": {
        "account_detail_id": 7464,
        "balance_summary": {
            "balance": 0,
        },
        "topups": [],
        "pagination": {
            "currentPage": 1,
            "perPage": 1000,
            "total": 0,
            "pageCount": 0
        }
    }
}
                                        

Get stock per item

End point

https://app.servicepoints.nl/api/v2/client/get-stock-per-item

Method

POST

Parameters

product_idnumberoptional
product_variant_idnumberoptional
store_idnumberoptional
admin_supplier_idnumberoptional
stock_categorynumberoptional
min_datedate [yyyy-mm-dd]optional
max_datedate [yyyy-mm-dd]optional
pagenumberoptional
searchstringoptional

All the parameters should be posted in JSON

stock_category can be 1, 2 or 3:

ValueStock category
1Product stock
2Order addon
3Custom packaging

admin_supplier_id: filter stock by the supplier's account id (same as the supplier_account_details_id returned in the response).

min_date / max_date: filter stock by the date it was created (format yyyy-mm-dd). min_date must not be greater than max_date.

search: search by product name, variant name, store name, supplier name, Shopify product ID, or Shopify variant ID.

Each page displays 1000 products. To load additional products, a page parameter must be provided in the request.

Note

A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.

Headers

X-SERVICE-POINT-ACCESS-TOKENget it from application
Content-Typeapplication/json
Curl request


curl --location 'https://app.servicepoints.nl/api/v2/client/get-stock-per-item' \
    --header 'X-SERVICE-POINT-ACCESS-TOKEN: get it from application' \
    --header 'Content-Type: application/json' \
    --data '{
    "product_id": 18434,
    "product_variant_id": 59393,
    "admin_supplier_id": 1870,
    "stock_category": 1,
    "min_date": "2026-05-01",
    "max_date": "2026-05-31",
    "search": "ecomstorejan6",
    "page": 1
}'
                                        
How to get the API key

To get the API key for the client follow the following steps

Step 1: login as client

Step 2: go to the setting section.

Step 3: in the API key tab you will get the API key to access the API

Sample error response


{ "success": false, "status_code": 401, "message": "Auth token missing." }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
                                        
Sample response


{
    "success": true,
    "status_code": 200,
    "data": {
        "stock_data": [
            {
                "product_id": 17360,
                "product_name": "bell",
                "product_image": "",
                "shopify_product_id": "7494893338693",
                "store_id": "632",
                "store_name": "ecomstorejan6",
                "client_name": "Bobby client",
                "variants": [
                    {
                        "stock_id": 4,
                        "product_variant_id": 54802,
                        "custom_stock_variant_id": 0,
                        "variant_title": "0-6 months",
                        "custom_variant_title": null,
                        "stock_type": 1,
                        "stock_type_name": "Product",
                        "quantity": 2,
                        "cost_per_unit": "0",
                        "start_time": "2026-05-20 16:00:00",
                        "payment_status": "Paid",
                        "shopify_variant_id": "42286609563717",
                        "supplier_name": "Bobby agent suplier",
                        "supplier_user_id": 3003,
                        "supplier_account_details_id": 1870
                    },
                    {
                        "stock_id": 5,
                        "product_variant_id": 54803,
                        "custom_stock_variant_id": 0,
                        "variant_title": "6-12 months",
                        "custom_variant_title": null,
                        "stock_type": 1,
                        "stock_type_name": "Product",
                        "quantity": 3,
                        "cost_per_unit": "0",
                        "start_time": "2026-05-20 16:00:00",
                        "payment_status": "Paid",
                        "shopify_variant_id": "42286609596485",
                        "supplier_name": "Bobby agent suplier",
                        "supplier_user_id": 3003,
                        "supplier_account_details_id": 1870
                    }
                ]
            },
            {
                "product_id": 18434,
                "product_name": "piyushii tshirt",
                "product_image": "https://cdn.shopify.com/s/files/1/0633/4152/7109/files/1760099825_wangabond_90597.jpg?v=1760597594",
                "shopify_product_id": "7800991907909",
                "store_id": "632",
                "store_name": "ecomstorejan6",
                "client_name": "Bobby client",
                "variants": [
                    {
                        "stock_id": 1,
                        "product_variant_id": 59393,
                        "custom_stock_variant_id": 0,
                        "variant_title": "aqua",
                        "custom_variant_title": null,
                        "stock_type": 1,
                        "stock_type_name": "Product",
                        "quantity": 40,
                        "cost_per_unit": "0",
                        "start_time": "2026-05-21 16:00:00",
                        "payment_status": "Paid",
                        "shopify_variant_id": "43837830299717",
                        "supplier_name": "Bobby agent suplier",
                        "supplier_user_id": 3003,
                        "supplier_account_details_id": 1870
                    }
                ]
            }
        ],
        "currentPage": 1,
        "perPage": 1000,
        "total": 3,
        "pageCount": 1
    }
}
                                        
Field descriptions

"stock_data":   List of products. Each product holds its details and a variants array of stock entries for that product.

"stock_type":   1 = Product, 2 = Order addon, 3 = Custom packaging. "stock_type_name" is its readable label.

"quantity":   Available stock quantity for that variant entry.

"cost_per_unit":   Cost per single unit of the stock.

"payment_status":   Payment status of the stock entry.

"currentPage" / "perPage" / "total" / "pageCount":   Pagination details. Each page returns up to 1000 products.