Overview

The Accounting Objects API lets your system push organisational dimension data to SoftCo's AP platform. Accounting objects are the building blocks SoftCo uses to represent how your organisation is structured — cost centres, departments, business units, projects, and similar classifications that AP users apply when coding invoices and requisitions.

SoftCo supports up to nine distinct accounting object types, each representing a different dimension of your organisational structure. Most customers configure at least one type — typically a cost centre — but you can use as many as your organisation requires. Each type is managed independently: you send a separate request per type, identified by the accountingType query parameter.

Accounting Object Types

The table below shows the range of accounting object types SoftCo supports. Your specific types and their identifiers are configured during onboarding — your SoftCo Customer Success representative will confirm which types are active for your organisation and what values to use for accountingType.

Cost Centre
Business Unit
Department
Class
Project
Project Task
Custom Classification
One type per request

Each API call sends data for a single accounting object type. If your organisation uses cost centres and departments, you make two separate calls — one with accountingType=COSTCENTRE and one with accountingType=DEPARTMENT (using your configured type identifiers). Each call can carry one record or a batch of records for that type.

Organisation scope and the organization field

Like all SoftCo master data, accounting objects can be scoped to a specific legal entity or made available across all organisations. Use "organization": "main" for codes that apply across the entire organisation — for example, a shared set of cost centres used by all business units. For codes specific to a particular legal entity or operating company, supply that entity's organisation code. The behaviour mirrors the GL Codes API and is consistent across all master data interfaces.

When to call this endpoint

New accounting object created in your ERP — push it immediately so AP users can start coding against it in SoftCo.
Accounting object updated — description or validity dates changed; resend the record to keep SoftCo in sync.
Accounting object deactivated — send a record with end_date set to today's date to prevent further coding against it.
Initial data load — send all active accounting objects during onboarding, either as a batch or as individual records. Repeat for each active accounting object type.
New accounting object type activated — if a new dimension is configured in SoftCo (e.g. a project dimension added post go-live), send an initial load for that type using its assigned accountingType value.

Quick Start

Here's the fastest path to a successful integration. Copy this request, swap in your credentials, your accountingType value, and a real accounting object from your ERP, then send it.

Quick Start — Minimal POST
POST /accounting-objects/v1?accountingType=COSTCENTRE
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":           "1001",
        "description_en": "Sales"
        }
      ]
    }
  }
}

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 automatically and delivers them to the AP platform — you don't need to do anything else. If you don't see the accounting object in SoftCo 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
Final Destination
1
Send your POST request
Your system sends a JSON payload to POST /accounting-objects/v1?accountingType={type} with your API key, credentials, and the accounting type in the query string.
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, 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 internal XML format and placed on the master data queue, tagged with the accounting object type from your query parameter. 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 the record
The queue listener picks up the record and delivers it to the correct accounting dimension in SoftCo's AP platform. If SoftCo is temporarily unavailable, the queue holds the record and retries automatically — your system only ever needs to send once.
About the 202 Response

202 Accepted does not mean the record 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 accounting object does not appear in SoftCo 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

These response codes apply to all endpoints. Build your error handling around them from the start.

CodeStatusMeaningWhat 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 Bad request — the payload structure is invalid or missing required envelope. Check the errors array and the expected_format field for guidance. Fix the request structure and retry. See Troubleshooting.
401 Unauthorized API key missing or invalid. Request was rejected at the gateway. 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. Raise a ticket if it persists.
429 Too Many Requests Rate limit exceeded. Slow your request rate and retry after the delay indicated in the response.
500 Internal Server Error Unexpected error on our side. Retry once. If it persists, raise a ticket with the requestId from the response.
503 Service Unavailable Service temporarily unavailable. Retry after a short delay. Check the SoftCo status page.

POST /accounting-objects/v1

Submit one or more accounting object records to SoftCo's AP platform. The payload is validated, transformed, and queued for delivery to the specified accounting dimension.

POST /accounting-objects/v1?accountingType={type}

Query Parameter

ParameterTypeStatusDescription
accountingType string Required Identifies which accounting dimension type the records in this request belong to. SoftCo uses this value to route the data to the correct dimension slot in the AP platform. Each request must carry records for one type only — if you need to send data for multiple types, make a separate request for each.
Your valid accountingType values are defined during SoftCo onboarding and correspond to the accounting dimensions configured for your organisation. Contact your SoftCo Customer Success representative if you need to confirm your values. Example values include COSTCENTRE, DEPARTMENT, PROJECT, BUSINESSUNIT — the exact identifiers depend on your SoftCo configuration.

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 accounting object 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 accounting entry. Both forms are shown below and illustrated in the Example Request section.

Single record

{
"objects": {
"object": {
"record": [
{ // single element in the record array
"organization": "string", // required
"code": "string", // required
"description_en": "string", // required
"start_date": "string", // recommended
"..." // see Field Reference for full list
}
]
}
}
}

Multiple records (batch)

{
"objects": {
"object": {
"record": [ // record becomes an array — each element is one accounting object
{ "organization": "string", "code": "string", "description_en": "string", "..." },
{ "organization": "string", "code": "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 table below covers every field, its type, whether it's required, SoftCo defaults where applicable, and practical mapping guidance.

RequiredMust be present in every request.
OptionalCan be omitted. SoftCo falls back to description_en for absent locale fields.
RecommendedStrongly advised. SoftCo applies a system default if omitted, but supplying a value gives you full control over validity and availability in AP.
FieldType / MaxStatusDescription & Guidance
organization string / 50 Recommended The short code identifying the company or legal entity this accounting object belongs to.
main{org-code}
Shared across all organisations: use main — for example, a set of cost centres that apply company-wide.
Organisation-specific: supply the relevant org code — the code must match an organisation configured in SoftCo. Values are case-sensitive.

Defaults to main if omitted.
code string / 128 Required The unique identifier for this accounting object as it appears in your ERP. SoftCo uses this as the primary key to create and update entries within the accounting dimension. Numeric and alphanumeric codes are both accepted.
Example: 1001
description_en string / 4000 Required The name or description of this accounting object in English. This is the primary label AP users see when selecting a dimension value during invoice coding in SoftCo. It is also used as the fallback for any locale description field not supplied.
Example: Sales
description_en_US string / 4000 Optional Description for the US English (en-US) locale. Only include this if your organisation uses a US English locale and needs a description that differs 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 this 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 this if your organisation operates in Sweden.
If omitted: SoftCo uses description_en for this locale
start_date string / YYYY-MM-DD Recommended The date from which this accounting object is valid and available for AP coding in SoftCo. Always include this when sending incremental updates — omitting it on an update may affect the object's validity window.
SoftCo default if omitted: 2001-01-01 (effectively, valid from the start)
For an initial full load where all objects are open-ended, you may rely on the default. For incremental syncs, always supply the actual date.
end_date string / YYYY-MM-DD Recommended The date after which this accounting object expires and can no longer be used for AP coding in SoftCo. To deactivate an object, set this to today's date.
SoftCo default if omitted: 2999-12-31 (effectively, no expiry)
For objects with no planned expiry, you may rely on the default.

Example Request

The examples below use cost centre as the accounting type. Replace COSTCENTRE with your configured accountingType value and field values with your own data.

Full Example — All Fields

Full Example — All Fields
POST /accounting-objects/v1?accountingType=COSTCENTRE
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":              "1001",
        "description_en":    "Sales",
        "description_en_US": "Sales",
        "description_fi_fi": "Myynti",
        "description_sv_SE": "Försäljning",
        "start_date":        "2001-01-01",
        "end_date":          "2999-12-31"
        }
      ]
    }
  }
}

Minimum Required Fields

Only the three required fields. Locale descriptions and recommended fields can be added incrementally.

Minimum Required Fields
{
  "objects": {
    "object": {
      "record": [
        {      
        "organization":   "main",
        "code":           "1006",
        "description_en": "Finance"
        }
      ]      
    }
  }
}

With Locale Descriptions

Include locale fields only for the locales your organisation actively uses.

With Locale Descriptions
{
  "objects": {
    "object": {
      "record": [
        {      
        "organization":      "main",
        "code":              "1003",
        "description_en":    "Operations",
        "description_fi_fi": "Toiminnot",    // Finnish locale in use
        "description_sv_SE": "Operationer"   // Swedish locale in use
        }
      ]      
    }
  }
}

Batch — Multiple Records in One Request

When sending more than one accounting object in a single request, record becomes a JSON array where each element follows the same field structure as a single-record request. All records in a batch must belong to the same accountingType — if you need to send records for different types, use separate requests.

Batch — Multiple Records in One Request
POST /accounting-objects/v1?accountingType=COSTCENTRE
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 objects
        {
          "organization":    "main",
          "code":            "1001",
          "description_en":  "Sales",
          "start_date":      "2001-01-01",
          "end_date":        "2999-12-31"
        },
        {
          "organization":    "main",
          "code":            "1002",
          "description_en":  "Marketing",
          "start_date":      "2001-01-01",
          "end_date":        "2999-12-31"
        }
      ]
    }
  }
}

Validation

Your payload is validated before anything else happens. If validation fails, you get a 400 immediately with a specific error message — nothing is queued or forwarded. Fix the payload and retry.

What gets checked

Required fields presentorganization, code, and description_en must all be included. Locale description fields are optional; if absent, SoftCo uses description_en.
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.

Validation summary

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 caused by a validation failure. The response body always includes an error_message field that tells you exactly what went wrong. Below are the errors you're most likely to encounter and how to fix them.

400 Missing required field
A required field (organization, code, or description_en) is absent from the payload.
"error_message": "required key [code] not found"
Fix: Add the missing field to your record object and resend.
400 Invalid date format
start_date or end_date is present but not in YYYY-MM-DD format. Common causes include DD/MM/YYYY, MM-DD-YYYY, or including a time component.
"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. Common causes include sending the record fields at the top level, or using an array instead of an object for object when sending a single record.
"error_message": "object has missing required properties ([\"record\"])"
Fix: Ensure your payload follows the structure {"objects": {"object": {"record": { … }}}}. Check for missing braces or incorrect nesting.
400 Unknown field in payload
The payload contains a field name not defined in the schema — for example a typo, a camelCase variant, or a field name from a different endpoint (such as type or tax_code from the GL Codes API).
"error_message": "extraneous key [type] is not permitted"
Fix: Remove the unknown field. The Accounting Objects API only accepts: organization, code, description_en, description_en_US, description_fi_fi, description_sv_SE, start_date, end_date. All field names are snake_case and case-sensitive.

Record not appearing in SoftCo?

If you received a 202 Accepted or 207 Multi-Status but the accounting object has not appeared in SoftCo after several minutes, there is no need to take immediate action — the integration queue manages retries automatically. If it still hasn't appeared after a reasonable period, contact your SoftCo Customer Success representative with the approximate timestamp of your request and they can check the queue and delivery status on your behalf. Resending the record is also safe — SoftCo processes all master data as incremental updates, so the data will simply be refreshed.

Unsure of your accountingType values?

The valid accountingType identifiers for your organisation are configured in SoftCo during onboarding. If you are unsure which values to use, or if you need to confirm which accounting dimension types are active for your organisation, contact your SoftCo Customer Success representative.

Example Responses

The response structure is consistent across all outcomes. The HTTP status code and the status field together tell you exactly what happened.

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 in a batch passed and were queued; others failed validation. Check the errors array to identify which records need to be fixed and resubmitted.

207 Multi-Status — Partial Success
{
  "status":     "PARTIAL",
  "total":      2,
  "succeeded":  1,
  "failed":     1,
  "errors": [
    {
      "index":  2,
      "error":  "description_en is required."
    }
  ],
  "message":    "Your request was partially successful. Out of 2 items, 1 were processed successfully and 1 failed."
}

400 Bad Request — Invalid Request Structure

The request envelope is missing or malformed. No records were processed. The expected_format field describes the correct structure.

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. Expected format: objects → object → record (record must be a non-empty array of items).",
  "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 before reaching the integration layer.

401 Unauthorized
{
  "status":   "FAILED",
  "message": "Unauthorized — API key is missing or invalid"
}

What's Next

Accounting Objects are typically set up alongside GL Account Codes and Vendor Data as part of your master data foundation. Once all master data interfaces are in place, you're ready to start sending transactional data.

Master Data

Complete the remaining master data interfaces to give SoftCo the reference data it needs for AP coding, supplier management, and catalogue purchasing.

Transaction Data

Once your master data interfaces are in place, you're ready to start sending transactional data. These interfaces drive the day-to-day AP processing workflows in SoftCo.