API Documentation
The Decimal API provides programmatic access to manage orders, products, invoices, customers, and sale records in your point-of-sale system. This RESTful API uses JSON for all requests and responses.
Base URL
Code
Authentication
All API requests require authentication using an API key in the request header:
Code
Important: You can only access orders created with your API key, invoices generated from those orders, and customers associated with those orders. Products are globally accessible. Sale records (
GET /salerecords) are limited to items on this key's permission list (GET /permissionlist). A key whose permission list is empty gets403.
Example Request:
Code
Permission Scopes
API access is controlled by permission scopes assigned to your API key. Each scope determines which endpoints and operations you can access.
Key Points:
- Requests without required scopes return
403 Forbidden - Only store owners can modify API key permission scopes
- View and manage permissions in the API Keys section
Tip: If you receive 403 errors with valid authentication, verify your API key has the required scope for that endpoint.
Endpoint Scope Reference
The following table shows which scope is required for each API endpoint:
| Endpoint ↑ | Method | Scope | Access | Cost | Description |
|---|---|---|---|---|---|
| /customers | GET | customer:get | ⚠️ all | 1 | GET All Customers. |
| /customers | GET | customercard:get | own⚠️ all | 0 | Get customer credit cards. |
| /customers | POST | customercard:post | own⚠️ all | 1 | Save a customer credit card. |
| /customers | GET | customercard:get | own⚠️ all | 0 | Get customer credit card by ID. |
| /customers | POST | customercharge:post | own⚠️ all | 18 | Charge customer credit card. |
| /customers | GET | customer:get | own⚠️ all | 1 | GET Customer by id. |
| /customers | GET | customerbalance:get | own⚠️ all | 1 | GET Customer balance by ID. |
| /customers | GET | customer:get | own⚠️ all | 1 | GET Customer by phone number |
| /customers | GET | customerbalance:get | own⚠️ all | 1 | GET Customer balance by phone. |
| /customers | GET | customerid:get | ⚠️ all | 1 | GET Customer ID by phone number |
| /invoices | POST | invoice:post | own | 18 | POST Create a new invoice. |
| /invoices | GET | invoice:get | own | 0 | GET Invoice by external (legacy) |
| /invoices | GET | invoice:get | own | 0 | GET Invoice by externalInvoiceId |
| /invoices | GET | invoice:get | own | 0 | GET Invoice by externalOrderId. |
| /invoices | GET | invoice:get | own | 0 | GET Invoice by id. |
| /invoices | GET | invoice:get | own | 0 | GET Invoice by order id. |
| /orders | POST | order:post | own | 18 | POST Order. |
| /orders | GET | order:get | own | 0 | GET Order by externalOrderId. |
| /orders | GET | order:get | own | 0 | GET Order by id. |
| /permissionlist | GET | salerecord:get | ⚠️ all | 0 | Permission list — items this API key may query for sale records. |
| /products | GET | product:get | ⚠️ all | 1 | GET Products. |
| /products | GET | product:get | ⚠️ all | 1 | GET Products by code. |
| /products | GET | product:get | ⚠️ all | 1 | GET Products by id. |
| /routes | GET | deliveryroute:get | own⚠️ all | 1 | GET Routes. |
| /salerecords | GET | salerecord:get | ⚠️ all | 0.1 / row | Sale records — invoice lines for one item code in a date range. |
Each endpoint requires the corresponding scope. Access shows allowed levels: own = your data only, all = all account data. Cost is credits per request, except GET /salerecords, which is 0.1 per returned row.
Additional Scopes
The following scopes are for actions not tied to specific API endpoints:
| Scope | Cost | Description |
|---|---|---|
giftcards* | 12 | Sell gift cards, check their balance, and redeem them at checkout |
* Gift cards: when processed through a non-Decimal POS, that POS may apply additional charges, separate from the gift card credits shown here.
Access Levels
Scopes can have different access levels that determine data visibility:
- own — Access only data created by or associated with your API key
- all — ⚠️ Access all data in the account (sensitive)
For example, with order:get:own you can only read orders created with your API key, while order:get:all allows reading all orders in the account.
API Key Bundles
When creating an API key, you can choose a predefined bundle or configure custom scopes:
Customer PIN
A few endpoints touch customer money or payment instruments directly and require a second factor on top of your API key: the customer's PIN. This is a short numeric code (max 8 digits) that the customer has configured on their POS account. Your API key authenticates your application; the PIN authenticates the customer behind the request.
Send the PIN in the X-Customer-Pin request header:
Code
When is the PIN required?
| Endpoint | PIN Requirement |
|---|---|
GET /customers/id/{id}/balance | Always |
GET /customers/phonenumber/{phoneNumber}/balance | Always |
POST /customers/id/{customerId}/charges | Always |
POST /orders | Conditional — required when payment.method is OnAccount or when paying with a stored credit card (cardId). Not required for ad-hoc cash, food stamp, or temp-card payments. |
Requests missing or failing the PIN check return 401 Unauthorized with an RFC 7807 problem detail.
Security
- Never log or persist a customer's PIN on your side beyond the scope of the single request.
- Do not accept the PIN from a URL query string — always collect it through a secure input and pass it only in the request header.
- The PIN is verified at the POS. A wrong PIN returns
401without leaking whether the customer exists.
Content Type
All requests and responses use application/json:
- Include
Content-Type: application/jsonheader in POST/PUT requests - All responses return JSON format
Rate Limiting
The API implements rate limiting to ensure service stability. Exceeding the current limit returns a 429 Too Many Requests response.
Response Headers
When a request is throttled, the response includes a Retry-After header telling you how long to wait before retrying:
| Header | Example | Description |
|---|---|---|
Retry-After | Retry-After: 60 | Number of seconds to wait before sending another request. |
Example 429 Response:
Code
Handling 429 Responses
Follow these steps when you receive a 429:
- Read the
Retry-Afterheader to determine how many seconds to wait. It is returned in delay-seconds format (a whole number of seconds). - Pause before retrying. Wait at least the number of seconds indicated by
Retry-Afterbefore sending the request again. - Use exponential backoff with jitter for repeated failures, so retries don't all fire at the same moment.
- Avoid tight retry loops. Blindly retrying without honoring
Retry-Afterwill keep you throttled and may extend the block.
Recommended Retry Strategy
Respect Retry-After when it is present, and fall back to exponential backoff (e.g. 1s, 2s, 4s, 8s …) with a small random jitter when it is not. Cap the maximum delay and number of retries so requests fail gracefully instead of hanging indefinitely.
Example (JavaScript):
Code
Pagination
List endpoints (GET /products, GET /customers, GET /permissionlist, GET /salerecords) use cursor-based pagination.
- The
totalcount is only on the first request (nocursor) GET /salerecordsnever includestotal- Use the
cursorfrom the response to fetch the next page — do not invent or edit it - Cursors expire after 1 minute — process pages promptly
- You must include all original query parameters (e.g.,
take,lastMod) alongside thecursor - Stop when
hasMoreis false, or when nocursoris returned
Error Handling
The API uses standard HTTP status codes:
- 200 OK - Request succeeded
- 400 Bad Request - Invalid request parameters
- 401 Unauthorized - Missing or invalid API key
- 403 Forbidden - Valid API key but insufficient permissions
- 404 Not Found - Resource not found
- 429 Too Many Requests - Rate limit exceeded
- 500 Internal Server Error - Server error
Error responses follow the RFC 7807 Problem Details format:
Code
Understanding Orders vs Invoices
The Decimal system follows a structured workflow from order creation to completed transaction.
Order Lifecycle
1. Order Creation
Create an order via POST /orders to capture the customer's purchase intent:
- Represents items the customer wants to purchase
- Records quantities and prices
- Exists in a pre-checkout state
- No payment has been processed
2. Order Fulfillment
The order moves through fulfillment:
- Staff prepares the items for the customer
- Order is readied for checkout
- Remains in "order" status until payment
3. Checkout & Invoice Generation
At checkout, the order converts to an invoice:
- Invoice represents the completed transaction
- Payment processing is initiated
- Order transitions to paid/unpaid status based on payment result
Payment Webhook Requirement
The payment webhook is essential for automated payment processing and invoice completion.
Successful Payment Flow
- Your webhook endpoint receives the payment request
- You process the payment and respond with
"accepted"status - Invoice is marked as paid
- Order is released for fulfillment
Failure Scenarios
The invoice remains unpaid and requires manual processing if:
- No
paymentEndpointprovided in order creation - Webhook times out (>30 seconds)
- Webhook returns an error or non-200 status
Best Practice: Always include a
paymentEndpointin order requests to enable automated payment processing.
Endpoints
Orders
Note: You can only access orders created with your API key.
Create Order
Endpoint: POST /orders
order:postMay Require Customer PIN
POST /orders requires the X-Customer-Pin header when the order's payment is OnAccount or uses a stored credit card (by cardId). It is not required for ad-hoc temp-card, cash, or food-stamp payments. See Customer PIN.
Headers:
| Header | Type | Required | Description |
|---|---|---|---|
| X-Customer-Pin | string (≤8) | Conditional | Customer PIN, required when paying OnAccount or with a stored card |
Request Body:
See the Order schema in the Data Models section.
OrderMethod Values:
PickupDelivery
Response:
A successful order creation returns:
- Status Code:
201 Created - Location Header: Contains the URL to retrieve the created order (e.g.,
/orders/id/15007763)
Example Response Headers:
Code
Payment Processing Webhooks
Overview
Provide a payment webhook endpoint in your order creation request to receive payment processing notifications. Without a webhook, orders remain unpaid and require manual payment processing.
Webhook Configuration
Include the paymentEndpoint object in your order creation request:
Code
Webhook Request
When checkout occurs, we send a POST request to your endpoint:
The eligibleChargeAmount represents the maximum chargeable amount for each payment method, not a suggested amount. Because of this, the combined total across all payment methods may exceed the totalAmountDue. The invoice number is provided for reconciliation.
Endpoint: Your specified paymentEndpoint.url
Payment Method Values:
CreditCardFoodStamps
Request Body:
Code
Webhook Response
Your endpoint must respond with a 200 status code and the following structure:
Code
Status Values:
accepted- Payment processed successfullyrejected- Payment declined or failed
Failure Handling
- Webhook timeout: 30 seconds
- If webhook fails or times out, invoice remains unpaid and requires manual processing
Get Order by ID
Endpoint: GET /orders/id/{id}
order:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| id | string | Internal order identifier |
Example:
Code
Get Order by External ID
Endpoint: GET /orders/external/{externalOrderId}
order:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| externalOrderId | string | External order identifier |
Example:
Code
Products
Get Products
Retrieve a paginated list of products with optional filtering. Results are sorted by product ID (ascending).
Endpoint: GET /products
product:getQuery Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
| take | integer | 20 | Records to return (max 100) |
| cursor | string | - | Cursor for pagination (returned from previous request) |
| lastMod | datetime | - | Filter by products updated since this date (ISO 8601) |
| lastSold | datetime | - | Filter by products sold since this date (ISO 8601) |
| includeInactive | boolean | false | Include inactive products in results |
Understanding lastMod
The lastMod (last modified) timestamp on a product is updated whenever any change occurs to the product record, including:
- Changes to exposed fields (price, description, inventory, etc.)
- Changes to internal fields not yet exposed via the API
This means lastMod may update even if no visible field in the API response has changed. Use lastMod for reliable incremental syncing to catch all product updates.
Example:
Code
Incremental Sync Pattern:
- Store the
lastModtimestamp from your previous sync - Use
lastModin subsequent requests to retrieve only modified products - Paginate through results using the
cursorreturned in the response - Include all original parameters (
take,lastMod, etc.) with each cursor request - Continue until no
cursoris returned
Example Workflow:
Code
Get Product by ID
Endpoint: GET /products/id/{id}
product:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| id | string | Numeric product identifier |
Example:
Code
Get Product by Code
Endpoint: GET /products/code/{code}
product:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| code | string | Product SKU or item code |
Example:
Code
Understanding Product Pricing
The priceQty Field
The priceQty field is a divisor that determines the actual unit price:
Code
Example:
price: 10.00priceQty: 2- Unit Price: $5.00
Common Use Cases:
- Bulk pricing: "2 for $10" promotions
- Fractional pricing: Items sold by weight or volume
- Multi-pack items: Cases or bundles sold as individual units
Invoices
Note: You can only access invoices generated from orders created with your API key.
Create Invoice
Endpoint: POST /invoices
invoice:postCreate a new invoice directly. You must provide either a customerId (existing customer) or a customer object (to create a new customer).
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
| externalInvoiceId | string | Yes | External invoice identifier (max 20 chars) |
| invoiceDate | datetime | Yes | Date the invoice was created (ISO 8601) |
| orderMethod | string | Yes | Pickup or Delivery |
| taxAmount | number | Yes | Total tax amount |
| items | array | Yes | Invoice line items (see below) |
| customerId | string | Conditional | Existing customer ID (provide this OR customer) |
| customer | object | Conditional | New customer details (provide this OR customerId) |
| payments | array | No | Payments applied to this invoice |
| taxableAmount | number | No | Total taxable amount before tax |
| memo | string | No | Memo for the invoice |
Invoice Line Item Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| productId | string | Conditional | Product ID (provide this OR productCode) |
| productCode | string | Conditional | Product code/SKU (provide this OR productId) |
| quantity | number | Yes | Quantity of the product |
| unitPrice | number | Yes | Unit price of the product |
| subtotal | number | Yes | Subtotal before tax/discounts |
| isTaxable | boolean | Yes | Whether the item is taxable |
| discountAmount | number | Yes | Discount amount applied |
Payment Fields:
| Field | Type | Required | Description |
|---|---|---|---|
| paymentMethod | string | Yes | APICreditCard or APIFoodStamp |
| amount | number | Yes | Payment amount |
| referenceNo | string | Yes | Reference number (max 15 chars) |
| dateTime | datetime | Yes | Payment date/time (ISO 8601) |
| maskedCreditCardNumber | string | No | Masked card number |
| cardholderName | string | No | Cardholder name |
| authorizationCode | string | No | Bank authorization code |
Example:
Code
Response:
- Status Code:
201 Created - 400 - Invalid request parameters or product not found
- 404 - Customer not found
- 409 - Invoice with this external ID already exists
Get Invoice by ID
Endpoint: GET /invoices/id/{id}
invoice:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| id | string | Invoice identifier |
Example:
Code
Get Invoice by Order ID
Endpoint: GET /invoices/order/{orderId}
invoice:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| orderId | string | Order identifier |
Example:
Code
Get Invoice by External Invoice ID
Endpoint: GET /invoices/externalinvoiceid/{externalInvoiceId}
invoice:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| externalInvoiceId | string | External invoice identifier |
Example:
Code
Get Invoice by External Order ID
Endpoint: GET /invoices/externalorderid/{externalOrderId}
invoice:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| externalOrderId | string | External order identifier |
Example:
Code
Deprecated Endpoint
GET /invoices/external/{externalOrderId} is deprecated. Use GET /invoices/externalorderid/{externalOrderId} instead.
Customers
Note: With the
customer:get:ownscope, you can only access customers associated with orders created by your API key.To access all customers in the account, use the
customer:get:allscope. ⚠️ This is a sensitive scope — only request it if your application genuinely needs access to all customer data, and ensure you handle personal information responsibly.
Get All Customers
Retrieve a paginated list of all customers with optional filtering by last modified date.
Endpoint: GET /customers
customer:getQuery Parameters:
| Parameter | Type | Default | Description |
|---|---|---|---|
| take | integer | 20 | Records to return (max 100) |
| cursor | string | - | Cursor for pagination (returned from previous request) |
| lastMod | datetime | - | Filter by last modified date (ISO 8601) |
Example:
Code
Get Customer by ID
Endpoint: GET /customers/id/{id}
customer:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| id | string | Customer identifier |
Example:
Code
Get Customer by Phone Number
Endpoint: GET /customers/phonenumber/{phoneNumber}
customer:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| phoneNumber | string | Customer phone number (10 digits) |
Example:
Code
Get Customer ID by Phone Number
Endpoint: GET /customers/phonenumber/{phoneNumber}/id
customerid:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| phoneNumber | string | Customer phone number (10 digits) |
Example:
Code
Customer Credit Cards
Note: Card endpoints never return full card numbers — only masked values, expiration, and issuer.
Get All Cards for a Customer
Retrieve all credit cards on file for a customer.
Endpoint: GET /customers/id/{customerId}/cards
customercard:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| customerId | string | Customer identifier |
Example:
Code
Response:
Code
Get Card by ID
Retrieve a specific credit card by its ID.
Endpoint: GET /customers/id/{customerId}/cards/{cardId}
customercard:getPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| customerId | string | Customer identifier |
| cardId | string | Card identifier |
Example:
Code
Save a Credit Card
Save a credit card to a customer's account. The card is tokenized via the payment gateway — full card numbers are never stored.
Endpoint: POST /customers/id/{customerId}/cards
customercard:postPath Parameters:
| Parameter | Type | Description |
|---|---|---|
| customerId | string | Customer identifier |
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
| cardNumber | string | Yes | Full card number (13-19 digits). Tokenized — never stored raw |
| expMonth | integer | Yes | Expiration month (1-12) |
| expYear | integer | Yes | Expiration year (2-digit, e.g. 26 for 2026) |
| cvv | string | Yes | Card verification value (CVV/CVC) |
| name | string | Yes | Cardholder name (max 25 chars) |
| zip | string | No | Billing zip code (max 5 chars) |
| houseNumber | string | No | Billing house number for AVS verification (max 5 chars) |
Example:
Code
Response:
- Status Code:
201 Created - 400 - Invalid request or gateway rejected the card
- 404 - Customer not found
Customer Balance
Get Balance by Customer ID
Endpoint: GET /customers/id/{id}/balance
customerbalance:getRequires Customer PIN
This endpoint requires the X-Customer-Pin header. See Customer PIN.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
| id | string | Customer identifier |
Headers:
| Header | Type | Required | Description |
|---|---|---|---|
| X-Customer-Pin | string (≤8) | Yes | Customer PIN for second-factor verification |
Example:
Code
Response:
Code
Note: A positive balance means the customer owes money. A negative balance means the store owes the customer.
Get Balance by Phone Number
Endpoint: GET /customers/phonenumber/{phoneNumber}/balance
customerbalance:getRequires Customer PIN
This endpoint requires the X-Customer-Pin header. See Customer PIN.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
| phoneNumber | string | Customer phone number (10 digits) |
Headers:
| Header | Type | Required | Description |
|---|---|---|---|
| X-Customer-Pin | string (≤8) | Yes | Customer PIN for second-factor verification |
Example:
Code
Customer Charges
Charge a Customer's Credit Card
Charge a stored or temporary credit card. The amount must be greater than zero — refunds are not supported via this endpoint.
Endpoint: POST /customers/id/{customerId}/charges
customercharge:postRequires Customer PIN
This endpoint requires the X-Customer-Pin header. See Customer PIN.
Path Parameters:
| Parameter | Type | Description |
|---|---|---|
| customerId | string | Customer identifier |
Headers:
| Header | Type | Required | Description |
|---|---|---|---|
| X-Customer-Pin | string (≤8) | Yes | Customer PIN for second-factor verification |
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
| externalId | string | Yes | Client-provided unique ID for idempotency (max 20 chars) |
| amount | number | Yes | Amount to charge (0.01 - 99999.99) |
| cardId | string | Conditional | Stored card ID. Mutually exclusive with card |
| card | object | Conditional | Temporary card details (same fields as Save Card request). Mutually exclusive with cardId |
Card Identification
You must identify the card using one of two methods:
- By card ID: provide
cardId(stored card) - By temporary card: provide
cardobject with full card details
Example (charge by stored card ID):
Code
Response:
Code
Status Codes:
- 200 - Charge approved
- 400 - Invalid request, card declined, or charge failed
- 404 - Customer or card not found
- 409 - A record with this
externalIdalready exists (idempotency protection)
Sale Records
Sale history is read one item at a time — there is no endpoint that returns the whole store's sales.
Access is granted by the store owner, not by the key itself. Creating an API key grants nothing here, and neither the e-commerce nor the shelf-tag bundle includes it. The owner opens Permission list in the dashboard, which attaches the salerecord:get:all permission to the key, then checks the items this key may look up and saves. Checkbox changes take effect only on save; until then, both routes below return 403.
With access saved, reading history takes two calls:
| You want | Call |
|---|---|
| Which products may I query? | GET /permissionlist |
| History for one of those products | GET /salerecords |
Code
Every response sets x-meter-unit-cost to the number of rows it returns in results.
Permission list
Endpoint: GET /permissionlist
salerecord:getThe items this API key may query. size and unit carry the same meaning as in GET /products.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| take | integer | No | Page size, 1–100. Default 20. |
| cursor | string | No | Opaque. Omit on the first page. Pass the previous page's cursor unchanged after that. |
Example response:
Code
| Field | Meaning |
|---|---|
itemCode | Pass this as itemCode on sale records (primary UPC / SKU). |
description | Item description. |
brand | Brand. |
size | Numeric size. Omitted when the catalog size is zero. |
unit | Unit of measure for size. |
total | Match count. First page only (no cursor on the request). |
hasMore | Another page exists. |
cursor | Token for the next page. Ignore it unless hasMore is true. |
Example:
Code
Errors:
| Status | When |
|---|---|
| 403 | This key's permission list is empty. |
| 400 | take out of range, or cursor is not a token from this API. |
Sale records
Endpoint: GET /salerecords
salerecord:getInvoice lines for a single itemCode. Money fields are per unit (line amount ÷ quantity), rounded to 2 decimals; a line with quantity 0 reports 0 for all of them. This response carries no total — keep paging while hasMore is true. Each returned row costs 0.1 credits, so a full page of 20 lines costs 2 credits.
Query Parameters:
| Parameter | Type | Required | Description |
|---|---|---|---|
| itemCode | string | Yes | From the permission list, or an alias of that item. |
| startDate | date | Yes | Inclusive start (YYYY-MM-DD). Not in the future. |
| endDate | date | Yes | Inclusive end. On or after startDate; at most 31 days; not in the future. |
| take | integer | No | Page size, 1–100. Default 20. |
| cursor | string | No | Opaque. Reuse with the same itemCode, startDate, and endDate. |
Example response:
Code
| Field | Meaning |
|---|---|
invoiceNumber | Invoice that contains the line. |
date | Line date. |
quantity | Units sold on this line. |
unitPrice | Price per unit (line amount ÷ quantity). |
itemDiscount | Per-unit markdown on this line. Not a ticket total. |
allocatedSaleDiscount | This line's share of the sale-level discount, per unit. Not the whole ticket, and not a second line markdown. |
Example:
Code
Errors:
| Status | When |
|---|---|
| 400 | Missing/invalid dates, itemCode empty or too long, take out of range, or cursor does not match this item and date range. |
| 403 | This key's permission list is empty, or this itemCode is not on it. |
| 404 | Unknown itemCode. |
Best Practices
- Pagination - Use
takeandcursorparameters for large datasets - Rate Limiting - Honor the
Retry-Afterheader and implement exponential backoff for 429 errors (see Rate Limiting) - Webhooks - Respond within 30 seconds to avoid timeouts
- Incremental Sync - Use
lastModparameter to efficiently sync product updates - Payment Processing - Include
paymentEndpointto enable automated payment handling - Error Handling - Check HTTP status codes and handle errors appropriately
- Sale records - Page
GET /permissionlistfor a granteditemCode, thenGET /salerecordsfor that code over a window of at most 31 days (see Sale Records)
Support
For API support or questions, contact your Decimal representative.
Sign Up to The Point
Our official periodical keeps you current on feature releases and company updates.