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.

Which endpoint should I use?

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

📋
eReq Catalogue Publishing
Set 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 Organisation
Assign items to a 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

New catalogue item required — a new GL account should be made available for self-service requisitioning in eReq. Push it immediately so users can start raising orders against it.
Item description or grouping updated — the GL account name, description, product group, or tax code has changed; resend the record to refresh the catalogue entry in SoftCo.
Item removed from catalogue — send the record with catalog_product set to NO or end_date set to today's date to withdraw the item from the eReq catalogue.
Initial catalogue load — send all active non-inventory items during onboarding to populate the eReq catalogue from day one, either as a batch or as individual records.

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.

Quick Start — Minimal POST
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:

202 Accepted — Success
{
  "status":    "SUCCESS",
  "total":     1,
  "succeeded": 1,
  "failed":    0,
  "errors":    [],
  "message":   "All items processed successfully"
}
What happens next

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.

Your System
HTTP POST
JSON
API Gateway
Auth & Routing
Validated
Integration
Layer
Validate & Transform
XML
Integration
Queue
Async Buffer
Delivered
SoftCo
AP + eReq
Final Destination
1
Send your POST request
Your system sends a JSON payload to POST /non-inventory-items/v1 with your API key, credentials, and one or more non-inventory item records in the body.
2
Gateway checks your credentials
Your API key is validated immediately. An invalid or missing key returns 401 Unauthorized before your payload is processed.
3
Your payload is validated
The integration layer checks your JSON against a defined schema — required fields, valid 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.
4
Data is transformed and queued — you get 202
On success, the payload is converted to SoftCo's GL Codes XML format (the same internal format used for all GL-based master data) and placed on the master data queue. You receive 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.
5
SoftCo receives and publishes the item
The queue listener delivers the record to SoftCo AP and — where 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.
About the 202 Response

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

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

HeaderValueNotes
x-api-keyYour assigned API keyProvided at onboarding. Required on every request.
Client_IdOAuth 2.0 Client IDProvided at onboarding.
Client_SecretOAuth 2.0 Client SecretTreat as a password — do not share or log.
Access_Token_URLOAuth 2.0 token endpointProvided at onboarding.
Content-Typeapplication/JsonMust be present on every POST request.
Lost or compromised credentials?

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

CodeStatusMeaningWhat to do
202AcceptedAll 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.
207Multi-StatusPartial 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.
400Bad RequestPayload failed schema validation. A field-level error is in the response body.Read the error_message field, fix the payload, retry. See Troubleshooting.
401UnauthorizedAPI key missing or invalid.Check your x-api-key header value.
403ForbiddenValid API key but no permission for this endpoint.Contact your SoftCo Customer Success representative.
404Not FoundEndpoint path is incorrect.Verify the URL — check for typos or trailing slashes.
408Request TimeoutRequest took too long to process.Retry once after a short delay.
429Too Many RequestsRate limit exceeded.Slow your request rate and retry after the delay indicated.
500Internal Server ErrorUnexpected error on our side.Retry once. If it persists, raise a ticket with the requestId.
503Service UnavailableService 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.

POST /non-inventory-items/v1

Request Headers

HeaderValue
x-api-keyYour assigned API key.
Content-Typeapplication/Json
Client_IdYour OAuth 2.0 Client ID.
Client_SecretYour OAuth 2.0 Client Secret.
Access_Token_URLYour 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

{
"objects": {
"object": {
"record": [
{ // single element in the record array
"organization": "string", // required
"code": "string", // required — GL account code
"type": "string", // required — DEDUCTABLE | VAT
"description_en": "string", // required
"catalog_product": "string",// recommended — YES | NO
"product_group": "string", // recommended — catalogue grouping
"..." // see Field Reference for full list
}
]
}
}
}

Multiple records (batch)

{
"objects": {
"object": {
"record": [ // record becomes an array — each element is one non-inventory item
{ "organization": "string", "code": "string", "type": "string", "description_en": "string", "..." },
{ "organization": "string", "code": "string", "type": "string", "description_en": "string", "..." }
]
}
}
}
Batch processing behaviour

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.

RequiredMust be present in every request.
RecommendedStrongly advised. SoftCo applies defaults if omitted, but supplying values gives you full control over catalogue visibility and AP behaviour.
OptionalCan be omitted. SoftCo falls back to description_en for absent locale fields.
FieldType / MaxStatusDescription & 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: NO
If 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: DEFAULT
Example 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.

Full Example — Catalogue Item
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.

Minimum Required Fields
{
  "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.

Batch — Multiple Items in One Request
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

Required fields presentorganization, code, type, and description_en must all be included in every record.
Valid type valuetype must be exactly DEDUCTABLE or VAT. Any other value, including casing variants, fails validation.
Field types — all values must be strings.
Payload structure — the objects.object.record envelope must be present and correctly nested.
Date formatstart_date and end_date, if provided, must follow YYYY-MM-DD.
Schema compliance — only defined fields are accepted; unknown properties cause a validation failure.
ItemDetail
StandardJSON Schema draft-07
TriggerFirst step after the request is received — before transformation or queueing
On FailureHTTP 400 Bad Request (invalid request structure) or 207 Multi-Status (some records failed) — the errors array identifies failing records with field-level detail
On SuccessAll 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.

400 Missing required field
One of the required fields — organization, code, type, or description_en — is absent from the payload.
"error_message": "required key [type] not found"
Fix: Add the missing field to your record object and resend. All four required fields must be present in every record.
400 Invalid type value
The type field contains a value other than DEDUCTABLE or VAT. Common mistakes include lowercase variants (deductable), misspellings (DEDUCTIBLE), or sending the field empty.
"error_message": "instance value (\"DEDUCTIBLE\") not found in enum (possible values: [\"DEDUCTABLE\",\"VAT\"])"
Fix: Set type to exactly DEDUCTABLE (note the spelling — not "deductible") or VAT. The value is case-sensitive.
400 Invalid date format
start_date or end_date is present but not in YYYY-MM-DD format.
"error_message": "string \"01/01/2026\" does not match pattern \"^\\d{4}-\\d{2}-\\d{2}$\""
Fix: Format dates as YYYY-MM-DD, e.g. 2026-01-01. Remove any time or timezone component.
400 Malformed payload structure
The objects → object → record envelope is missing or incorrectly nested.
"error_message": "object has missing required properties ([\"record\"])"
Fix: Ensure your payload follows the structure {"objects": {"object": {"record": { … }}}}.
400 Unknown field in payload
The payload contains a field name not defined in the schema. A common mistake is including fields from the Vendor Data API (such as name, currency, or payment_term) or fields from the Accounting Objects API (such as fields without a type).
"error_message": "extraneous key [name] is not permitted"
Fix: Remove the unknown field. This endpoint accepts only: 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.

202 Accepted — Success
{
  "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.

207 Multi-Status — Partial
{
  "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.

400 Bad Request
{
  "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.

401 Unauthorized
{
  "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.