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

New account created in your ERP — push it immediately so AP users can start coding against it in SoftCo.
Account updated — description, tax code, validity dates, or product group changed; resend the record to keep SoftCo in sync.
Account deactivated — send a record with end_date set to today's date to prevent further coding against it.
Initial data load — send all active GL accounts during onboarding, either as a single 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, and send it.

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

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 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.

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 /general-ledger-codes/v1 with your API key and credentials in the headers.
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 format and placed on the integration 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 the record
The queue listener picks up the record and delivers it to 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 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

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 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.

POST /general-ledger-codes/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 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

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

Multiple records (batch)

{
"objects": {
"object": {
"record": [ // record becomes an array — each element is one GL account
{ "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 table below covers every field, its type, whether it's required, valid values, 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 AP coding behaviour.
FieldType / MaxStatusDescription & 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: NO
If 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 group
Example: 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.

Full Example — All Fields
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.

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

With Locale Descriptions
{
  "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.

Batch — Two Records in One Request
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

Required fields presentorganization, code, type, 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, type, 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 type value
The type field contains a value other than DEDUCTABLE or VAT. Common causes include using STANDARD, EXPENSE, or a lowercase variant.
"error_message": "instance value (\"STANDARD\") not found in enum (possible values: [\"DEDUCTABLE\",\"VAT\"])"
Fix: Use exactly DEDUCTABLE for standard GL accounts or VAT for tax control accounts. Values are case-sensitive.
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.
"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 that is not defined in the schema — for example a typo, a camelCase variant of a field name, or a field from a different API endpoint.
"error_message": "extraneous key [glCode] is not permitted"
Fix: Remove the unknown field and use only field names listed in the Field Reference. All field names are snake_case and case-sensitive.

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.

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 before reaching the integration layer.

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