This endpoint lets you create an order manually from your own system. Use it when you need to capture sales that don't come from a connected channel, for example:
The order is created in pending status and enters the normal accept → prepare → ship flow.
Orders from channels
If the order already exists in a connected channel (Shopify, Amazon, MercadoLibre…), do not create it manually. Fenicia syncs it automatically via webhooks. Creating duplicate orders causes inventory inconsistencies.
Creates a new manual order in the authenticated tenant
Required permission: orders:create
items[] (required)Each line must include:
| Field | Type | Required | Description |
|---|---|---|---|
sku | string | Yes | Product SKU. Must exist in your catalog. |
quantity | number | Yes | Quantity sold. Greater than 0. |
unitPrice | number | Yes | Unit price before tax. |
discount | number | No | Absolute discount applied to the line. |
taxable | boolean | No | Whether taxes apply. Default: true. |
customerInfo (required)| Field | Type | Required | Description |
|---|---|---|---|
firstName | string | Yes | Customer first name. |
lastName | string | Yes | Customer last name. |
email | string | Yes | Valid email. Used for notifications. |
phone | string | No | Phone number with country code. |
customerId | string | No | ID of an existing customer in your CRM. If omitted, a new one is created. |
deliveryInfo| Field | Type | Description |
|---|---|---|
address | object | Delivery address. |
method | string | Method: standard, express, pickup. |
carrier | string | Carrier: dhl, fedex, estafeta, etc. |
trackingNumber | string | Tracking number if shipped outside Fenicia. |
curl -X POST https://api.fenicia.io/orders \
-H "Authorization: Bearer fn_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"items": [
{ "sku": "SHIRT-RED-M", "quantity": 2, "unitPrice": 499.00 },
{ "sku": "PANTS-BLUE-32", "quantity": 1, "unitPrice": 899.50, "discount": 100 }
],
"customerInfo": {
"firstName": "Maria",
"lastName": "Gonzalez",
"email": "maria.gonzalez@example.com",
"phone": "+525512345678"
},
"shippingAddress": {
"street": "Av. Reforma 123",
"city": "Mexico City",
"state": "CDMX",
"zipCode": "06600",
"country": "MX"
},
"deliveryInfo": { "method": "express", "carrier": "dhl" },
"paymentStatus": "paid",
"tags": ["phone", "vip"],
"notes": "Customer requested gift wrap"
}'{
"_id": "65f3a1b2c4d5e6f7a8b9c0d1",
"externalId": "FEN-10042",
"tenantId": "69db07c8bce4d49b18c42a49",
"channelId": "manual",
"orderStatus": "pending",
"paymentStatus": "paid",
"currency": "MXN",
"subtotal": 1798.50,
"discount": 100.00,
"tax": 287.76,
"total": 1986.26,
"items": [
{
"sku": "SHIRT-RED-M",
"quantity": 2,
"unitPrice": 499.00,
"lineTotal": 998.00
},
{
"sku": "PANTS-BLUE-32",
"quantity": 1,
"unitPrice": 899.50,
"discount": 100.00,
"lineTotal": 799.50
}
],
"customerInfo": {
"customerId": "65f3a1b2c4d5e6f7a8b9c0d2",
"firstName": "Maria",
"lastName": "Gonzalez",
"email": "maria.gonzalez@example.com",
"phone": "+525512345678"
},
"shippingAddress": {
"street": "Av. Reforma 123",
"city": "Mexico City",
"state": "CDMX",
"zipCode": "06600",
"country": "MX"
},
"deliveryInfo": { "method": "express", "carrier": "dhl" },
"tags": ["phone", "vip"],
"notes": "Customer requested gift wrap",
"orderCreated": "2026-04-11T14:23:11.000Z",
"updatedAt": "2026-04-11T14:23:11.000Z"
}Tip
Store the returned _id. You'll need it to read, update, or transition the order in subsequent calls.
| Code | Status | Description |
|---|---|---|
VALIDATION_ERROR | 400 | Missing required fields or invalid formats. |
SKU_NOT_FOUND | 400 | A SKU in items doesn't exist in your catalog. |
INSUFFICIENT_INVENTORY | 409 | Not enough stock for one of the items. |
INSUFFICIENT_PERMISSIONS | 403 | The API key doesn't have the orders:create scope. |
INVALID_API_KEY | 401 | The API key is invalid or revoked. |