Vendor Data
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
account array to refresh banking details in SoftCo.
end_date set to today's date and status set to inactive to prevent further use in SoftCo AP.
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.
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:
{ "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 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.
Layer
Queue
AP
POST /vendor-data/v1 with your API key, credentials, and one or more vendor records in the body.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 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 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 /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.
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 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
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.
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.
| Field | Type / Max | Status | Description & 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 | |||
| 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
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.
{ "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.
{ "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.
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
organization, code, and name must all be included in every record.
objects.object.record envelope must be present and correctly nested.
account is present, it must be an array of objects. An empty array [] is valid; a non-array value is not.
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 name) is absent from the payload.record object and resend. All three of organization, code, and name must be present in every vendor record.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."account": [{ "bank_name": "...", ... }] instead of "account": { "bank_name": "...", ... }.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 fields at the top level, or omitting one of the wrapper objects.{"objects": {"object": {"record": { … }}}}. Check for missing braces or incorrect nesting.bankName instead of bank_name), or a field from a different endpoint.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.
{ "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": "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.
{ "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
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.