General Ledger Account Codes
Overview
The General Ledger Account Codes API lets your system push GL account master data to SoftCo's AP platform on demand. SoftCo uses this data to populate the GL account list that AP users see when coding invoices — so keeping it current in SoftCo means fewer manual lookups and fewer coding errors.
You control when data is sent. There's no scheduled sync to configure — call this endpoint whenever an account is created, updated, or needs to be deactivated in SoftCo.
When to call this endpoint
end_date set to today's date to prevent further coding against it.
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, and send it.
POST /general-ledger-codes/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": "52111", "type": "DEDUCTABLE", "description_en": "Office Supplies" } ] } } }
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 GL account in SoftCo within a few minutes, see the Troubleshooting section.
How It Works
Every request follows the same pipeline. The integration is designed so that your system only needs to send once — resilience, retries, and delivery to SoftCo are handled automatically.
Layer
Queue
AP
POST /general-ledger-codes/v1 with your API key and credentials in the headers.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 a GL account 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 | 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. 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 /general-ledger-codes/v1
Submit one or more GL account records to SoftCo's AP platform. The payload is validated, transformed, 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 GL account 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 GL account. 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, valid values, 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 GL account belongs to.
main{org-code}
Single organisation: use
main for all records.Multiple organisations: specify the correct org code per record — values must match the organisation codes configured in SoftCo. Values are case-sensitive. Defaults to main if omitted.
|
| code | string / 128 | Required |
The unique identifier for this GL account or expenditure code as it appears in your chart of accounts. SoftCo uses this as the primary key to create and update accounts. Numeric and alphanumeric codes are both accepted.
Example:
52111 |
| type | string / 50 | Required |
Determines the GL account type and controls how SoftCo handles it during invoice processing and tax posting.
DEDUCTABLEVAT
DEDUCTABLE — use for all standard expense and cost accounts. This applies to the large majority of GL codes.
VAT — use only for GL accounts designated as Tax or VAT control accounts. |
| description_en | string / 4000 | Required |
The GL account name or description in English. This is the primary label AP users see when selecting a GL code during invoice coding in SoftCo. It is also used as the fallback for any locale description field not supplied.
Example:
Office Supplies |
| description_en_US | string / 4000 | Optional |
GL account 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 |
GL account 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 |
GL account 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 |
| tax_code | string / 256 | Recommended |
The default tax code to associate with this GL account. When set, SoftCo automatically applies it whenever an AP user selects this account during Non-PO invoice coding or when creating a requisition from a GL-based catalogue product — reducing manual entry and improving accuracy.
Example:
I0. Valid values match your organisation's tax code master data in SoftCo. |
| catalog_product | string | Recommended |
Controls whether this GL account is published as a product in SoftCo's eRequisition (eREQ) catalogue. Required if your organisation uses the SoftCo Procurement module or GL Flip feature.
YESNO
SoftCo default if omitted:
NOIf you are not using these modules or are unsure, use
NO. |
| product_group | string / 128 | Recommended |
Assigns this GL account to a product group in the SoftCo eREQ catalogue. Required when catalog_product is YES. Must match an existing product group in your SoftCo product group master data.
SoftCo default if omitted or blank:
DEFAULT product groupExample:
MARKETING |
| start_date | string / YYYY-MM-DD | Recommended |
The date from which this GL account is valid and available for AP coding in SoftCo. Always include this when sending incremental updates — omitting it on an update may affect the account's validity window.
SoftCo default if omitted:
2001-01-01 (effectively, valid from the start)For an initial full load where accounts are all 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 GL account expires and can no longer be used for AP coding in SoftCo. Always include this for incremental updates. To deactivate an account, set this to today's date.
SoftCo default if omitted:
2999-12-31 (effectively, no expiry)For accounts with no planned expiry, you may rely on the default.
|
Example Request
A complete request with all fields. Replace credentials and field values with your own data.
POST /general-ledger-codes/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": "52111", "type": "DEDUCTABLE", "description_en": "Office Supplies", "description_en_US": "Office Supplies", "description_fi_FI": "Toimistotarvikkeet", "description_sv_SE": "Kontorsmaterial", "tax_code": "I0", "catalog_product": "YES", "product_group": "MARKETING", "start_date": "2001-01-01", "end_date": "2999-12-31" } ] } } }
Minimum Required Fields
Only the four required fields. Locale descriptions and recommended fields can be added incrementally.
{ "objects": { "object": { "record": [ { "organization": "main", "code": "72315", "type": "DEDUCTABLE", "description_en": "Telephone" } ] } } }
With Locale Descriptions
Include locale fields only for the locales your organisation actively uses.
{ "objects": { "object": { "record": [ { "organization": "main", "code": "72315", "type": "DEDUCTABLE", "description_en": "Telephone", "description_fi_FI": "Puhelin", // Finnish locale in use "description_sv_SE": "Telefon" // Swedish locale in use } ] } } }
Batch — Multiple Records in One Request
When sending more than one GL account in a single request, record becomes a JSON array where each element follows the same field structure as a single-record request. The outer objects → object envelope stays exactly the same. This is particularly useful for initial data loads or synchronising a set of related accounts at once.
POST /general-ledger-codes/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 accounts { "organization": "main", "code": "52111", "type": "DEDUCTABLE", "description_en": "Office Supplies", "tax_code": "I0", "catalog_product": "YES", "product_group": "MARKETING", "start_date": "2001-01-01", "end_date": "2999-12-31" }, { "organization": "main", "code": "56120", "type": "DEDUCTABLE", "description_en": "Travel & Accommodation", "tax_code": "I0", "catalog_product": "YES", "product_group": "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, type, 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, type, or description_en) is absent from the payload.record object and resend.type value
type field contains a value other than DEDUCTABLE or VAT. Common causes include using STANDARD, EXPENSE, or a lowercase variant.DEDUCTABLE for standard GL accounts or VAT for tax control accounts. Values are case-sensitive.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.{"objects": {"object": {"record": { … }}}}. Check for missing braces or incorrect nesting.Record not appearing in SoftCo?
If you received a 202 Accepted but the GL account 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.
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 before reaching the integration layer.
{ "status": "FAILED", "message": "Unauthorized — API key is missing or invalid" }
What's Next
GL Codes are typically one of several master data types you'll need to sync before go-live. Once GL Codes are in place, most integrations continue with vendor data and accounting objects.
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.