Introduction
The API is organized around REST. Our API has predictable resource-oriented URLs, accepts form-encoded request bodies, returns JSON-encoded responses, and uses standard HTTP response codes, authentication, and verbs.
To use the API in test mode, use your assigned test server. If you do not have a known test server then send us an email at support@spp.cloud
Authentication
To authorize, pass your API key as a Bearer token:
# With shell, you can just pass the correct header with each request
curl https://{server}/api/v1/accounts/ -H "Authorization: Bearer {api-key}"
Replace
{api-key}with your API key &{server}with your server.
API keys are required to access the API. You can register a new API key at your portal, admin access required to register new API keys.
Authentication is performed by passing the API key as a Bearer token in the Authorization header.
Authorization: Bearer {API-key}
The API key must be in the format prefix.owner.secret. The system will validate the key and grant access to the resources owned by the key's owner.
Lists
Each list request in the system can be paginated, sorted, and filtered using QueryString parameters.
Pagination
Each list can be paginated using the two parameters offset and limit.
Get all results from index 10 to 20
curl "/api/v1/accounts/?offset=11&limit=20" \
-H "Authorization: Bearer {api-key}"
The parameter offset indicates where, in the result-set, to begin return items. The parameter limit indicates the upper limit of items, that should be returned, in one request.
Sorting
Sort by name in ascending order
curl "/api/v1/accounts/?sort=name" \
-H "Authorization: Bearer {api-key}"
Sort by name in ascending order and by postal code in descending order
curl "/api/v1/accounts/?sort=name,-postal" \
-H "Authorization: Bearer {api-key}"
Sorting is a powerful way to get the most relevant data based on a sort-order expression. Each property of a result-set is a potential candidate for sorting. There are two prefixes that determines the sort-order, "+" and "-". The "+" and "-" represents ascend and descend. It is also possible to combine multiple sorting-expression with , in order to refine the result even further.
Filtering
The system has a built-in filtering protocol, that can be used to filter list result-sets into smaller pieces.
Filtering accounts by name using operator
-and-
curl "/api/v1/accounts/?filter=$like(name,'%customer%')" \
-H "Authorization: Bearer {api-key}"
There are two kind of operators: -and- and -or-.
Filter all Accounts containing "customer" in their name
curl "/api/v1/accounts/?filter=$like(name,'%customer%')" \
-H "Authorization: Bearer {api-key}"
Several helper-functions are provided in order to make it easier to drilldown a result.
Filter all Orders belonging to a specific customer
curl "/api/v1/orders/?filter=$eq(customer_id,'test-account-001')" \
-H "Authorization: Bearer {api-key}"
| Function | Description |
|---|---|
$date_add(date,amount,unit) |
Adds amount of unit to date |
$date_now() |
Returns current date |
$eq(prop,value) |
Test a property against a value exactly |
$gt(prop,value) |
Test a property against greater-then |
$gteq(prop,value) |
Test a property against greater-then or equal to |
$like(prop,value) |
Test a property against a value likely |
$lt(prop,value) |
Test a property against less-then |
$in(prop,value) |
Test an array property against a value |
$lteq(prop,value) |
Test a property against less-than or equal to |
$neq(prop,value) |
Test a property against a value not equal to |
Accounts
Endpoints
GET /api/v1/accounts/
GET /api/v1/accounts/:id/
PATCH /api/v1/accounts/:id/
Account represents a company with a direct or indirect relation. Accounts are usually created as result of an order.
The Account Object
| Attribute | Type | Description |
|---|---|---|
| id | string | Unique Identifier |
| name | string | Company Name |
| account_type | string | Account Type |
| account_manager_name | string | Name of Account Manager |
| address_line1 | string | Address row 1 |
| address_line2 | string | Address row 2 |
| address_line3 | string | Address row 3 |
| city | string | City address |
| zip_code | string | Zip / postal code |
| state_province_code | string | State / Province code |
| country | string | Country name |
| country_code | string | 2-Letter Country Code |
| vat_number | string | VAT registration number |
| company_number | string | Company registration number |
| private | boolean | Whether the account is private |
| seats | integer | Number of seats |
| primary_contact_email | string | Email of primary contact |
| validity_status | string | Validity status of the account |
| verified | boolean | Whether the account has been verified |
| verified_at | string | Date Time when account was verified |
| local_name | string | Native Company Name |
| last_updated | string | Date Time when object was last changed. |
List Accounts
List Accounts
curl "https://{server}/api/v1/accounts/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"count": 1,
"items": [
{
"id": "test-account-001",
"name": "Test Company AB",
"account_type": "END_CUSTOMER",
"account_manager_name": null,
"address_line1": "Testgatan 1",
"address_line2": null,
"address_line3": null,
"city": "Stockholm",
"zip_code": "111 22",
"state_province_code": null,
"country": "Sweden",
"country_code": "SE",
"vat_number": "SE556677889901",
"company_number": null,
"private": false,
"seats": 5,
"primary_contact_email": "test@example.com",
"validity_status": "VERIFIED",
"verified": true,
"verified_at": "2025-01-15T10:00:00.000Z",
"local_name": null,
"last_updated": "2025-01-15T10:00:00.000Z"
}
]
}
This endpoint retrieves all accounts.
HTTP Request
GET /api/v1/accounts/
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| offset | 0 | After filter and sort, how many records should be skipped |
| limit | 25 | After filter, sort and offset how many records should be returned. |
| sort | - | Specify an optional sorting |
| filter | - | Specify an optional filter |
Retrieve an Account
Get an account based on ID
curl "https://{server}/api/v1/accounts/test-account-001/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"id": "test-account-001",
"name": "Test Company AB",
"account_type": "END_CUSTOMER",
"account_manager_name": null,
"address_line1": "Testgatan 1",
"address_line2": null,
"address_line3": null,
"city": "Stockholm",
"zip_code": "111 22",
"state_province_code": null,
"country": "Sweden",
"country_code": "SE",
"vat_number": "SE556677889901",
"company_number": null,
"private": false,
"seats": 5,
"primary_contact_email": "test@example.com",
"validity_status": "VERIFIED",
"verified": true,
"verified_at": "2025-01-15T10:00:00.000Z",
"local_name": null,
"last_updated": "2025-01-15T10:00:00.000Z"
}
This endpoint retrieves a specific account.
HTTP Request
GET /api/v1/accounts/:id/
URL Parameters
| Parameter | Description |
|---|---|
| id | The ID of the account to retrieve |
Update an Account
Patch an Account
curl "https://{server}/api/v1/accounts/test-account-001/" \
-X PATCH \
-H "Authorization: Bearer {api-key}" \
-H "Content-Type: application/json" \
-d '{"name":"Updated Company AB", "address_line1":"New Street 5", "city":"Gothenburg", "zip_code":"411 00", "country_code":"SE"}'
The above command returns HTTP 200 with body:
"OK"
This endpoint updates a specific account. At least one of the following fields must be provided.
HTTP Request
PATCH /api/v1/accounts/:id/
Body Parameters
| Parameter | Type | Description |
|---|---|---|
| vat_number | string | VAT registration number (1-35 characters) |
| company_number | string | Company registration number (1-35 characters) |
| name | string | Company name (1-50 characters) |
| address_line1 | string | Address row 1 (1-50 characters) |
| address_line2 | string | Address row 2 (1-50 characters) |
| address_line3 | string | Address row 3 (1-50 characters) |
| city | string | City (1-35 characters) |
| zip_code | string | Zip / postal code (1-35 characters) |
| state_province_code | string | State / Province code (1-35 characters) |
| country_code | string | 2-Letter Country Code |
| validity_status | string | Validity status (1-35 characters) |
Assets
Endpoints
GET /api/v1/assets/
GET /api/v1/assets/:id/
Asset represents a licensed product key or subscription. Assets contain information about the product, its validity period, contact information, and related SKUs for renewal or upgrade.
The Asset Object
| Attribute | Type | Description |
|---|---|---|
| id | string | Unique Identifier |
| activation_key | string | Activation key for the asset |
| account_id | string | ID of associated account |
| contact_email | string | Email of the contact |
| contact_first_name | string | Contact first name |
| contact_last_name | string | Contact last name |
| end_date | string | End date of the asset |
| entry_date | string | Entry date of the asset |
| expiry_date | string | Expiry date of the asset |
| expiry_mode | string | Expiry mode (e.g. Permanent) |
| last_updated | string | Date Time when object was last changed |
| organization_text | string | Name of the associated organisation |
| order_date | string | Date the asset was ordered |
| order_id | string | ID of the associated order |
| product_line | string | Product line identifier |
| product_type | string | Product type (e.g. Maintenance, Subscription) |
| reengage_price | object | Re-engage Price object, may be null |
| reengage_sku | string | SKU for re-engage, may be null |
| renewal_sku | string | SKU for renewal |
| renewal_sku_3y | string | SKU for 3-year renewal |
| seats | integer | Number of seats |
| start_date | string | Start date of the asset |
| status | string | Status of the asset (e.g. ACTIVE, EXPIRED) |
| term | integer | Length of term in months |
| unit_price | object | Unit Price object, may be null |
| upgrade_sku | string | SKU for upgrade, may be null |
| user_code | string | User code (e.g. Single user) |
| version | integer | Product version |
List Assets
List Assets
curl "https://{server}/api/v1/assets/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"count": 1,
"items": [
{
"id": "1234-5678-0024-900001-0001",
"activation_key": "1234-5678-0024-900001-0001",
"account_id": null,
"contact_email": "test@example.com",
"contact_first_name": "Test",
"contact_last_name": "User",
"end_date": "2026-07-08",
"entry_date": "2025-07-09",
"expiry_date": "",
"expiry_mode": "Permanent",
"last_updated": "2025-06-27T13:17:25.365Z",
"organization_text": "Test Company AB",
"order_date": null,
"order_id": null,
"product_line": "BRICSCAD_PRO",
"product_type": "Maintenance",
"reengage_price": null,
"reengage_sku": null,
"renewal_sku": "PRO-SU-MNT-REN-NA-1Y",
"renewal_sku_3y": "PRO-SU-MNT-REN-NA-3Y",
"seats": 1,
"start_date": "2025-07-09",
"status": "ACTIVE",
"term": 12,
"unit_price": null,
"upgrade_sku": null,
"user_code": "Single user",
"version": 25
}
]
}
This endpoint retrieves all assets.
HTTP Request
GET /api/v1/assets/
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| offset | 0 | After filter and sort, how many records should be skipped |
| limit | 25 | After filter, sort and offset how many records should be returned. |
| sort | - | Specify an optional sorting |
| filter | - | Specify an optional filter |
Retrieve an Asset
Get an asset based on ID
curl "https://{server}/api/v1/assets/1234-5678-0024-900001-0001/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"id": "1234-5678-0024-900001-0001",
"activation_key": "1234-5678-0024-900001-0001",
"account_id": null,
"contact_email": "test@example.com",
"contact_first_name": "Test",
"contact_last_name": "User",
"end_date": "2026-07-08",
"entry_date": "2025-07-09",
"expiry_date": "",
"expiry_mode": "Permanent",
"last_updated": "2025-06-27T13:17:25.365Z",
"organization_text": "Test Company AB",
"order_date": null,
"order_id": null,
"product_line": "BRICSCAD_PRO",
"product_type": "Maintenance",
"reengage_price": null,
"reengage_sku": null,
"renewal_sku": "PRO-SU-MNT-REN-NA-1Y",
"renewal_sku_3y": "PRO-SU-MNT-REN-NA-3Y",
"seats": 1,
"start_date": "2025-07-09",
"status": "ACTIVE",
"term": 12,
"unit_price": null,
"upgrade_sku": null,
"user_code": "Single user",
"version": 25
}
This endpoint retrieves a specific asset.
HTTP Request
GET /api/v1/assets/:id/
URL Parameters
| Parameter | Description |
|---|---|
| id | The ID of the asset to retrieve |
Contacts
Endpoints
GET /api/v1/contacts/
GET /api/v1/contacts/:id/
Contact represents a person associated with an account, such as the primary contact or administrator.
The Contact Object
| Attribute | Type | Description |
|---|---|---|
| id | string | Unique Identifier (same as email) |
| string | Email address | |
| bricsys_id | string | Bricsys ID |
| first_name | string | First Name |
| last_name | string | Last Name |
| job_title | string | Job title |
| company_phone | string | Company phone number |
| direct_phone | string | Direct phone number |
| organization_text | string | Name of associated organisation |
| account_id | string | ID of associated account |
| account_name | string | Name of associated account |
| country | string | Country name |
| country_code | string | 2-Letter Country Code |
| state | string | State / Province |
| postal_code | string | Postal number / zip code |
| language | string | Operating language |
| status | string | Contact status (e.g. ACTIVE) |
| seats | integer | Number of seats |
| last_updated | string | Date Time when object was last changed |
List Contacts
List Contacts
curl "https://{server}/api/v1/contacts/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"count": 1,
"items": [
{
"id": "test@example.com",
"email": "test@example.com",
"bricsys_id": "9900001",
"first_name": "Test",
"last_name": "User",
"job_title": "Engineer",
"company_phone": "+46701234567",
"direct_phone": null,
"organization_text": "Test Company AB",
"account_id": "test-account-001",
"account_name": "Test Company AB",
"country": "Sweden",
"country_code": "SE",
"state": "",
"postal_code": "11122",
"language": "English",
"status": "ACTIVE",
"seats": 2,
"last_updated": "2025-01-15T10:00:00.000Z"
}
]
}
This endpoint retrieves all contacts.
HTTP Request
GET /api/v1/contacts/
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| offset | 0 | After filter & sort, how many records should be skipped |
| limit | 25 | After filter, sort & offset how many records should be returned. |
| sort | - | Specify an optional sorting |
| filter | - | Specify an optional filter |
Retrieve a Contact
Get specific Contact with id
test@example.com
curl "https://{server}/api/v1/contacts/test@example.com/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"id": "test@example.com",
"email": "test@example.com",
"bricsys_id": "9900001",
"first_name": "Test",
"last_name": "User",
"job_title": "Engineer",
"company_phone": "+46701234567",
"direct_phone": null,
"organization_text": "Test Company AB",
"account_id": "test-account-001",
"account_name": "Test Company AB",
"country": "Sweden",
"country_code": "SE",
"state": "",
"postal_code": "11122",
"language": "English",
"status": "ACTIVE",
"seats": 2,
"last_updated": "2025-01-15T10:00:00.000Z"
}
This endpoint retrieves a specific contact.
HTTP Request
GET /api/v1/contacts/:id/
URL Parameters
| Parameter | Description |
|---|---|
| id | The ID of the contact to retrieve |
Articles
Endpoints
GET /api/v1/articles/
GET /api/v1/articles/:id/
GET /api/v1/articles/?q={search}&limit={limit}
Article represents something that can be ordered (SKU / Item). An article comes with fields that describe the product, pricing, and how it can be used for transactions.
The Article Object
| Attribute | Type | Description |
|---|---|---|
| id | string | Unique Identifier (SKU) |
| description | string | Description of Article |
| product_line | string | Product line identifier |
| product_type | string | Product type |
| product_group | string | Product group |
| user_code | string | User code (e.g. Single user) |
| coming_from | string | Source article, may be null |
| crossgrade | string | Crossgrade article, may be null |
| term | integer | Length of term in months |
| discount | number | Discount rate (e.g. 0.32 for 32%) |
| srp_price | object | Suggested Retail Price object |
| pur_price | object | Purchase Price object |
| last_updated | string | Date Time when object was last changed. |
List Articles
List Articles
curl "https://{server}/api/v1/articles/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"count": 1,
"items": [
{
"id": "PRO-SU-MNT-REN-NA-1Y",
"description": "BricsCAD Pro - Single User Annual Maintenance Renewal",
"product_line": "BRICSCAD_PRO",
"product_type": "MAINTENANCE",
"product_group": "RENEWAL",
"user_code": "Single user",
"coming_from": null,
"crossgrade": null,
"term": 12,
"discount": 0.32,
"srp_price": {
"eur": 253,
"usd": 266,
"gbp": 226
},
"pur_price": {
"eur": 172.04,
"usd": 180.88,
"gbp": 153.68
},
"last_updated": "2025-09-08T11:04:03.307Z"
}
]
}
This endpoint retrieves all articles.
HTTP Request
GET /api/v1/articles/
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| offset | 0 | After filter & sort, how many records should be skipped |
| limit | 25 | After filter, sort & offset how many records should be returned. |
| sort | - | Specify an optional sorting |
| filter | - | Specify an optional filter |
Search Articles
Search Articles by query string
curl "https://{server}/api/v1/articles/?q=BricsCAD&limit=10" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"count": 1,
"items": [
{
"id": "PRO-SU-MNT-REN-NA-1Y",
"description": "BricsCAD Pro - Single User Annual Maintenance Renewal",
"product_line": "BRICSCAD_PRO",
"product_type": "MAINTENANCE",
"product_group": "RENEWAL",
"user_code": "Single user",
"coming_from": null,
"crossgrade": null,
"term": 12,
"discount": 0.32,
"srp_price": {
"eur": 253,
"usd": 266,
"gbp": 226
},
"pur_price": {
"eur": 172.04,
"usd": 180.88,
"gbp": 153.68
},
"last_updated": "2025-09-08T11:04:03.307Z"
}
]
}
This endpoint searches articles by a text query.
HTTP Request
GET /api/v1/articles/?q={search}
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| q | - | Search query string |
| limit | 50 | Maximum number of results to return |
| filter | - | Specify an optional filter |
Retrieve an Article
Get an Article based on SKU
curl "https://{server}/api/v1/articles/PRO-SU-MNT-REN-NA-1Y/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"id": "PRO-SU-MNT-REN-NA-1Y",
"description": "BricsCAD Pro - Single User Annual Maintenance Renewal",
"product_line": "BRICSCAD_PRO",
"product_type": "MAINTENANCE",
"product_group": "RENEWAL",
"user_code": "Single user",
"coming_from": null,
"crossgrade": null,
"term": 12,
"discount": 0.32,
"srp_price": {
"eur": 253,
"usd": 266,
"gbp": 226
},
"pur_price": {
"eur": 172.04,
"usd": 180.88,
"gbp": 153.68
},
"last_updated": "2025-09-08T11:04:03.307Z"
}
This endpoint retrieves a specific article.
HTTP Request
GET /api/v1/articles/:id/
URL Parameters
| Parameter | Description |
|---|---|
| id | The ID (SKU) of the article to retrieve |
Orders
Endpoints
GET /api/v1/orders/
GET /api/v1/orders/:id/
POST /api/v1/orders/
PATCH /api/v1/orders/:id/
Orders represent transactions placed through the system. Orders can be created, listed, retrieved, and their status can be updated.
The Order Object
| Attribute | Type | Description |
|---|---|---|
| id | string | Unique Identifier |
| creation_date | string | Date when order was created |
| order_type | string | Order type (e.g. standard) |
| reseller_id | string | Reseller ID |
| reseller_name | string | Name of Reseller |
| customer_id | string | Customer account ID |
| customer_name | string | Name of the customer |
| customer_address_line1 | string | Address Line 1 of customer |
| customer_address_line2 | string | Address Line 2 of customer |
| customer_address_line3 | string | Address Line 3 of customer |
| customer_city | string | City of customer |
| customer_postal | string | Postal code of customer |
| customer_country | string | Country of customer |
| customer_country_code | string | 2-Letter Country Code of customer |
| customer_state | string | State / Province of customer |
| currency | string | Currency of the order (e.g. eur) |
| contact_bricsys_id | string | Bricsys ID of the contact |
| contact_first_name | string | First name of the contact |
| contact_last_name | string | Last name of the contact |
| contact_email | string | Email of the contact |
| user_id | string | User ID that created the order |
| contact_country_code | string | 2-Letter Country Code of the contact |
| quantity | integer | Total number of items in order |
| items | array | Array of Order Items |
| delivery_date | string | Delivery Date for the order |
| reference_number | string | Reference order number |
| status | string | Order status (e.g. CREATED, PROCESSED, REJECTED) |
| srp_total | number | Total SRP price |
| pur_total | number | Total purchase price |
| last_updated | string | Date Time when object was last changed |
Order Items
| Attribute | Type | Description |
|---|---|---|
| action | string | Order action: NEW, RENEWAL, or UPDATE |
| sku | string | SKU of the Article being ordered |
| description | string | Description of the article |
| quantity | integer | Number of items |
| term | integer | Length of term in months |
| srp_price | number | SRP price per item |
| discount | number | Discount rate |
| pur_price | number | Purchase price per item |
| start_date | string | Start date for the item |
| end_date | string | End date for the item |
| activation_key | string | Short activation key, may be null |
| activation_key_full | string | Full activation key, may be null |
List Orders
List Orders
curl "https://{server}/api/v1/orders/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"count": 1,
"items": [
{
"id": "90000000001",
"creation_date": "2025-06-28",
"order_type": "standard",
"reseller_id": "1218",
"reseller_name": "Test Reseller AB",
"customer_id": "test-customer-001",
"customer_name": "Test Customer Corp",
"customer_address_line1": "123 Test Street",
"customer_address_line2": null,
"customer_address_line3": null,
"customer_city": "Stockholm",
"customer_postal": "11122",
"customer_country": "Sweden",
"customer_country_code": "SE",
"customer_state": null,
"currency": "eur",
"contact_bricsys_id": "9000001",
"contact_first_name": "Anna",
"contact_last_name": "Testsson",
"contact_email": "anna@testcustomer.se",
"user_id": "test@proxydev.se",
"contact_country_code": "SE",
"quantity": 2,
"items": [
{
"action": "NEW",
"sku": "PRO-SU-SUB-NEW-NA-1Y",
"description": "BricsCAD Pro - Single User Annual Subscription New",
"quantity": 1,
"end_date": "2026-06-27",
"activation_key": null,
"activation_key_full": null,
"start_date": "2025-06-28",
"srp_price": 780,
"discount": 0.32,
"pur_price": 530.40,
"term": 12
}
],
"delivery_date": "2025-06-28",
"reference_number": "TEST-ORDER-001",
"status": "CREATED",
"srp_total": 1560,
"pur_total": 1060.80,
"last_updated": "2025-06-28T10:00:00.000Z"
}
]
}
This endpoint retrieves all orders.
HTTP Request
GET /api/v1/orders/
Query Parameters
| Parameter | Default | Description |
|---|---|---|
| offset | 0 | After filter and sort, how many records should be skipped |
| limit | 25 | After filter, sort and offset how many records should be returned. |
| sort | - | Specify an optional sorting |
| filter | - | Specify an optional filter |
Retrieve an Order
Get an order based on ID
curl "https://{server}/api/v1/orders/90000000001/" \
-H "Authorization: Bearer {api-key}"
The above command returns JSON structured like this:
{
"id": "90000000001",
"creation_date": "2025-06-28",
"order_type": "standard",
"reseller_id": "1218",
"reseller_name": "Test Reseller AB",
"customer_id": "test-customer-001",
"customer_name": "Test Customer Corp",
"customer_address_line1": "123 Test Street",
"customer_address_line2": null,
"customer_address_line3": null,
"customer_city": "Stockholm",
"customer_postal": "11122",
"customer_country": "Sweden",
"customer_country_code": "SE",
"customer_state": null,
"currency": "eur",
"contact_bricsys_id": "9000001",
"contact_first_name": "Anna",
"contact_last_name": "Testsson",
"contact_email": "anna@testcustomer.se",
"user_id": "test@proxydev.se",
"contact_country_code": "SE",
"quantity": 2,
"items": [
{
"action": "NEW",
"sku": "PRO-SU-SUB-NEW-NA-1Y",
"description": "BricsCAD Pro - Single User Annual Subscription New",
"quantity": 1,
"end_date": "2026-06-27",
"activation_key": null,
"activation_key_full": null,
"start_date": "2025-06-28",
"srp_price": 780,
"discount": 0.32,
"pur_price": 530.40,
"term": 12
}
],
"delivery_date": "2025-06-28",
"reference_number": "TEST-ORDER-001",
"status": "CREATED",
"srp_total": 1560,
"pur_total": 1060.80,
"last_updated": "2025-06-28T10:00:00.000Z"
}
This endpoint retrieves a specific order.
HTTP Request
GET /api/v1/orders/:id/
URL Parameters
| Parameter | Description |
|---|---|
| id | The ID of the order to retrieve |
Create an Order
Create a new order
curl -X POST "https://{server}/api/v1/orders/" \
-H "Authorization: Bearer {api-key}" \
-H "Content-Type: application/json" \
-d '{
"currency": "eur",
"delivery_date": "2025-06-28",
"reference_number": "MY-ORDER-001",
"customer_id": "test-account-001",
"contact_email": "test@example.com",
"items": [
{
"action": "NEW",
"sku": "PRO-SU-SUB-NEW-NA-1Y",
"quantity": 1
}
]
}'
The above command returns HTTP 200 with body:
"OK"
This endpoint creates a new order. The system resolves customer and contact details from the provided IDs, looks up article pricing, and calculates start/end dates based on the article term.
HTTP Request
POST /api/v1/orders/
Order Payload
| Attribute | Type | Description |
|---|---|---|
| currency | string | Currency code for the order (e.g. eur, usd, gbp) |
| delivery_date | string | optional Delivery date (defaults to today) |
| reference_number | string | optional Your reference order number |
| customer_id | string | optional ID of existing customer account. If not provided, use company_name, city, zip_code, country, country_code |
| company_name | string | optional Customer company name (when not using customer_id) |
| customer_address_line1 | string | optional Address line 1 |
| customer_address_line2 | string | optional Address line 2 |
| customer_address_line3 | string | optional Address line 3 |
| city | string | optional Customer city (when not using customer_id) |
| zip_code | string | optional Customer postal code (when not using customer_id) |
| country | string | optional Customer country (when not using customer_id) |
| country_code | string | optional Customer country code (when not using customer_id) |
| state_province_code | string | optional State / Province code |
| contact_email | string | Contact email. If the email matches an existing contact, their details will be used automatically |
| contact_first_name | string | optional Contact first name (used if contact doesn't already exist) |
| contact_last_name | string | optional Contact last name (used if contact doesn't already exist) |
| contact_country_code | string | optional Contact country code |
| items | array | Array of Order Items |
Create Order Items
| Attribute | Type | Description |
|---|---|---|
| action | string | Order action: NEW, RENEWAL, or UPDATE |
| sku | string | SKU of the Article to order (for NEW and UPDATE actions) |
| quantity | integer | Number of items to order |
| activation_key | string | Full activation key (required for RENEWAL and UPDATE actions) |
| start_date | string | optional Start date (defaults to today, max 30 days in the future). Only for NEW and UPDATE |
| term | integer | optional Term in months. For RENEWAL, use 36 for 3-year renewal SKU (defaults to 1-year) |
Update Order Status
Patch an Order status
curl "https://{server}/api/v1/orders/90000000001/" \
-X PATCH \
-H "Authorization: Bearer {api-key}" \
-H "Content-Type: application/json" \
-d '{"status": "PROCESSED"}'
The above command returns JSON structured like this:
{
"status": "ok"
}
This endpoint updates the status of an existing order.
HTTP Request
PATCH /api/v1/orders/:id/
URL Parameters
| Parameter | Description |
|---|---|
| id | The ID of the order to update |
Body Parameters
| Parameter | Type | Description |
|---|---|---|
| status | string | New order status. Must be a valid status value. |
Price Object
Price objects are consistently represented with this object when it is attached with a non-financial document. A financial object is denoted in one currency while other objects support several currencies. The currencies listed in price object depends on your solution setup. Each currency defined in solution setup is represented as a three-letter ISO currency code, in lowercase
Price Object Example
{
"dkk": 15400,
"eur": 1855,
"gbp": 1855,
"nok": 23200,
"sek": 23000,
"usd": 1855
}
| Attribute | Type | Description |
|---|---|---|
| cur | number | Amount in currency |
Errors
API uses conventional HTTP response codes to indicate the success or failure of an API request. In general: Codes in the 2xx range indicate success. Codes in the 4xx range indicate an error that failed given the information provided (e.g., a required parameter was omitted, a charge failed, etc.). Codes in the 5xx range indicate an error server side.
The API uses the following HTTP Status codes:
| Code | Description |
|---|---|
| 200 - OK | Everything worked as expected. |
| 400 - Bad Request | The request was unacceptable, often due to missing a required parameter. |
| 401 - Unauthorized | Your authentication is invalid or expired. |
| 403 - Forbidden | The API key doesn't have permissions to perform the request. |
| 404 - Not Found | The requested resource doesn't exist. |
| 405 - Method Not Allowed | Target resource doesn't support this method. |
| 500, 502, 503, 504 - Server Errors | Something went wrong on our end, feel free to contact us. |