curl --request POST \
--url https://api.exowpee.com/v1/order/orders \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exowpee.com/v1/order/orders"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exowpee.com/v1/order/orders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.exowpee.com/v1/order/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.exowpee.com/v1/order/orders"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.exowpee.com/v1/order/orders")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exowpee.com/v1/order/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"number": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"currency_code": "<string>",
"items_net_total": 123,
"items_tax_total": 123,
"items_gross_total": 123,
"discount": 123,
"charge": 123,
"order_tax_total": 123,
"total": 123,
"discount_applications": [
"<unknown>"
],
"status": "<string>",
"payment_status": "<string>",
"seller_id": "<string>",
"cash_register_id": "<string>",
"cashier_id": "<string>",
"confirmed_cashier_shift_id": "<string>",
"confirmed_cash_register_instance_id": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"cancelled_at": "2023-11-07T05:31:56Z",
"rejected_at": "2023-11-07T05:31:56Z",
"approved_by": "<string>",
"rejected_by": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"tax_lines": "<array>",
"items": "<array>",
"payments": "<array>",
"seller": {},
"cash_register": {},
"cashier": {},
"is_credit": true,
"credit_detail": {},
"rendered_html": "<string>"
}{
"message": "<string>",
"errors": {}
}Create an order
A seller creates a new order with items, discounts and customer, as a draft awaiting payment. It may go to approval when a discount or credit limit requires it.
curl --request POST \
--url https://api.exowpee.com/v1/order/orders \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.exowpee.com/v1/order/orders"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.exowpee.com/v1/order/orders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.exowpee.com/v1/order/orders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.exowpee.com/v1/order/orders"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.exowpee.com/v1/order/orders")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.exowpee.com/v1/order/orders")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "<string>",
"number": 123,
"customer_id": "<string>",
"customer_name": "<string>",
"currency_code": "<string>",
"items_net_total": 123,
"items_tax_total": 123,
"items_gross_total": 123,
"discount": 123,
"charge": 123,
"order_tax_total": 123,
"total": 123,
"discount_applications": [
"<unknown>"
],
"status": "<string>",
"payment_status": "<string>",
"seller_id": "<string>",
"cash_register_id": "<string>",
"cashier_id": "<string>",
"confirmed_cashier_shift_id": "<string>",
"confirmed_cash_register_instance_id": "<string>",
"completed_at": "2023-11-07T05:31:56Z",
"cancelled_at": "2023-11-07T05:31:56Z",
"rejected_at": "2023-11-07T05:31:56Z",
"approved_by": "<string>",
"rejected_by": "<string>",
"approved_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"tax_lines": "<array>",
"items": "<array>",
"payments": "<array>",
"seller": {},
"cash_register": {},
"cashier": {},
"is_credit": true,
"credit_detail": {},
"rendered_html": "<string>"
}{
"message": "<string>",
"errors": {}
}- Only a connected seller can create an order.
- The company’s monthly order limit must not be reached (a limit of 0 blocks all orders; no limit when not set).
- items is required with at least one line; stockable and unit must exist, be active and be compatible, unit ids cannot repeat, and each unit_price must match an active price of the company.
- Quantities must be allocated to stock levels or groups as required; the allocated quantity must match the item quantity.
- customer_id is required for a credit sale; customer_name is required without customer_id; credit_due_date cannot be in the past.
- A cash register, when given, must not be locked. A seller tied to a register always uses that register.
- Manual discounts need the orders.applymanualdiscount permission (order level) or order_items.applymanualdiscount (item level); a percentage cannot exceed 100.
- A credit sale beyond the customer’s credit rules is refused unless ask_approval is true, in which case it goes to approval; a customer who is not allowed credit is refused.
- Allocates the next order number of the company.
- Saves the items, allocations, tax lines and discount records, and a credit detail row for a credit sale.
- Sets the status to pending, or awaiting_approval when a manual discount exceeds the company’s approval threshold or the credit rules require approval, and payment_status to unpaid.
- Sends the awaiting-approval notification to the members allowed to approve when the order needs approval.
- Does not touch stock, accounting or customer debt: these change at confirmation.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Response mode. Default none; none answers 204 No Content.
none, resource Comma-separated JSON keys of the root resource (id is always rendered). Available: id, number, customer_id, customer_name, currency_code, items_net_total, items_tax_total, items_gross_total, discount, charge, order_tax_total, total, discount_applications, status, payment_status, seller_id, cash_register_id, cashier_id, confirmed_cashier_shift_id, confirmed_cash_register_instance_id, completed_at, cancelled_at, rejected_at, approved_by, rejected_by, approved_at, created_at, updated_at, is_credit, credit_detail, rendered_html.
Comma-separated include paths, each optionally followed by its fields in parentheses: units(id,sku),units.uomUnit(id,name). Max depth 6, max 40 paths. Available: items, items.taxLines, items.allocations, taxLines, payments, seller, cashRegister, cashier.
Response
Resource (only with response=resource).
Identifier of the order (27-character KSUID string).
Sequential order number inside the company, allocated by the server at creation (last number plus one).
Identifier of the customer, or null for an anonymous sale.
Customer name kept on the order: copied from the stored customer when customer_id is set, otherwise the free text sent.
ISO 4217 currency code of the order, copied from the company settings.
Sum of the lines before tax, after discounts, in major units of currency_code (stored in minor units and divided by 10 to the power of the currency exponent).
Sum of the taxes of the lines, in major units of currency_code.
items_net_total plus items_tax_total, in major units of currency_code.
Total discount applied to the order, in major units of currency_code.
Extra charge added to the order, in major units of currency_code. The server currently always computes 0.
Taxes applied on the whole order rather than on lines, in major units of currency_code.
Amount to pay: items_gross_total plus order_tax_total plus charge, in major units of currency_code.
Discounts applied to the order, one entry per campaign, code or manual discount, with amounts in major units and the allocation to each item. On create and update it is the computed breakdown (ttc_saving filled); on later reads it is the stored record (ttc_saving is null). Null when none is available.
Life-cycle status: pending (waiting for payment), awaiting_approval, approved, unapproved, updating (opened for changes), rejected, completed (cashed) or cancelled. Set by the server.
unpaid, partially_paid or paid. Set by the server at confirmation from the payments received against the total; unpaid before.
Identifier of the seller record that created the order.
Identifier of the register of the order: at creation, the seller's register, or for a direct seller the register sent in the request; once confirmed, the cashier's register. Null for a direct seller who sent no register, until confirmation.
Identifier of the cashier record that confirmed the sale. Null until confirmation.
Identifier of the register session in which the sale was confirmed. Null until confirmation.
Identifier of the cash register computer used by the register session when the sale was confirmed. Null until confirmation.
Time of confirmation, ISO 8601. Null until confirmed.
Time of cancellation, ISO 8601. Null unless cancelled.
Time the cashier rejected the order, ISO 8601. Cleared when the order returns to pending.
Identifier of the agent account or user profile who approved the order. Null when not approved.
Reserved: the reject action does not fill it, so it is normally null.
Time of approval, ISO 8601. Null when not approved or after the approval was withdrawn.
Date and time the record was created (ISO 8601, UTC).
Date and time the record was last changed (ISO 8601, UTC).
Taxes applied at order level (not on a line). Only present when requested with include.
Lines of the order. Only present when requested with include.
Payments recorded when the sale was confirmed. Empty until then. Only present when requested with include.
Summary of the seller record. Only present when requested with include.
Summary of the register. Only present when requested with include.
Summary of the cashier who confirmed the sale. Only present when requested with include.
True for a credit sale, where the customer may leave part or all of the total unpaid and owes it as a debt. A credit sale needs a customer.
Credit sale detail: id, total_amount, remaining_amount, paid_amount (major units), due_date and ask_approval. Null for a cash sale or when the detail is missing. total_amount is set when the order is saved; remaining_amount stays 0 until confirmation, which sets it to the unpaid part.
Invoice rendered at confirmation as HTML. Present only in the response of the confirm action.