Overview

The Vendor Data API lets your system push supplier and vendor master records to SoftCo's AP platform. Vendor data forms the cornerstone of accounts payable — every invoice processed in SoftCo is matched against a supplier record, and payment runs draw directly from the banking and payment details held here. Keeping your vendor master in sync ensures accurate invoice matching, clean payment processing, and an up-to-date supplier list for AP users.

A single call to POST /vendor-data/v1 creates or updates one or more vendor records. Vendor records carry a rich field set covering identity, contact information, address, bank account details, financial and payment settings, and procurement preferences. Each vendor can have multiple bank accounts, represented as an array within the record.

Organisation scope and the organization field

Like all SoftCo master data, vendor records are scoped to a company or legal entity using the organization field. Use "organization": "main" for vendors that are shared across the whole organisation. For vendors specific to a particular legal entity or operating company, supply that entity's organisation code. The behaviour is consistent across all master data interfaces.

When to call this endpoint

New vendor created in your ERP — push it immediately so AP users can start processing invoices against the supplier in SoftCo.
Vendor details updated — name, address, banking details, payment terms, or any other field changed; resend the record to keep SoftCo in sync.
Vendor bank account added or changed — send the full vendor record including the updated account array to refresh banking details in SoftCo.
Vendor deactivated — send a record with end_date set to today's date and status set to inactive to prevent further use in SoftCo AP.
Initial data load — send all active vendors during onboarding, either as a batch or as individual records, to establish the full supplier master in SoftCo.

Quick Start

Here's the fastest path to a successful integration. Copy this request, swap in your credentials and a real vendor from your ERP, then send it. The minimum required fields are organization, code, and name — everything else can be added incrementally.

Quick Start — Minimal POST
POST /vendor-data/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":         "SUP-00123",
        "name":         "Global Supplies Ltd"
        }
      ]
    }
  }
}

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 vendor 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 /vendor-data/v1 with your API key, credentials, and one or more vendor 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, 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. 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 supplier master 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 vendor record again is always safe. If a vendor 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 /vendor-data/v1

Submit one or more vendor records to SoftCo's AP platform. The payload is validated, transformed, and queued for delivery to the supplier master. Unlike other master data endpoints, POST /vendor-data/v1 requires no query parameters — the endpoint handles all vendor types.

POST /vendor-data/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 vendor 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 vendor. The outer objects → object envelope remains the same in both cases.

Vendor records also support a nested account array within each record. This array holds one or more bank account entries for the vendor — include one element per bank account. If the vendor has no banking details to send, omit the account field entirely.

Single record

{
"objects": {
"object": {
"record": [
{ // single element in the record array
"organization": "string", // required
"code": "string", // required
"name": "string", // required
"account": [ // optional — one element per bank account
{ "bank_name": "string", "bank_iban": "string", "..." }
],
"currency": "string", // recommended
"..." // see Field Reference for full list
}
]
}
}
}

Multiple records (batch)

{
"objects": {
"object": {
"record": [ // record becomes an array — each element is one vendor
{ "organization": "string", "code": "string", "name": "string", "account": ["..."], "..." },
{ "organization": "string", "code": "string", "name": "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.

Bank accounts and the account array

The account field is always an array, even when supplying a single bank account. To send one bank account, include a single-element array: "account": [{ "bank_name": "...", ... }]. To send multiple bank accounts for the same vendor, add one object per account. To omit banking details entirely, leave the account field out of the payload.

Field Reference

All fields sit inside objects.object.record. Bank account fields sit inside the nested account array within each record. The table below covers every field, grouped by function.

RequiredMust be present in every request.
RecommendedStrongly advised for complete supplier records and accurate AP processing.
OptionalCan be omitted. Include when the data exists in your ERP for the richest supplier profile.
FieldType / MaxStatusDescription & Guidance
Core Identity
organization string / 50 Recommended The short code identifying the company or legal entity this vendor belongs to.
main{org-code}
Use main for vendors available across the whole organisation. Supply a specific org code for vendors scoped to a legal entity. Values are case-sensitive.

Defaults to main if omitted.
code string / 128 Required The unique vendor identifier as it appears in your ERP. SoftCo uses this as the primary key to create and update supplier records. Numeric and alphanumeric codes are accepted.
Example: SUP-00123
name string / 255 Required The full legal or trading name of the vendor. This is the primary display name AP users see when searching for a supplier in SoftCo.
Example: Global Supplies Ltd
status string / 50 Recommended The active/inactive status of the vendor. Used by SoftCo to control whether the supplier is available for invoice processing and payment.
activeinactive
To deactivate a vendor, set status to inactive and end_date to today's date.
start_date string / YYYY-MM-DD Recommended The date from which this vendor 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 vendor expires and can no longer be used in SoftCo. Set to today's date to deactivate a vendor.
SoftCo default if omitted: 2999-12-31
vat_number string / 50 Optional The vendor's VAT registration number. Include where available — used for tax reporting and compliance in SoftCo AP.
edi_id string / 50 Optional The vendor's electronic data interchange (EDI) identifier, used for electronic invoicing where applicable.
Contact & Address
email string / 255 Optional The vendor's primary contact email address. Used in SoftCo for supplier communications and remittance notifications.
telephone_number string / 50 Optional The vendor's telephone number, including country and area code where applicable.
fax_number string / 50 Optional The vendor's fax number. Include where relevant to your AP process.
address_1 string / 255 Optional First line of the vendor's primary address (street address or building name).
address_2 string / 255 Optional Second address line (unit number, floor, building, or suite).
city string / 100 Optional City or town of the vendor's address.
postcode string / 20 Optional Postal or ZIP code of the vendor's address.
state string / 100 Optional State, province, or region of the vendor's address.
country string / 100 Optional Country of the vendor's address. Use ISO 3166-1 country names or codes consistent with your ERP configuration.
Bank Account Details — nested inside the account array
bank_name string / 255 Optional The name of the bank holding this account. Identifies the financial institution in SoftCo payment runs.
bank_account string / 50 Optional The vendor's bank account number. Supply alongside bank_sort_code for domestic accounts.
bank_sort_code string / 20 Optional The bank sort code or routing number. Used with bank_account for domestic bank transfers.
bank_iban string / 34 Optional The International Bank Account Number (IBAN). Use for international and SEPA payment processing.
bank_bic string / 11 Optional The Bank Identifier Code (BIC / SWIFT code). Required alongside bank_iban for international payments.
bank_currency string / 3 Optional The currency associated with this bank account, as an ISO 4217 three-letter code.
Example: EUR, GBP, USD
Financial & Payment Settings
currency string / 3 Recommended The vendor's default trading currency as an ISO 4217 three-letter code. SoftCo uses this as the default currency when processing invoices from this supplier.
Example: EUR, GBP, USD
payment_term string / 50 Recommended The payment terms agreed with this vendor, expressed as a code matching your ERP's payment term identifiers.
Example: NET30, NET60, IMMEDIATE
default_vat string / 50 Recommended The default VAT or tax code applied to invoices from this vendor in SoftCo. Should match the tax code identifiers configured in your SoftCo instance.
payment_method string / 50 Optional The preferred payment method for this vendor.
Example: BACS, SEPA, CHAPS, CHEQUE
Procurement Preferences
porequired string / 10 Optional Indicates whether a purchase order is required before invoices from this vendor can be approved in SoftCo.
YESNO
po_language string / 10 Optional The language code for purchase orders sent to this vendor.
Example: EN, FI, SV
order_confirmation string / 10 Optional Whether order confirmation is required from this vendor upon receipt of a purchase order.
YESNO
Custom Labels (label1 – label9)
label1 – label9 string / 255 each Optional Nine free-text classification fields available for your organisation's internal categorisation needs. Labels are flexible and can hold any string value — their meaning is defined by your SoftCo configuration and ERP mapping. Common uses include internal reporting categories, regional groupings, or custom supplier tiers.
Include only the label fields you need — unused labels can be omitted entirely. Each label maps to a separate field: label1, label2, ... label9.

Example Request

The examples below cover the most common scenarios. Replace the field values with real data from your ERP.

Full Example — All Field Groups

Full Example — All Field Groups
POST /vendor-data/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": [
        {      
        // Core Identity
        "organization":      "main",
        "code":              "SUP-00123",
        "name":              "Global Supplies Ltd",
        "status":            "active",
        "start_date":        "2020-01-01",
        "end_date":          "2999-12-31",
        "vat_number":        "GB123456789",
        "edi_id":            "EDI-GSL-001",
        // Contact & Address
        "email":             "accounts@globalsupplies.com",
        "telephone_number":  "+44 20 7946 0958",
        "address_1":         "14 Commerce Street",
        "address_2":         "Floor 3",
        "city":              "London",
        "postcode":          "EC2A 1AB",
        "country":           "United Kingdom",
        // Bank Account Details
        "account": [
          {
            "bank_name":     "Barclays Bank",
            "bank_account":  "12345678",
            "bank_sort_code":"20-00-00",
            "bank_iban":     "GB29BARC20000012345678",
            "bank_bic":      "BARCGB22",
            "bank_currency": "GBP"
          }
        ],
        // Financial & Payment Settings
        "currency":          "GBP",
        "payment_term":      "NET30",
        "default_vat":       "S20",
        "payment_method":    "BACS",
        // Procurement Preferences
        "porequired":        "YES",
        "po_language":       "EN",
        "order_confirmation":"NO"
        }
      ]
    }
  }
}

Minimum Required Fields

Only the three required fields. All other details can be added in a subsequent update call.

Minimum Required Fields
{
  "objects": {
    "object": {
      "record": [
        {      
        "organization": "main",
        "code":         "SUP-00124",
        "name":         "Acme Corp"
        }
      ]
    }
  }
}

Vendor with Multiple Bank Accounts

When a vendor has more than one bank account — for example, a GBP domestic account and a EUR international account — include one object per account in the account array.

Multiple Bank Accounts
{
  "objects": {
    "object": {
      "record": [
        {      
        "organization": "main",
        "code":         "SUP-00125",
        "name":         "European Logistics GmbH",
        "currency":     "EUR",
        "account": [
          {
            // Primary EUR account
            "bank_name":     "Deutsche Bank",
            "bank_iban":     "DE89370400440532013000",
            "bank_bic":      "DEUTDEDB",
            "bank_currency": "EUR"
          },
          {
            // Secondary GBP account
            "bank_name":     "Barclays Bank",
            "bank_account":  "87654321",
            "bank_sort_code":"20-00-00",
            "bank_iban":     "GB29BARC20000087654321",
            "bank_bic":      "BARCGB22",
            "bank_currency": "GBP"
          }
        ]
        }
      ]
    }
  }
}

Batch — Multiple Vendors in One Request

When sending more than one vendor 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.

Batch — Multiple Vendors in One Request
POST /vendor-data/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 vendors
        {
          "organization": "main",
          "code":         "SUP-00123",
          "name":         "Global Supplies Ltd",
          "currency":     "GBP",
          "payment_term": "NET30",
          "start_date":   "2020-01-01",
          "end_date":     "2999-12-31",
          "account": [{
            "bank_name":     "Barclays Bank",
            "bank_iban":     "GB29BARC20000012345678",
            "bank_bic":      "BARCGB22",
            "bank_currency": "GBP"
          }]
        },
        {
          "organization": "main",
          "code":         "SUP-00124",
          "name":         "Acme Corp",
          "currency":     "USD",
          "payment_term": "NET60",
          "start_date":   "2021-06-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 name must all be included in every record.
Field types — all values must be strings. Numeric codes and dates must be provided as string values, not numbers.
Payload structure — the objects.object.record envelope must be present and correctly nested.
Account array structure — if account is present, it must be an array of objects. An empty array [] is valid; a non-array value is not.
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 name) is absent from the payload.
"error_message": "required key [name] not found"
Fix: Add the missing field to your record object and resend. All three of organization, code, and name must be present in every vendor record.
400 account field is not an array
The account field was supplied as a plain object rather than an array. Even when sending a single bank account, the value must be wrapped in an array.
"error_message": "instance type (object) does not match any allowed primitive type (array)"
Fix: Wrap the bank account object in an array: "account": [{ "bank_name": "...", ... }] instead of "account": { "bank_name": "...", ... }.
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 fields at the top level, or omitting one of the wrapper objects.
"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 (bankName instead of bank_name), or a field from a different endpoint.
"error_message": "extraneous key [bankName] is not permitted"
Fix: All field names are snake_case and case-sensitive. Check your payload against the Field Reference and remove or correct any unrecognised fields.

Vendor not appearing in SoftCo?

If you received a 202 Accepted but the vendor 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": "name 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

Vendor Data is the third of four master data interfaces. Once all master data is in place, you're ready to start sending transactional data.

Master Data

Complete the remaining master data interface to give SoftCo the full reference data set it needs for AP processing.

Transaction Data

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