https://app.servicepoints.nl/api/v2/client/get-orders-for-client
POST
| order_id | number | optional |
| min_date | date [yyyy-mm-dd] | optional |
| max_date | date [yyyy-mm-dd] | optional |
| page | number | optional |
| store_id | number | optional |
| agent_id | number | optional |
| admin_supplier_id | number | optional |
| shopify_order_id | number | optional |
| shopify_order_detail_id | number | optional |
| require_raw_shopify_data | must be true | optional |
| min_order_id | number | optional (should always be less than max_order_id) |
| max_order_id | number | optional |
| shopify_store_name | text | optional |
| customer_name | text | optional |
| agent_name | text | optional |
| admin_supplier_name | text | optional |
| get_orders_quoted_in_last_24_hours | must be true | optional |
| order_status | number | optional |
| shipping_status | number | optional |
| order_payment_status | boolean | optional |
| fulfillment_status | text [fulfilled] | optional |
| sort_by_time_quoted | values [asc/desc] | optional |
| sort_by_sp_order_id | values [asc/desc] | optional |
All the parameters should be post in JSON
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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}'
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.
{ "success": false, "status_code": 401, "message": "Auth token missing." }
{
"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
}
}
Order status:
| Order status id | Order status |
|---|---|
| 0 | Not quoted |
| 1 | Processing |
| 2 | Fulfilled |
| 3 | In transit |
| 4 | Hold |
| 5 | Cancelled |
| 6 | Delayed |
| 7 | Address error |
| 8 | Waiting for tracking update |
| 17 | Refund |
| 18 | Resend |
| 41 | Fulfilled from shopify |
Shipping status:
| Shipping status id | Shipping status |
|---|---|
| 8 | Waiting for tracking update |
| 3 | In-Transit |
| 9 | Delivered |
| 10 | Failed to deliver |
| 11 | Stuck in-transit |
| 13 | Available for pickup |
| 15 | Alert |
https://app.servicepoints.nl/api/v2/client/create-dispute
POST
| mapping_ids | number(comma separated) | required |
| dispute_issue | number | required |
| dispute_solution | number | required |
| others_reason | text | optional |
| dispute_conversion | text | optional |
| attachment | name(file name) | optional |
| data(file path converted into base 64 string) |
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"
}
}
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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
}'
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
{ "success": false, "status_code": 401, "message": "Auth token missing." }
{
"success": true,
"status_code": 200,
"data": "Dispute raised successfully"
}
| Name | Value |
|---|---|
| The customer got wrong product | 1 |
| The customer got damaged product | 2 |
| Order processing delay | 3 |
| Other | 4 |
| The item has wrong measurements/does not fit | 5 |
| The product the customer got is bad quality | 6 |
| The order is lost in transit | 7 |
| The product is Out of stock | 8 |
| Name | Value |
|---|---|
| Refund | 1 |
| Resend | 2 |
| I want the order to be shipped immediately | 3 |
https://app.servicepoints.nl/api/v2/client/update-address
POST
| order_id | number | required |
| first_name | text | required |
| last_name | text | optional |
| phone | text | optional |
| text | required | |
| address1 | text | required |
| address2 | text | optional |
| city | text | required |
| zip | text | required |
| province | text | optional |
| country_name | text | required |
| company | text | optional |
| province_code | text | optional |
All the parameters should be posted in JSON
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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"
}'
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
{
"success": true,
"status_code": 200,
"data": "Shipping address updated successfully."
}
{ "success": false, "status_code": 401, "message": "Auth token missing." }
https://app.servicepoints.nl/api/v2/client/update-bypass-address-error-order
POST
| order_id | array | required |
All the parameters should be posted in JSON
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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]
}'
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
{
"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": []
}
]
}
}
{ "success": false, "status_code": 401, "message": "Auth token missing." }
{ "success": false, "status_code": 401, "message": "Mismatch AI token."}
https://app.servicepoints.nl/api/v2/client/get-products
POST
| page | number | optional |
| product_search_keys | text (product title / store name) | optional |
| store_id | number | optional |
| product_id | number | optional |
| product_status | text (see status values below) | optional |
| sorting | values [asc/desc] | optional |
| from_date | date [yyyy-mm-dd] (order volume window start) | optional |
| to_date | date [yyyy-mm-dd] (order volume window end) | optional |
| show_deleted_stores | boolean [0/1] | optional |
| is_out_of_stock_requote | boolean [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.
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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"}'
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.
{ "success": false, "status_code": 401, "message": "Auth token missing." }
{
"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
}
}
product_status (pass any one of the values below):
| Value | Meaning |
|---|---|
| open-quotations | All open quotations (bidding / requote / new variant / add country / open special request) |
| accepted | Quotation accepted products |
| bidding | Products in bidding / requote |
| new-price | Products with a new price |
| new-variant | Products with a new variant |
| add-country | Products with an add-country request |
| quotation-not-done | Products not yet quoted |
| stop-fullfilment | Products with fulfilment stopped |
| new-message | Products with unread messages |
| out-of-stock | Out of stock requote products |
| best-seller | Bestseller requotes |
| open-special-request | Products with an open special request |
| close-special-request | Products with a closed special request |
https://app.servicepoints.nl/api/v2/client/get-quotation-history
POST
| product_ids | array of product ids, whole numbers (maximum 50 per request) | required |
| page | whole number (defaults to 1) | optional |
| status | whole number, values [0/1] | optional |
| is_required_bid | whole 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.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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}'
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
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.
{ "success": false, "status_code": 401, "message": "A maximum of 50 product_ids are allowed per request" }
| Message | When |
|---|---|
| API token missing | The token header was not sent |
| Mismatch API token. | The token does not belong to a client |
| Required parameters missing | The body is empty or is not valid JSON |
| product_ids is required | product_ids was not sent or is empty |
| product_ids should be an array | product_ids was sent as something other than an array |
| product_ids should contain positive numbers only | A product id is not a number or is not above zero |
| product_ids should contain whole numbers only | A 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 request | More than 50 product ids were sent |
| Page count should be a number | page is not a number |
| Page count should be a positive number | page is below 1 |
| Page count should be a whole number | page 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 number | status 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 number | is_required_bid was sent with a decimal point, for example 1.0 |
| No quotations found | The products carry no quotation the client may read, or the page is past the last one |
{
"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
}
}
| Filter | Type | Use |
|---|---|---|
| product_ids | array of whole numbers, required | The products to read the quotations of, maximum 50 per request |
| page | whole number, optional (defaults to 1) | 50 quotations are answered per page; "total" and "pageCount" tell how many there are |
| status | whole number 0 or 1, optional | Narrows 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_bid | whole 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):
| Value | Meaning |
|---|---|
| 0 | Quotations that have no accepted quote yet - still open for supplier quotes |
| 1 | Quotations 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):
| Value | Result |
|---|---|
| 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 |
| 1 | Every 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".
product_status and quotation_status of the quotation:
| Value | Text |
|---|---|
| 0 | Not quoted |
| 1 | Awaiting quotation |
| 2 | Bidding |
| 3 | Quotation done |
| 4 | Quotation accepted |
| 6 | Stop fulfilment |
| 7 | Requote - Bidding |
| 8 | Add country |
| 9 | New price |
| 11 | New variant |
| 12 | Open special request |
| 13 | Closed special request |
| 14 | Not able to quote |
| 15 | Time elapsed |
| 16 | New message |
| 17 | Bestseller requotes |
| 18 | Out-of-stock requotes |
A value that is not in this list is answered with an empty text.
is_approved of the quotation:
| Value | Text |
|---|---|
| 0 | Open |
| 1 | Approved |
is_approved of a quote inside "quotations":
| Value | Text |
|---|---|
| 0 | Not approved |
| 1 | Approved |
| 2 | Stopped |
price_type of a quote inside "quotations":
| Text | When |
|---|---|
| null | The product is not on a new price |
| New price | The quote the supplier re-priced |
| Old price | The 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:
| Value | Text |
|---|---|
| 0 | text is null - there is no special request on the product |
| 1 | Open special request |
| 2 | Closed special request |
supplier_level:
| Value | Text |
|---|---|
| null | Bronze - the supplier has no level yet, so the default level is reported as text |
| 1 | Bronze |
| 2 | Silver |
| 3 | Gold |
| 4 | Platinum |
| 5 | Diamond |
quality_value:
| Value | Text |
|---|---|
| 0 | text is null - the supplier did not report a quality |
| 1 | LOW |
| 2 | AVERAGE |
| 3 | HIGH |
| 4 | UNKNOWN |
https://app.servicepoints.nl/api/v2/client/get-disputes
POST
| dispute_type | text [open / action-required / declined / approved] | required |
| page | number | optional |
| min_date | date [yyyy-mm-dd] | optional |
| max_date | date [yyyy-mm-dd] | optional |
| sorting | values [asc/desc] | optional |
| store_id | number | optional |
| dispute_issue | number | optional |
| dispute_solution | number | optional |
| shipping_status | number | optional |
| open_dispute_status | number [1 / 2] (used only when dispute_type is open) | optional |
| search_term | text | optional |
| order_id | number | optional |
| mapping_id | number | optional |
| trackingnumber | text | optional |
All the parameters should be post in JSON
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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
}'
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
{ "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." }
{
"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
}
}
| Value | Description |
|---|---|
| client | The client who raised the dispute, or someone acting for them |
| supplier | The admin supplier |
| agent | A supplier agent |
| admin | Service Points staff — an administrator, support agent or team leader |
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.
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.
| Field | Description |
|---|---|
| resolution_updated_at | When 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_by | Object 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_reason | The reason the dispute was refused, as written by the supplier. Only returned when resolution_status is declined; null otherwise. |
| client_accepted | Whether 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_at | When 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 / currency | The 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. |
| Value | Description |
|---|---|
| open | Open disputes |
| action-required | Disputes that require an action |
| declined | Declined disputes |
| approved | Approved disputes |
| Name | Value |
|---|---|
| Message send | 1 |
| Message received | 2 |
| Name | Value |
|---|---|
| The customer got wrong product | 1 |
| The customer got damaged product | 2 |
| Order processing delay | 3 |
| Other | 4 |
| The item has wrong measurements/does not fit | 5 |
| The product the customer got is bad quality | 6 |
| The order is lost in transit | 7 |
| The product is Out of stock | 8 |
| Name | Value |
|---|---|
| Refund | 1 |
| Resend | 2 |
| I want the order to be shipped immediately | 3 |
| Shipping status id | Shipping status |
|---|---|
| 8 | Waiting for tracking update |
| 3 | In-Transit |
| 9 | Delivered |
| 10 | Failed to deliver |
| 11 | Stuck in-transit |
| 13 | Available for pickup |
| 15 | Alert |
https://app.servicepoints.nl/api/v2/client/get-special-requests
POST
| request_type | text [open / closed] | required |
| page | number | optional |
| min_date | date [yyyy-mm-dd] | optional |
| max_date | date [yyyy-mm-dd] | optional |
| sorting | values [asc/desc] | optional |
| store_id | number | optional |
| shipping_status | number | optional |
| search_term | text | optional |
| order_id | number | optional |
| mapping_id | number | optional |
| trackingnumber | text | optional |
| special_request_category | number | optional |
All the parameters should be post in JSON
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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
}'
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
{ "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." }
{
"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
}
}
| Value | Description |
|---|---|
| open | Open special requests |
| closed | Closed special requests |
| Name | Value |
|---|---|
| Proof of shipment | 1 |
| Proof of delivery | 2 |
| Proof of shipment & proof of delivery | 3 |
| Others | 4 |
| Local tracking | 5 |
| Change size/variant | 6 |
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).
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_role | Description |
|---|---|
| admin_supplier | Replied by the admin supplier |
| agent | Replied 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.
| Shipping status id | Shipping status |
|---|---|
| 8 | Waiting for tracking update |
| 3 | In-Transit |
| 9 | Delivered |
| 10 | Failed to deliver |
| 11 | Stuck in-transit |
| 13 | Available for pickup |
| 15 | Alert |
https://app.servicepoints.nl/api/v2/client/create-special-request
POST
| mapping_ids | array of numbers | required |
| special_request_category | number | required |
| description | text | required |
Note: All the mapping ids must belong to the same order.
All the parameters should be post in JSON
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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."
}'
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
{ "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." }
{
"success": true,
"status_code": 200,
"data": "Special request generated successfully"
}
| Name | Value |
|---|---|
| Proof of shipment | 1 |
| Proof of delivery | 2 |
| Proof of shipment & proof of delivery | 3 |
| Others | 4 |
| Local tracking | 5 |
| Change size/variant | 6 |
https://app.servicepoints.nl/api/v2/client/get-client-balance
POST
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.
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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'
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).
{ "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" }
{
"success": true,
"status_code": 200,
"data": {
"account_detail_id": 60,
"client_name": "testclient Sharma",
"balance": 1500.50,
"negative_balance": 0,
"total_balance": 1500.50
}
}
https://app.servicepoints.nl/api/v2/client/create-custom-order
POST
| product_title | text | required |
| product_description | text | required |
| quantity | number | required |
| order_amount | number | required |
| supplier_user_id | number | required |
All the parameters should be post in JSON
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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
}'
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
{ "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"}
{
"success": true,
"status_code": 200,
"data": {
"custom_order_id": 390,
"is_paid": 1,
"order_amount": 20,
"message": "Custom order successfully added"
}
}
https://app.servicepoints.nl/api/v2/client/get-custom-orders
POST
| id | number | optional |
| custom_order_id | number | optional |
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
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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
}'
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.
{ "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" }
{
"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"
}
}
}
{
"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"
}
]
}
}
https://app.servicepoints.nl/api/v2/client/get-topups
POST
| page | number | optional, defaults to 1 |
| status | string | optional, one of approved, pending, failed, declined |
| from_date | date (YYYY-MM-DD) | optional, inclusive |
| to_date | date (YYYY-MM-DD) | optional, inclusive |
| sorting | string | optional, 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
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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"
}'
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.
{ "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" }
{
"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
}
}
}
{
"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
}
}
}
https://app.servicepoints.nl/api/v2/client/get-stock-per-item
POST
| product_id | number | optional |
| product_variant_id | number | optional |
| store_id | number | optional |
| admin_supplier_id | number | optional |
| stock_category | number | optional |
| min_date | date [yyyy-mm-dd] | optional |
| max_date | date [yyyy-mm-dd] | optional |
| page | number | optional |
| search | string | optional |
All the parameters should be posted in JSON
stock_category can be 1, 2 or 3:
| Value | Stock category |
|---|---|
| 1 | Product stock |
| 2 | Order addon |
| 3 | Custom 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.
A maximum of 1 API requests can run concurrently. Once any one of the running requests completes, a new request can be processed.
| X-SERVICE-POINT-ACCESS-TOKEN | get it from application |
| Content-Type | application/json |
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
}'
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
{ "success": false, "status_code": 401, "message": "Auth token missing." }
{ "success": false, "status_code": 401, "message": "Mismatch API token." }
{
"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
}
}
"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.