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.

Direction of flow

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

After every payment run — once your ERP has posted the payment and assigned a voucher number, send confirmation records for all invoices included in that run.
Near real-time or batch — you can send individual confirmations as payments are posted, or batch multiple confirmations together in a single request. Both patterns are supported.
Resending is safe — SoftCo processes payment confirmations as updates. If you resend a confirmation for an invoice already marked as paid, the record is refreshed without error.

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.

Quick Start — 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"
        }
      ]
    }
  }
}

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

Your ERP
HTTP POST
JSON
API Gateway
Auth & Routing
Validated
Integration
Layer
Validate & Transform
XML
Integration
Queue
Async Buffer
Delivered
SoftCo
AP
Invoice Updated
1
Your ERP sends the POST request
After processing a payment run, your ERP sends a JSON payload to POST /payment-confirmation/v1 with your credentials and one or more payment confirmation records in the request body.
2
Gateway checks your credentials
Your API key is validated immediately by the API Gateway. 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 the payment confirmation schema — all four required fields must be present and correctly formed. If anything fails, you get a 400 Bad Request with a field-level error message. Nothing is queued until validation passes.
4
Data is transformed and queued — you get 202
On success, the confirmation is processed 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 marks the invoice as paid
The queue listener delivers the confirmation to SoftCo AP, which matches on 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.
About the 202 Response

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

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

CodeStatusMeaningWhat to do
202AcceptedAll 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.
207Multi-StatusPartial 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.
400Bad RequestPayload failed schema validation. A field-level error is in the response body.Read the error_message field, fix the payload, retry. See Troubleshooting.
401UnauthorizedAPI key missing or invalid.Check your x-api-key header value.
403ForbiddenValid API key but no permission for this endpoint.Contact your SoftCo Customer Success representative.
404Not FoundEndpoint path is incorrect.Verify the URL — check for typos or trailing slashes.
408Request TimeoutRequest took too long to process.Retry once after a short delay.
429Too Many RequestsRate limit exceeded.Slow your request rate and retry after the delay indicated.
500Internal Server ErrorUnexpected error on our side.Retry once. If it persists, raise a ticket with the requestId.
503Service UnavailableService 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.

POST /payment-confirmation/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

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

"objects" // root wrapper
"object" // container — always a plain object, not an array
"record" // JSON array with one element for a single confirmation
"softco_case_id": "string" // required
"voucher_number": "string" // required
"payment_number": "string" // required
"payment_date": "string" // required — YYYY-MM-DD

Batch (multiple confirmations)

"objects"
"object"
"record" // JSON array for a batch
[ { "softco_case_id": "...", "voucher_number": "...", "payment_number": "...", "payment_date": "..." },
{ "softco_case_id": "...", "voucher_number": "...", "payment_number": "...", "payment_date": "..." } ]
Record vs array

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"
No transformation required

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

Single 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

Batch 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"
        },
        {
          "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

CheckDetail
Required fieldsAll four fields — softco_case_id, voucher_number, payment_number, payment_date — must be present in every record.
Field typesAll fields must be strings. Sending a number or null for any field will fail validation.
Non-empty valuesFields must not be empty strings. A record with "softco_case_id": "" will be rejected.
Envelope structureThe 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:

400 Bad Request — validation failure
{
  "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.

400
Missing required field
One or more of the four required fields is absent from the record. The error_message will name the missing field, e.g. required key [voucher_number] not found.
{ "status": "FAILED", "total": 0, "succeeded": 0, "failed": 0, "errors": [{"index": 0, "error": "required key [voucher_number] not found"}], "message": "No items could be processed as the request structure was invalid." }
Fix: Ensure all four fields are present in every record — softco_case_id, voucher_number, payment_number, and payment_date. None can be omitted or null.
400
Invalid payment_date format
The 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.
// Wrong — will fail "payment_date": "15/03/2024" "payment_date": "2024-03-15T00:00:00Z" "payment_date": 20240315 // Correct "payment_date": "2024-03-15"
Fix: Format the date as a plain string in ISO 8601 date format: YYYY-MM-DD.
400
Wrong envelope structure
The payload was sent without the objects → object → record wrapper — for example, sending the record fields at the root level of the JSON body.
// Wrong — will fail { "softco_case_id": "10045123", "voucher_number": "PAY-20240315-001", "payment_number": "5832", "payment_date": "2024-03-15" } // Correct { "objects": { "object": { "record": { "softco_case_id": "10045123", ... } } } }
Fix: Wrap your record fields inside the objects.object.record envelope. This structure is required on all SoftCo iPaaS endpoints.
400
Empty field value
A required field is present in the payload but contains an empty string or null value. The schema validator treats empty strings as invalid for required fields.
// Wrong — empty softco_case_id "softco_case_id": "" "softco_case_id": null
Fix: Ensure all four fields contain non-empty string values. If your ERP does not yet have a softco_case_id for an invoice, hold the confirmation until the case ID is available.
Invoice already shows as paid?

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.

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

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"
}