Non-Inventory Items
Overview
The Non-Inventory Items API lets your system push GL-based catalogue products to SoftCo's AP and procurement platform. Non-inventory items give organisations a way to structure their general ledger accounts as purchasable items — without needing a traditional item master. Instead of creating inventory records, you define which GL accounts should be available as selectable products in SoftCo's eRequisition (eReq) module, allowing AP users and budget holders to raise requisitions by picking from a controlled catalogue.
This approach is ideal for services, subscriptions, utilities, professional fees, and other non-physical spend categories where a full inventory item would be unnecessary overhead. Each non-inventory item maps directly to a GL account code — the code field is the GL account identifier — and SoftCo uses the associated metadata to populate the eReq catalogue, assign tax codes, and apply the correct coding when invoices are processed.
How non-inventory items relate to GL Account Codes
The field structure for this endpoint is identical to the GL Account Codes API. The difference is purpose and routing: while the GL Codes endpoint manages the full chart of accounts in SoftCo's AP platform, the Non-Inventory Items endpoint is specifically for the subset of GL codes you want to expose as purchasable catalogue entries. A code sent to this endpoint will appear in the eReq catalogue; a code sent only to GL Codes will be available for invoice coding but not self-service requisitioning.
Use GL Account Codes (POST /general-ledger-codes/v1) to sync your full chart of accounts for AP invoice coding. Use Non-Inventory Items (POST /non-inventory-items/v1) specifically for the GL accounts you want to appear as purchasable items in the eReq catalogue. The two endpoints are independent — a code can be sent to either or both, depending on your configuration.
Key catalogue features
catalog_product to YES to publish the item to the eReq catalogue. Users can then search, select, and raise requisitions against it without manual GL coding.product_group to organise your catalogue into browsable categories — for example, IT_SERVICES, FACILITIES, or PROFESSIONAL_FEES. If omitted, the item defaults to the DEFAULT group.Organisation scope and the organization field
Like all SoftCo master data, non-inventory items are scoped using the organization field. Use "organization": "main" for catalogue items available across the whole organisation. Supply a specific org code for items restricted to a particular legal entity. The behaviour is consistent with the GL Codes API and all other master data interfaces.
When to call this endpoint
catalog_product set to NO or end_date set to today's date to withdraw the item from the eReq catalogue.
Quick Start
Here's the fastest path to a successful integration. Copy this request, swap in your credentials and a real GL account from your ERP, then send it. The minimum required fields are organization, code, type, and description_en.
POST /non-inventory-items/v1 x-api-key: your-api-key-here Content-Type: application/Json Client_Id: your-client-id Client_Secret: your-client-secret { "objects": { "object": { "record": [ { "organization": "main", "code": "6100", "type": "DEDUCTABLE", "description_en": "IT Services" } ] } } }
A successful response looks like this:
{ "status": "SUCCESS", "total": 1, "succeeded": 1, "failed": 0, "errors": [], "message": "All items processed successfully" }
A 202 Accepted with "status": "SUCCESS" means your records have been validated and queued. SoftCo's integration layer picks them up, transforms them to the internal GL Codes XML format, and delivers them to the AP and eReq platform — you don't need to do anything else. If the item doesn't appear in the catalogue within a few minutes, see the Troubleshooting section.
How It Works
Every request follows the same pipeline. Your system only needs to send once — resilience, retries, and delivery to SoftCo are handled automatically.
Layer
Queue
AP + eReq
POST /non-inventory-items/v1 with your API key, credentials, and one or more non-inventory item records in the body.401 Unauthorized before your payload is processed.type values, data types, and structure. If anything fails, you get a 400 Bad Request with a field-level error message. Nothing is queued or forwarded until validation passes.202 Accepted with a SUCCESS status immediately. If some records in a batch fail validation, you receive 207 Multi-Status with details of which records succeeded and which failed.catalog_product is YES — publishes the item to the eReq catalogue under the specified product group. If SoftCo is temporarily unavailable, the queue holds the record and retries automatically.202 Accepted does not mean the item has arrived in SoftCo yet — it means it has been received and queued successfully. The status field (SUCCESS or PARTIAL) confirms whether all records passed validation before queueing. For batch submissions with mixed results, you will receive 207 Multi-Status — the errors array identifies which records failed and why, while valid records are queued and proceed to SoftCo. Delivery is asynchronous and typically completes within minutes. SoftCo processes all master data as incremental updates, so sending the same record again is always safe. If an item does not appear in the eReq catalogue after a reasonable period, contact your SoftCo Customer Success representative, who can check the queue and delivery status on your behalf.
Rate limits are configured per customer during onboarding. If you hit a 429 Too Many Requests response, slow your request rate and retry after a short delay. For your specific rate limit thresholds, contact your SoftCo Customer Success representative.
Authentication
All requests require an API key and OAuth 2.0 credentials. Your credentials are provided during onboarding — keep them secure and never expose them in client-side code or version control.
Requests with a missing or invalid API key are rejected by the gateway immediately and never reach the integration layer.
Required Headers
| Header | Value | Notes |
|---|---|---|
| x-api-key | Your assigned API key | Provided at onboarding. Required on every request. |
| Client_Id | OAuth 2.0 Client ID | Provided at onboarding. |
| Client_Secret | OAuth 2.0 Client Secret | Treat as a password — do not share or log. |
| Access_Token_URL | OAuth 2.0 token endpoint | Provided at onboarding. |
| Content-Type | application/Json | Must be present on every POST request. |
Contact your SoftCo Customer Success representative immediately to rotate your API key. Do not attempt to use the same credentials across multiple customer environments.
Response Codes
| Code | Status | Meaning | What to do |
|---|---|---|---|
| 202 | Accepted | All records validated and queued for delivery to SoftCo. The succeeded count equals total. Delivery is asynchronous. | Nothing — all your records are queued and on their way to SoftCo. |
| 207 | Multi-Status | Partial success. Some records were processed; others failed validation. The errors array identifies which records failed and why. | Read the errors array, fix the failing records, and resubmit only those records. Successfully processed records do not need to be resubmitted. |
| 400 | Bad Request | Payload failed schema validation. A field-level error is in the response body. | Read the error_message field, fix the payload, retry. See Troubleshooting. |
| 401 | Unauthorized | API key missing or invalid. | Check your x-api-key header value. |
| 403 | Forbidden | Valid API key but no permission for this endpoint. | Contact your SoftCo Customer Success representative. |
| 404 | Not Found | Endpoint path is incorrect. | Verify the URL — check for typos or trailing slashes. |
| 408 | Request Timeout | Request took too long to process. | Retry once after a short delay. |
| 429 | Too Many Requests | Rate limit exceeded. | Slow your request rate and retry after the delay indicated. |
| 500 | Internal Server Error | Unexpected error on our side. | Retry once. If it persists, raise a ticket with the requestId. |
| 503 | Service Unavailable | Service temporarily unavailable. | Retry after a short delay. |
POST /non-inventory-items/v1
Submit one or more non-inventory item records to SoftCo. Each record maps to a GL account that will be available for AP coding and, where configured, published as a purchasable item in the eReq catalogue. The payload is validated, transformed to GL Codes XML, and queued for delivery.
Request Headers
| Header | Value |
|---|---|
| x-api-key | Your assigned API key. |
| Content-Type | application/Json |
| Client_Id | Your OAuth 2.0 Client ID. |
| Client_Secret | Your OAuth 2.0 Client Secret. |
| Access_Token_URL | Your OAuth 2.0 token endpoint URL. |
Request Body
Your JSON payload wraps non-inventory item fields inside an objects → object → record envelope. This structure is consistent across all SoftCo master data endpoints.
A single request can carry one record or a batch of multiple records. For a single record request, record is a JSON array with only one element containing the field values. For a batch, record becomes a JSON array where each element is an object representing one item. The outer objects → object envelope remains the same in both cases.
Single record
Multiple records (batch)
When sending a batch, each record is validated independently. Valid records are processed and queued immediately — a single failing record does not block the rest. If any records fail, you receive 207 Multi-Status: the errors array identifies which records (by index) failed and why. Resubmit only the failing records after fixing them.
Field Reference
All fields sit inside objects.object.record. The field set is identical to the GL Account Codes API — the difference is that fields like catalog_product and product_group are particularly significant here, as they control eReq catalogue behaviour.
description_en for absent locale fields.| Field | Type / Max | Status | Description & Guidance |
|---|---|---|---|
| organization | string / 50 | Recommended |
The short code identifying the company or legal entity this item belongs to.
main{org-code}
Use
main for catalogue items available across the whole organisation. Supply a specific org code for entity-scoped items. Values are case-sensitive. Defaults to main if omitted. |
| code | string / 128 | Required |
The GL account code this non-inventory item is built on. SoftCo uses this as the primary key for the catalogue entry — it is also the coding dimension applied to invoices and requisitions raised against this item.
Example:
6100, GL-IT-001 |
| type | string / 50 | Required |
Classifies this GL account for tax handling in SoftCo. The vast majority of non-inventory items will be DEDUCTABLE.
DEDUCTABLEVAT
DEDUCTABLE — standard expense or cost GL account (professional services, IT, utilities, etc.).
VAT — tax control account. Use only for GL codes that represent VAT/tax lines, not for regular spend categories. |
| description_en | string / 4000 | Required |
The name or description of this item in English. This is the label AP users and budget holders see when browsing or searching the eReq catalogue. Make it descriptive and meaningful — a clear name improves catalogue adoption.
Example:
IT Services, Professional Consulting Fees, Office Supplies |
| catalog_product | string / 10 | Recommended |
Controls whether this item is published to the eReq self-service catalogue. Set to YES to allow users to raise requisitions against this GL account directly from the catalogue. Set to NO if the GL account should exist in AP but not be available for self-service ordering.
YESNO
SoftCo default if omitted:
NOIf you're using this endpoint specifically to populate the eReq catalogue, set this field to
YES for every item you want to be orderable. |
| product_group | string / 128 | Recommended |
Assigns this item to a product group in the eReq catalogue. Product groups act as browsable categories — users can filter or navigate by group to find relevant items. Supply a value that matches the product group master data configured in your SoftCo instance.
SoftCo default if omitted:
DEFAULTExample values:
IT_SERVICES, FACILITIES, PROFESSIONAL_FEES, OFFICE_SUPPLIES |
| tax_code | string / 256 | Recommended |
The default tax or VAT code applied when this item is used in SoftCo for invoice coding or eReq requisitioning. SoftCo uses this to pre-populate the tax field, reducing manual effort for AP users. The value should match tax code identifiers configured in your SoftCo instance.
Example:
S20, Z0, EX |
| start_date | string / YYYY-MM-DD | Recommended |
The date from which this item is valid and available in SoftCo. Always include when sending incremental updates.
SoftCo default if omitted:
2001-01-01 |
| end_date | string / YYYY-MM-DD | Recommended |
The date after which this item expires and is no longer available in SoftCo. Set to today's date to retire an item from the catalogue.
SoftCo default if omitted:
2999-12-31 |
| description_en_US | string / 4000 | Optional | Description for the US English (en-US) locale. Only include if your organisation uses this locale and requires a description different from the primary English value.
If omitted: SoftCo uses
description_en for this locale |
| description_fi_FI | string / 4000 | Optional | Description for the Finnish (fi-FI) locale. Only include if your organisation operates in Finland.
If omitted: SoftCo uses
description_en for this locale |
| description_sv_SE | string / 4000 | Optional | Description for the Swedish (sv-SE) locale. Only include if your organisation operates in Sweden.
If omitted: SoftCo uses
description_en for this locale |
Example Request
The examples below cover the most common scenarios. Replace field values with real data from your ERP.
Full Example — Catalogue-Published Item
A fully configured item published to the eReq catalogue, assigned to a product group, with a default tax code and locale descriptions.
POST /non-inventory-items/v1 Content-Type: application/Json x-api-key: your-api-key-here Client_Id: your-client-id Client_Secret: your-client-secret { "objects": { "object": { "record": [ { "organization": "main", "code": "6100", "type": "DEDUCTABLE", "description_en": "IT Services", "description_en_US": "IT Services", "description_fi_FI": "IT-palvelut", "description_sv_SE": "IT-tjänster", "catalog_product": "YES", "product_group": "IT_SERVICES", "tax_code": "S20", "start_date": "2020-01-01", "end_date": "2999-12-31" } ] } } }
Minimum Required Fields
Only the four required fields. Catalogue settings and other fields can be added incrementally.
{ "objects": { "object": { "record": [ { "organization": "main", "code": "6200", "type": "DEDUCTABLE", "description_en": "Professional Consulting Fees" } ] } } }
Batch — Multiple Items in One Request
When sending more than one item, record becomes a JSON array. Each element follows the same structure as a single-record request. The outer objects → object envelope stays exactly the same.
POST /non-inventory-items/v1 Content-Type: application/Json x-api-key: your-api-key-here Client_Id: your-client-id Client_Secret: your-client-secret { "objects": { "object": { "record": [ // record is an array when sending multiple items { "organization": "main", "code": "6100", "type": "DEDUCTABLE", "description_en": "IT Services", "catalog_product":"YES", "product_group": "IT_SERVICES", "tax_code": "S20", "start_date": "2020-01-01", "end_date": "2999-12-31" }, { "organization": "main", "code": "6200", "type": "DEDUCTABLE", "description_en": "Professional Consulting Fees", "catalog_product":"YES", "product_group": "PROFESSIONAL_FEES", "tax_code": "S20", "start_date": "2020-01-01", "end_date": "2999-12-31" }, { "organization": "main", "code": "6300", "type": "DEDUCTABLE", "description_en": "Office Supplies", "catalog_product":"YES", "product_group": "OFFICE_SUPPLIES", "tax_code": "S20", "start_date": "2020-01-01", "end_date": "2999-12-31" } ] } } }
Validation
Your payload is validated before anything else happens. If validation fails, you get a 400 immediately — nothing is queued or forwarded. Fix the payload and retry.
What gets checked
organization, code, type, and description_en must all be included in every record.
type must be exactly DEDUCTABLE or VAT. Any other value, including casing variants, fails validation.
objects.object.record envelope must be present and correctly nested.
start_date and end_date, if provided, must follow YYYY-MM-DD.
| Item | Detail |
|---|---|
| Standard | JSON Schema draft-07 |
| Trigger | First step after the request is received — before transformation or queueing |
| On Failure | HTTP 400 Bad Request (invalid request structure) or 207 Multi-Status (some records failed) — the errors array identifies failing records with field-level detail |
| On Success | All records queued — you receive 202 Accepted with "status": "SUCCESS" |
Troubleshooting
The most common issue is a 400 Bad Request. The response body always includes an error_message field that tells you exactly what went wrong.
organization, code, type, or description_en — is absent from the payload.record object and resend. All four required fields must be present in every record.type field contains a value other than DEDUCTABLE or VAT. Common mistakes include lowercase variants (deductable), misspellings (DEDUCTIBLE), or sending the field empty.type to exactly DEDUCTABLE (note the spelling — not "deductible") or VAT. The value is case-sensitive.start_date or end_date is present but not in YYYY-MM-DD format.YYYY-MM-DD, e.g. 2026-01-01. Remove any time or timezone component.objects → object → record envelope is missing or incorrectly nested.{"objects": {"object": {"record": { … }}}}.name, currency, or payment_term) or fields from the Accounting Objects API (such as fields without a type).organization, code, type, description_en, description_en_US, description_fi_FI, description_sv_SE, catalog_product, product_group, tax_code, start_date, end_date. All field names are snake_case and case-sensitive.Item not appearing in the eReq catalogue?
If you received a 202 Accepted but the item has not appeared in the SoftCo eReq catalogue after several minutes, first check that catalog_product was set to YES in your payload — items sent with NO or without this field will not be published to the catalogue. If the field was set correctly, there is no need to take immediate action — the integration queue manages retries automatically. Contact your SoftCo Customer Success representative with the approximate timestamp of your request if the issue persists. Resending the record is safe — SoftCo processes all master data as incremental updates.
Item appears in AP but not in the eReq catalogue?
This can occur if catalog_product was set to NO (or omitted) in a previous request. Resend the record with catalog_product set to YES and the correct product_group to publish it to the catalogue.
Example Responses
202 Accepted — All Records Processed
Every record in the request was validated and queued successfully. Delivery to SoftCo is asynchronous and typically completes within minutes.
{ "status": "SUCCESS", "total": 1, "succeeded": 1, "failed": 0, "errors": [], "message": "All items processed successfully" }
207 Multi-Status — Partial Success
Some records were queued; one or more failed validation. Only the failed records need to be fixed and resubmitted.
{ "status": "PARTIAL", "total": 2, "succeeded": 1, "failed": 1, "errors": [ { "index": 2, "error": "description_en is required." } ], "message": "Your request was partially successful. 1 of 2 records were queued for delivery." }
400 Bad Request — Invalid Request Structure
The request envelope is missing or malformed. No records were processed.
{ "status": "FAILED", "total": 0, "succeeded": 0, "failed": 0, "errors": [ { "index": 0, "error": "The request is missing the objects section." } ], "message": "No items could be processed as the request structure was invalid.", "expected_format": "objects → object → record (record must be a non-empty array of items)" }
401 Unauthorized
API key missing or invalid. Request rejected at the gateway.
{ "status": "FAILED", "message": "Unauthorized — API key is missing or invalid" }
What's Next
Non-Inventory Items is the final master data interface. With all four master data APIs in place, SoftCo has the complete reference data set it needs — you're ready to start sending transactional data.
Master Data — Complete
All four master data interfaces are now documented. Each one builds on the same queue-based architecture and consistent payload structure.
Transaction Data — Up Next
With master data in place, these three interfaces enable the day-to-day AP processing workflows in SoftCo. Start with Purchase Orders, then Goods Received, and finally Payment Confirmations to complete the end-to-end AP cycle.