Accounting Objects
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.
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
end_date set to today's date to prevent further coding against it.
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.
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:
{ "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 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.
Layer
Queue
AP
POST /accounting-objects/v1?accountingType={type} with your API key, credentials, and the accounting type in the query string.401 Unauthorized before your payload is processed.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.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 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
These response codes apply to all endpoints. Build your error handling around them from the start.
| 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 | 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.
Query Parameter
| Parameter | Type | Status | Description |
|---|---|---|---|
| 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
| 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 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
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 table below covers every field, its type, whether it's required, SoftCo defaults where applicable, and practical mapping guidance.
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 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
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.
{ "objects": { "object": { "record": [ { "organization": "main", "code": "1006", "description_en": "Finance" } ] } } }
With Locale Descriptions
Include locale fields only for the locales your organisation actively uses.
{ "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.
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
organization, code, and description_en must all be included. Locale description fields are optional; if absent, SoftCo uses description_en.
objects.object.record envelope must be present and correctly nested.
start_date and end_date, if provided, must follow YYYY-MM-DD.
Validation summary
| 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 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.
organization, code, or description_en) is absent from the payload.record object and resend.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.YYYY-MM-DD, e.g. 2026-01-01. Remove any time or timezone component.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.{"objects": {"object": {"record": { … }}}}. Check for missing braces or incorrect nesting.type or tax_code from the GL Codes API).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.
{ "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.
{ "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.
{ "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.
{ "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.