Payment Confirmation
Overview
The Payment Confirmation API closes the payment loop between your ERP and SoftCo. When your accounts payable team processes a payment run in your ERP, the invoices are settled on your side — but SoftCo still shows them as outstanding until it receives confirmation. Sending a confirmation record to this endpoint updates the matching invoice in SoftCo to reflect its paid status, keeping both systems in sync and preventing duplicate payment processing.
A single call to POST /payment-confirmation/v1 confirms one or more invoice payments. Each record provides SoftCo's internal case ID for the invoice, your ERP's voucher number, the payment reference from your payment run, and the date the payment was processed. SoftCo matches on softco_case_id and updates the invoice record accordingly.
How payment confirmation fits into the AP cycle
SoftCo raises and processes invoices on the AP side. When your ERP is used for payment execution — rather than SoftCo's own payment module — SoftCo needs to be told about each payment after the fact. This API is that notification channel. It is not a payment instruction: it is a confirmation that payment has already been made.
All other SoftCo iPaaS APIs push data into SoftCo (master data, purchase orders). Payment Confirmation is similar in that your ERP sends data to SoftCo — but it is specifically a status update, telling SoftCo that an invoice it already holds has been paid externally. SoftCo will match the softco_case_id to an existing invoice and mark it settled.
When to call this endpoint
Quick Start
Here's the fastest path to a successful integration. Copy this request, swap in your credentials and a real invoice reference, then send it. All four fields are required — softco_case_id, voucher_number, payment_number, and payment_date.
POST /payment-confirmation/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": [ { "softco_case_id": "10045123", "voucher_number": "PAY-20240315-001", "payment_number": "5832", "payment_date": "2024-03-15" } ] } } }
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 confirmation has been validated and queued. The integration layer picks it up and delivers it to SoftCo AP, where the matching invoice is updated to paid status. If the invoice does not update within a few minutes, see the Troubleshooting section.
How It Works
Every request follows the same pipeline. Your system only needs to send once — validation, transformation, and delivery to SoftCo are handled automatically.
Layer
Queue
AP
POST /payment-confirmation/v1 with your credentials and one or more payment confirmation records in the request body.401 Unauthorized before your payload is processed.400 Bad Request with a field-level error message. Nothing is queued 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.softco_case_id and updates the invoice record to reflect its settled status. If SoftCo is temporarily unavailable, the queue holds the record and retries automatically.202 Accepted does not mean the invoice has been updated in SoftCo yet — it means your confirmation has been received, validated, 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 delivered. The invoice update is asynchronous and typically completes within minutes. Resending a confirmation is always safe; SoftCo will simply refresh the payment record. If an invoice remains outstanding after a reasonable period, contact your SoftCo Customer Success representative.
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
| 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 confirmations 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. |
| 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. | 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. |
| 429 | Too Many Requests | Rate limit exceeded. | Slow your request rate and retry after the delay indicated. |
| 500 | Internal Server Error | Unexpected error on our side. | Retry once. If it persists, raise a ticket with the requestId. |
| 503 | Service Unavailable | Service temporarily unavailable. | Retry after a short delay. |
POST /payment-confirmation/v1
Submit one or more payment confirmation records to SoftCo. Each record matches an invoice by its softco_case_id and updates it to reflect the payment made in your ERP. The payload is validated and queued for delivery to SoftCo.
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
The request body uses the same objects → object → record envelope as all SoftCo iPaaS APIs. For a single payment confirmation, record is a JSON object. For multiple confirmations in one request, record is a JSON array of objects.
Single record
Batch (multiple confirmations)
Use a plain JSON object for a single confirmation. Use a JSON array for multiple confirmations. The object field is always a plain object — it is only record that changes between single and batch mode. The structure is consistent with all other SoftCo iPaaS APIs.
Field Reference
The Payment Confirmation API has a compact field set — exactly four fields, all required. All four values are passed directly to SoftCo without transformation — what you send is exactly what SoftCo receives.
| Field | Type | Required | Description |
|---|---|---|---|
| softco_case_id | string | Required |
SoftCo's internal identifier for the invoice being confirmed as paid. This is the case reference assigned when the invoice was raised in SoftCo AP — it is the primary key SoftCo uses to locate and update the invoice record.
e.g. "10045123"
|
| voucher_number | string | Required |
Your ERP's payment document or voucher number for this payment. This is the posting reference generated by your ERP when the payment was processed — used for reconciliation and audit trail purposes.
e.g. "PAY-20240315-001"
|
| payment_number | string | Required |
The unique payment transaction reference from your ERP — the identifier your system assigns to the individual payment transaction for this invoice. In NetSuite this is typically the tranId from the Vendor Payment record; in other ERPs it may be called the payment document number, payment ID, or transaction reference. Each invoice payment will have its own distinct value.
e.g. "5832"
|
| payment_date | string | Required |
The date the payment was processed by your ERP or bank. Must be in ISO 8601 format.
YYYY-MM-DDe.g. "2024-03-15"
|
All four field values are passed through to SoftCo exactly as you supply them. There are no computed, derived, or reformatted fields — your ERP references appear in SoftCo exactly as sent, making reconciliation straightforward.
Example Requests
Single payment confirmation
POST /payment-confirmation/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": [ { "softco_case_id": "10045123", "voucher_number": "PAY-20240315-001", "payment_number": "5832", "payment_date": "2024-03-15" } ] } } }
Batch — multiple confirmations in one request
POST /payment-confirmation/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": [ { "softco_case_id": "10045123", "voucher_number": "PAY-20240315-001", "payment_number": "5832", "payment_date": "2024-03-15" }, { "softco_case_id": "10045124", "voucher_number": "PAY-20240315-002", "payment_number": "5833", "payment_date": "2024-03-15" }, { "softco_case_id": "10044891", "voucher_number": "PAY-20240315-003", "payment_number": "5834", "payment_date": "2024-03-15" } ] } } }
Validation
Every request is validated before any processing takes place. If validation fails, the request is rejected immediately and nothing is queued or forwarded to SoftCo — you receive a clear error identifying the problem field.
What is checked
| Check | Detail |
|---|---|
| Required fields | All four fields — softco_case_id, voucher_number, payment_number, payment_date — must be present in every record. |
| Field types | All fields must be strings. Sending a number or null for any field will fail validation. |
| Non-empty values | Fields must not be empty strings. A record with "softco_case_id": "" will be rejected. |
| Envelope structure | The objects → object → record wrapper must be present. A flat JSON object at the root will be rejected. |
Validation error response
When validation fails, the API returns a 400 Bad Request with a JSON body identifying the failing field:
{ "status": "FAILED", "total": 0, "succeeded": 0, "failed": 0, "errors": [ { "index": 0, "error": "required key [payment_date] not found" } ], "message": "No items could be processed as the request structure was invalid." }
The errors array identifies the exact field that failed. Fix the identified field and resubmit.
Troubleshooting
The four common error scenarios and how to resolve them.
error_message will name the missing field, e.g. required key [voucher_number] not found.softco_case_id, voucher_number, payment_number, and payment_date. None can be omitted or null.payment_date field must be a string in YYYY-MM-DD format. Common mistakes include using DD/MM/YYYY, sending a timestamp, or passing a date object instead of a string.YYYY-MM-DD.objects → object → record wrapper — for example, sending the record fields at the root level of the JSON body.objects.object.record envelope. This structure is required on all SoftCo iPaaS endpoints.softco_case_id for an invoice, hold the confirmation until the case ID is available.If you resend a confirmation for an invoice that SoftCo has already marked as paid, the record is processed again without error — payment confirmations are idempotent. The invoice status will be refreshed with the values in the new request.
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": "required key [payment_date] not found" } ], "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
Payment Confirmation completes the transactional feedback loop. The remaining transaction data APIs cover the purchase-to-pay cycle on the inbound side.