Implementation Guide

Prev Next

Welcome to the uPortal360 API!

The purpose of this document is to provide a guide for developers that
are integrating 3rd party applications with the uPortal360 API. While
many topics are covered, some details have been abbreviated or omitted
for brevity. If you require assistance with a scenario that is not
listed, please reach out to the UGA Finance Technical team for support
at: [email protected].

Support

During development, you may always reach out to the UGA Finance
development team for support at: [email protected]

When requesting support, we recommend you send the following when
debugging specific endpoints:

Make sure to remove any sensitive information when sending data!

  1. The endpoint you’re connecting to.

  2. The request headers

  3. The request body

    • Any sensitive data should be removed.
  4. The response body

API - General Usage

API Base URLs

Environment URL
Sandbox https://test-api.uportal360.com/
Production https://api.uportal360.com/

Your credentials will be different for each environment. Don’t expect
your sandbox credentials to also work in the production environment!

Requirements

In order to use the uPortal360 API, you must have the following:

  • OAuth 2.0 Protocol
  • TLS 1.2
  • User-Agent Header

OAuth 2.0 Protocol

Our authorization process uses OAuth 2.0. See the authorization section
for more details.

What is OAuth
https://en.wikipedia.org/wiki/OAuth

TLS 1.2 Requirement

For security and compliance, we require that TLS 1.2 or greater be used.
It’s likely the technology you use supports this without any extra work,
however, in the off-chance that it doesn’t, connection errors will
differ based on the platform and libraries you’re using. In general, the
error message will reference SSL/TLS explicitly, or make reference to a
"handshake" error, or an "error when establishing secure
communication.".

What is TLS 1.2
https://en.wikipedia.org/wiki/Transport_Layer_Security

User-Agent Header

All HTTP requests must include a User-Agent header. The value of the User-Agent header is up to your discretion – we recommend following convention and identifying your application product name and optionally, your product version. Only the existence of the header is required by our firewall.

Requests made without this header will receive an “Error 1010: The owner of this website has banned your access based on your browser’s signature”.
https://support.cloudflare.com/hc/en-us/articles/360029779472-Troubleshooting-Cloudflare-1XXX-errors#error1010

What is the User-Agent Header
https://en.wikipedia.org/wiki/User_agent

Format

The uPortal360 API supports only JSON in the request and response
bodies, with authorization being the only exception. Other common
formats, including XML, HTML, YAML, and TXT, are not supported.

As a result, all requests that include a request body must include the
following header:

Content-Type: application/json

Additionally, it is considered best practice to include the following
header on all HTTP requests that will include a response body:

Accept: application/json

JSON Definition
https://en.wikipedia.org/wiki/JSON

Authorization

The uPortal360 API requires that requests are authenticated with a
Bearer token via OAuth 2.0. Please see the following sections for
instructions on authentication.

Obtaining Credentials

Production Credentials - To receive production OAuth2 credentials, your
company must work with our sales team to structure a program, and you
will have to pass a code review with one of our integration specialists.
For technical support, please contact us at:
[email protected]

Sandbox Credentials - The Sandbox test credentials are shared across all credit application programs in our test environment and are reset daily. You can find the credentials in the request section below.

grant_type=password&
client_id=demo&
client_secret=c2b9e154-4d1e-47fb-9cb2-c6839d389dd5&
username=demo-user&
password=test-api-2025

Retrieve Access Token

Using your credentials, request an access token for use with the API. To
do this, make a POST request to the authorization server with
credentials passed as form-data.

Request

POST /realms/uportal360-api-dev/protocol/openid-connect/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: auth.uportal360.com

For Testing use:
grant_type=password&
client_id=demo&
client_secret=c2b9e154-4d1e-47fb-9cb2-c6839d389dd5&
username=demo-user&
password=test-api-2025

Response

HTTP/1.1 200 OK
Server: openresty/1.15.8.2
Content-Type: application/json
Content-Length: 2378
Vary: Accept-Encoding

{
    "access_token": "nZRrtD1WXAu5rgTb...",
    "expires_in": 300,
    "refresh_expires_in": 1800,
    "refresh_token": "...",
    "token_type": "bearer",
    "not-before-policy": 0,
    "session_state": "...",
    "scope": "profile email"
}

The most important piece of this response object is the access_token.
Use this as a Bearer Token authorization header for subsequent API
requests.

The expires_in value equals the number of seconds the access_token
will remain valid for.

Using the Access Token

To use the obtained access token with the API, send the access token in
an Authorization header with your request.

Authorization: Bearer <token>

Sample Request (Valid Token)

Requesting an endpoint with a valid access token will permit usage and
evaluate the request.

Request

POST /applications HTTP/1.1
Authorization: Bearer nZRrtD1WXAu5rgTb...
Content-Type: application/json
Accept: application/json
Host: test-api.uportal360.com

Response

HTTP/1.1 200 OK
Content-Type: application/json
...

Sample Request (Expired Token)

If you attempt to use the access token after it has expired, the API
will return HTTP 401 Unauthorized. In this case, you must obtain a new
token; this can be done by requesting a new token.

Request

POST /applications HTTP/1.1
Authorization: Bearer nZRrtD1WXAu5rgTb...

Response

HTTP/1.1 401 Unauthorized
...

Reference

This is the reference to available endpoints. All endpoints may be called
in either the Staging or Production environment.

Test Data

The following mock information may be used to test desired outcomes in
both the Staging and Production environments.

Applications

The /v1/applications endpoint is the entrypoint to the application
process, and may only be used to create (POST) and update (PATCH)
applications. Once an application has been decisioned, the application
may no longer be updated.

POST

Use the POST request to create a new application.

Request
Accepts an ApplicationRequest

POST /v1/applications HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
  "clientId" : "1A2B3C",
  "location" : "T9679DF",
  "program" : "DMFP2",
  "status" : "DRAFT",
  "contract" : {
    "cashPrice" : 5000,
    "downPayment" : 200,
    "description" : "Demo financing for test product"
  },
  "applicant" : {
    "firstName" : "Marisol",
    "middleInitial" : "L",
    "lastName" : "Testcase",
    "email" : "[email protected]",
    "ssn" : "0001",
    "dob" : "1988-07-23",
    "primaryNumber" : "+11115551111",
    "primaryNumberType" : "HOME",
    "secondaryNumber" : "+12225552222",
    "secondaryNumberType" : "MOBILE",
    "annualIncome" : 50000,
    "residenceMonthlyExpense" : 1000,
    "residenceType" : "RENT",
    "employmentType" : "RETIRED",
    "address" : {
      "line1" : "603 East St.",
      "line2" : "STE 301",
      "city" : "Parkville",
      "state" : "MO",
      "zip" : "64152"
    }
  },
  "coApplicant" : {
    "firstName" : "David",
    "middleInitial" : "C",
    "lastName" : "Testcase",
    "email" : "[email protected]",
    "ssn" : "0002",
    "dob" : "1984-05-19",
    "primaryNumber" : "+13335553333",
    "primaryNumberType" : "HOME",
    "secondaryNumber" : "+14445554444",
    "secondaryNumberType" : "MOBILE",
    "annualIncome" : 50000,
    "residenceMonthlyExpense" : 1000,
    "residenceType" : "RENT",
    "employmentType" : "RETIRED",
    "address" : {
      "line1" : "603 East St.",
      "line2" : "STE 301",
      "city" : "Parkville",
      "state" : "MO",
      "zip" : "64152"
    }
  }
}

The apply field in the response should be used to send the consumer to
the uPortal360 Apply application to finish the credit application
process.

Response - when request status is DRAFT
Returns a DraftResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
  "data" : {
    "id" : "demo-id-here",
    "edit" : {
      "href" : "https://test-api.uportal360.com/v1/applications/demo-id-here",
      "method" : "PATCH"
    },
    "self" : {
      "href" : "https://test-api.uportal360.com/v1/applications/demo-id-here",
      "method" : "GET"
    },
    "applyUrl" : "https://test-apply.uportal360.com/?id=demo-id-here",
    "status": "DRAFT"
  }
}

Response - when request status is PROCESS
Possible return types:

Example SuccessResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "id": "demo-id-here",
        "self": {
            "href": "https://test-api.uportal360.com/v1/applications/demo-id-here",
            "method": "GET"
        },
        "status": "APPROVED",
        "creditLine": 1301.0,
        "interestRate": 17.99,
        "applyUrl": "https://test-apply.uportal360.com/?id=demo-id-here",
        "uportal360Url": "https://staging.uportal360.com/navigation/demo-id-here"
    }
}
No-Hit Scenario

If a matching credit report was unable to be found while processing the application, a StandardResponse with a status of NO_HIT will be returned. When this happens, the application may be updated with corrected applicant information and re-processed.

Consecutive No-Hit responses will result in the application being immediately declined.

Duplicate Contract Scenario

Duplicate Contract Overview

Our system doesn't allow Duplicate contracts. To get more information on the duplicate contract use the contract: id returned in the response, and follow this link Contract GET endpoint.

Example Duplicate Contract Response

HTTP/1.1 409 Conflict
Content-Type: application/json

{
    "data": {
        "contract": {
            "applicantEmail": "[email protected]",
            "id": "X14X3F3LOA01"
        }
    },
    "errors": [
        {
            "message": "The submitted application matches an existing contract.",
            "code": "603"
        }
    ]
}
Bypassing Duplicate Contract

Using one of the Demo Cases below will bypass the duplicate check.

First Name SSN
Approved 1001
Pending 1002
Declined 1003
NoHit 1004
CreditFreeze 1005

PATCH

Returns the same types as the POST method

Use the PATCH request to edit an existing application. Only applications that meet one or more of the following criteria are eligible to be updated:

  • Mismatched on either the SSN or DOB
  • The application status is DRAFT
  • A No-Hit response was returned when processing the application

The PATCH request matches the POST request, however, all fields are
optional. If a field is sent, the format validation still applies. If the location, program, or email is changed, the
application will be compared against other applications in the database for duplicates; If a duplicate is found, the request will fail with HTTP status 409, and the response body will contain relevant errors and data, as described in the Error Codes article.

GET

A GET request may be made to retrieve a single application’s details.

Request

GET /v1/applications/{application-id} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response
Returns a CreditApplicationResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
    "application": {
      "id": "0837fa8c020648469a10",
      "accountNumber": "Q8D6XBD",
      "status": "Approved",
      "pendingReason": null,
      "program": "DMFP2",
      "location": "771646B",
      "clientId": null,
      "contract": {
        "id": "Q8D6XBDLOA01",
        "status": "Pending - Merchant",
        "subStatus": "Charge",
        "email": "[email protected]",
        "cashPrice": null,
        "downPayment": null,
        "description": null,
        "credit": { "used": 0.0, "limit": 1400.0, "remaining": 1400.0, "type": "Closed" }
      },
      "applicant": {
        "firstName": "Robert",
        "middleInitial": "E",
        "lastName": "Uphold",
        "email": "[email protected]",
        "dob": "1957-06-01",
        "ssnLast4": "4418",
        "primaryNumber": "5555555555",
        "primaryNumberType": "Mobile",
        "secondaryNumber": null,
        "secondaryNumberType": null,
        "annualIncome": 99999.96,
        "residenceMonthlyExpense": 1000.0,
        "residenceType": "Rent",
        "employmentType": null,
        "address": {
          "line1": "27366 Perry St Apt. A",
          "line2": null,
          "city": "Holland",
          "state": "MI",
          "zip": "48066-2743"
        }
      },
      "coApplicant": {
        "firstName": null,
        "middleInitial": null,
        "lastName": null,
        "email": null,
        "dob": null,
        "ssnLast4": null,
        "primaryNumber": null,
        "primaryNumberType": null,
        "secondaryNumber": null,
        "secondaryNumberType": null,
        "annualIncome": null,
        "residenceMonthlyExpense": null,
        "residenceType": null,
        "employmentType": null,
        "address": {
          "line1": null,
          "line2": null,
          "city": null,
          "state": null,
          "zip": null
        }
      },
      "creditLine": 1400.0,
      "interestRate": 17.99
    }
  }
}

Contracts

View a certain contract.

GET

The contractExternalId variable should be the external Id of the contract.

Request

GET /v1/contracts/{contractExternalId} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response
Returns a ContractsResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "id": "Q8D6XBDLOA01",
        "applicant": {
            "firstName": "Approved",
            "middleInitial": "",
            "lastName": "Testcase"
        },
        "status": "Pending - Consumer",
        "substatus": "Summary",
        "noteDate": "2022-11-29",
        "term": 11,
        "firstPaymentDate": "2023-01-01",
        "payment": 94.43,
        "delinquentDays": 0,
        "credit": {
            "used": 0.0,
            "limit": 1400.0,
            "remaining": 1400.0
            "type": "Closed"
        },
        "balance": {
            "principal": 0.0,
            "interest": 0.0,
            "fees": 0.0,
            "total": 0.0
        },
        "creditAppAccountNumber": "Q8D6XBD",
        "relatedCases": []
    }
}

Offers

View the available offers for an application or a contract.

GET


Path Parameters

Parameter Type Description
applicationId string The unique identifier of the application
contractExternalId string The external identifier of the contract
financedAmount number The dollar amount to be financed (e.g., 12750.00)

Request with an application

GET /v1/offers/{application-id}/{financedAmount} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Request with a contract

GET /v1/contracts/{contractExternalId}/offers/{financedAmount} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Notes

  • if the request is with a contract then the applicationId will return null
  • only offers that have a promotional period will return with "promo" populated
  • open contracts contain a minPaymentFixed property which only applies to open lines of credit

Closed Response
Returns an OffersResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "applicationId": "demo-id-here",
        "requestedFinancedAmount": 1234.00,
        "credit": {
            "used": 0,
            "limit": 1301.0,
            "remaining": 1301.0,
            "type": "Closed"
        },
        "offers": [
            {
                "apr": 24.0,
                "downPayment": 0.00,
                "estimatedPayment": 354.70,
                "financeCharge": 506.40,
                "id": "24CAA32D7",
                "interestRate": 24.0,
                "maxAmountFinanced": 1499.99,
                "merchantCode": "UGA Staged",
                "minAmountFinanced": 500.0,
                "minPaymentFactor": 9.46,
                "promo": {
                    "term": 6,
                    "verbiage": "No Interest if Paid in Full Within 6 Months",
                    "paymentToPayoff": 625.00,
                    "apr": 0
                },
                "term": 12,
                "totalOfPayments": 4256.40,
                "totalSalePrice": 4256.40
            }
        ]
    }
}
**Open Response**
Returns an [OffersResponse](/v1/docs/api-schema#offers-response){target="\_blank"}
```json
HTTP/1.1 200 OK
Content-Type: application/json
{
    "data": {
        "applicationId": null,
        "requestedFinancedAmount": 12750.00,
        "credit": {
            "used": 0.0,
            "limit": 17000.0,
            "remaining": 17000.0,
            "type": "Open"
        },
        "offers": [
            {
                "apr": 29.99,
                "downPayment": 0.0,
                "estimatedPayment": 411.83,
                "financeCharge": 12040.98,
                "id": "CAF7843D7",
                "interestRate": 29.99,
                "maxAmountFinanced": 17000.0,
                "merchantCode": "UGA Prime A 36",
                "minAmountFinanced": 7500.0,
                "minPaymentFactor": 3.23,
                "minPaymentFixed": 75.0,
                "promo": {
                    "term": 36,
                    "verbiage": "No Interest if Paid in Full Within 36 Months",
                    "paymentToPayoff": 354.17,
                    "apr": 0
                },
                "term": 60,
                "totalOfPayments": 24790.98,
                "totalSalePrice": 24790.98
            }
        ]
    }
}

Accept

POST

Accept the application's credit decision to continue with contract creation.

Request

POST /v1/applications/{application-id}/accept HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response
Returns an AcceptResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "applyUrl": "https://test-apply.uportal360.com/?contract=RFJ4B8BLOA01",
        "uportal360Url": "https://staging.uportal360.com/navigation/RFJ4B8B",
        "account": {
            "id": "RFJ4B8B",
            "self": {
                "href": "https://test-api.uportal360.com/accounts/RFJ4B8B",
                "method": "GET"
            }
        },
        "contract": {
            "id": "RFJ4B8BLOA01",
            "decision": "APPROVED",
            "credit": {
                "used": 0.0,
                "limit": 1301.0,
                "remaining": 1301.0,
                "type": "Closed"
            },
            "self": {
                "href": "https://test-api.uportal360.com/v1/contracts/RFJ4B8BLOA01",
                "method": "GET"
            }
        }
    }
}

Charges

View, modify, or create charges for a contract.

POST

Creates a new charge, or updates the most recent unsigned charge.

Request
Accepts a ContractChargeRequest

POST /v1/contracts/{contract-id}/charges HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "cashPrice": 1299.99,
    "downPayment": 249.0,
    "description": "Flagship Demo Product",
    "deliveryDate": "2022-05-27",
    "offer": "7888459A6" // Use the ID of the preferred offer from the /v1/offers response
}

Response
Returns a ContractChargeResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "id": "Q515JWALOA01-001",
        "signatureUrl": "https://test-apply.uportal360.com/?contract=Q515JWALOA01",
        "date": "2022-03-10",
        "status": "Incomplete",
        "term": 11,
        "cashPrice": 1299.99,
        "downPayment": 249.0,
        "amount": 1050.99,
        "balance": 1050.99,
        "description": "Flagship Demo Product",
        "deliveryDate": "2022-05-27",
        "offer": {
            "apr": 17.99,
            "downPayment": 249.0,
            "estimatedPayment": 104.36,
            "financeCharge": 96.88,
            "id": "7888459A6",
            "interestRate": 17.99,
            "maxAmountFinanced": 1371.0,
            "minAmountFinanced": 500.0,
            "minPaymentFactor": 9.93,
            "minPaymentFixed": 75.0,
            "term": 11,
            "totalOfPayments": 1147.87,
            "totalSalePrice": 1396.87
        },
        "availableOffers": [
            {
                "apr": 17.99,
                "downPayment": 249.0,
                "estimatedPayment": 124.03,
                "financeCharge": 115.13,
                "id": "7888459A6",
                "interestRate": 17.99,
                "maxAmountFinanced": 1371.0,
                "minAmountFinanced": 500.0,
                "minPaymentFactor": 9.93,
                "minPaymentFixed": 75.0,
                "term": 11,
                "totalOfPayments": 1364.13,
                "totalSalePrice": 1613.13
            }
        ],
        "self": {
            "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
            "method": "GET"
        },
        "edit": {
            "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
            "method": "PATCH"
        }
    }
}

PATCH

Updates the specified charge.

Request
Accepts a ContractChargeRequest

PATCH /v1/contracts/{contract-id}/charges/{charge-slip-id} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "downPayment": 249.0,
    "description": "Flagship Demo Product (Blue)"
}

Response
Returns a ContractChargeResponse

{
  "data": {
    "id": "Q515JWALOA01-001",
    "signatureUrl": "https://test-apply.uportal360.com/?contract=Q515JWALOA01",
    "date": "2022-03-10",
    "status": "Incomplete",
    "term": 11,
    "cashPrice": 1299.99,
    "downPayment": 249.0,
    "amount": 1050.99,
    "balance": 1050.99,
    "description": "Flagship Demo Product (Blue)",
    "deliveryDate": "2022-05-27",
    "offer": {
      "apr": 17.99,
      "downPayment": 249.0,
      "estimatedPayment": 104.36,
      "financeCharge": 96.88,
      "id": "7888459A6",
      "interestRate": 17.99,
      "maxAmountFinanced": 1371.0,
      "minAmountFinanced": 500.0,
      "minPaymentFactor": 9.93,
      "minPaymentFixed": 75.0,
      "term": 11,
      "totalOfPayments": 1147.87,
      "totalSalePrice": 1396.87
    },
    "availableOffers": [
      {
        "apr": 17.99,
        "downPayment": 249.0,
        "estimatedPayment": 104.36,
        "financeCharge": 96.88,
        "id": "7888459A6",
        "interestRate": 17.99,
        "maxAmountFinanced": 1371.0,
        "minAmountFinanced": 500.0,
        "minPaymentFactor": 9.93,
        "minPaymentFixed": 75.0,
        "term": 11,
        "totalOfPayments": 1147.87,
        "totalSalePrice": 1396.87
      }
    ],
    "self": {
      "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
      "method": "GET"
    },
    "edit": {
      "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
      "method": "PATCH"
    }
  }
}

PATCH

Updates the specified charge on non-charge slip contract.

Request
Accepts a ContractChargeRequest

PATCH /v1/contracts/{contract-id}/charges HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "downPayment": 0,
    "description": "Flagship Demo Product (Yellow)"
}

Response
Returns a ContractChargeResponse

{
  "data": {
    "id": "AASRXLTLOA01",
    "signatureUrl": "https://test-apply.uportal360.com/?contract=AASRXLTLOA01",
    "date": "2022-03-10",
    "status": "Pending - Merchant",
    "term": 24,
    "cashPrice": 10000.0,
    "downPayment": 0.0,
    "amount": 10000.0,
    "balance": 10000.0,
    "description": "Flagship Demo Product (Yellow)",
    "deliveryDate": "2022-05-27",
    "offer": {
      "apr": 24.99,
      "downPayment": 0.0,
      "estimatedPayment": 533.67,
      "financeCharge": 2807.91,
      "id": "872B8DFCA",
      "interestRate": 24.99,
      "maxAmountFinanced": 10000.0,
      "minAmountFinanced": 3500.0,
      "minPaymentFactor": 5.34,
      "term": 24,
      "totalOfPayments": 12807.91,
      "totalSalePrice": 12807.91
    },
    "availableOffers": [
      {
        "apr": 24.99,
        "downPayment": 0.0,
        "estimatedPayment": 533.67,
        "financeCharge": 2807.91,
        "id": "872B8DFCA",
        "interestRate": 24.99,
        "maxAmountFinanced": 10000.0,
        "minAmountFinanced": 3500.0,
        "minPaymentFactor": 5.34,
        "term": 24,
        "totalOfPayments": 12807.91,
        "totalSalePrice": 12807.91
      }
    ],
    "self": {
      "href": "https://test-api.uportal360.com/v1/contracts/AASRXLTLOA01/charges",
      "method": "GET"
    },
    "edit": {
      "href": "https://test-api.uportal360.com/v1/contracts/AASRXLTLOA01/charges",
      "method": "PATCH"
    }
  }
}

GET (All)

View all charges on a contract.

Request

GET /v1/contracts/{contract-id}/charges HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response
Returns a ContractChargeListResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "credit": {
            "used": 0.0,
            "limit": 1371.0,
            "remaining": 1371.0
            "type": "Open"
        },
        "charges": [
            {
                "id": "Q515JWALOA01-001",
                "signatureUrl": "https://test-apply.uportal360.com/?contract=Q515JWALOA01",
                "date": "2022-03-10",
                "status": "Incomplete",
                "term": 11,
                "cashPrice": 1299.99,
                "downPayment": 249.0,
                "amount": 1050.99,
                "balance": 1050.99,
                "description": "Flagship Demo Product (Blue)",
                "deliveryDate": "2022-05-27",
                "offer": {
                    "apr": 17.99,
                    "downPayment": 249.0,
                    "estimatedPayment": 104.36,
                    "financeCharge": 96.88,
                    "id": "7888459A6",
                    "interestRate": 17.99,
                    "maxAmountFinanced": 1371.0,
                    "minAmountFinanced": 500.0,
                    "minPaymentFactor": 9.93,
                    "minPaymentFixed": 75.0,
                    "term": 11,
                    "totalOfPayments": 1147.87,
                    "totalSalePrice": 1396.87
                },
                "availableOffers": [
                    {
                        "apr": 17.99,
                        "downPayment": 249.0,
                        "estimatedPayment": 104.36,
                        "financeCharge": 96.88,
                        "id": "7888459A6",
                        "interestRate": 17.99,
                        "maxAmountFinanced": 1371.0,
                        "minAmountFinanced": 500.0,
                        "minPaymentFactor": 9.93,
                        "minPaymentFixed": 75.0,
                        "term": 11,
                        "totalOfPayments": 1147.87,
                        "totalSalePrice": 1396.87
                    }
                ],
                "self": {
                    "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
                    "method": "GET"
                },
                "edit": {
                    "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
                    "method": "PATCH"
                }
            }
        ]
    }
}

GET (Single)

View a specific charge.

Request

GET /v1/contracts/{contract-id}/charges/{charge-slip-id} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response
Returns a ContractChargeResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "id": "Q515JWALOA01-001",
        "signatureUrl": "https://test-apply.uportal360.com/?contract=Q515JWALOA01",
        "date": "2022-03-10",
        "status": "Incomplete",
        "term": 11,
        "cashPrice": 1299.99,
        "downPayment": 249.0,
        "amount": 1050.99,
        "balance": 1050.99,
        "description": "Flagship Demo Product (Blue)",
        "deliveryDate": "2022-05-27",
        "offer": {
            "apr": 17.99,
            "downPayment": 249.0,
            "estimatedPayment": 104.36,
            "financeCharge": 96.88,
            "id": "7888459A6",
            "interestRate": 17.99,
            "maxAmountFinanced": 1371.0,
            "minAmountFinanced": 500.0,
            "minPaymentFactor": 9.93,
            "minPaymentFixed": 75.0,
            "term": 11,
            "totalOfPayments": 1147.87,
            "totalSalePrice": 1396.87
        },
        "availableOffers": [
            {
                "apr": 17.99,
                "downPayment": 249.0,
                "estimatedPayment": 104.36,
                "financeCharge": 96.88,
                "id": "7888459A6",
                "interestRate": 17.99,
                "maxAmountFinanced": 1371.0,
                "minAmountFinanced": 500.0,
                "minPaymentFactor": 9.93,
                "minPaymentFixed": 75.0,
                "term": 11,
                "totalOfPayments": 1147.87,
                "totalSalePrice": 1396.87
            }
        ],
        "self": {
            "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
            "method": "GET"
        },
        "edit": {
            "href": "https://test-api.uportal360.com/v1/contracts/Q515JWALOA01/charges/Q515JWALOA01-001",
            "method": "PATCH"
        }
    }
}

Returns

  • Only one return is permitted per charge per day.
  • The maximum return amount allowed is limited to the original cash price.
  • If a return has already been processed, the maximum returnable amount is the cash price minus the total of previous returns.
  • If the return results in a refund, please allow 7–10 business days for processing.

POST

Create a return transaction on contract/chargeslip
Request
Accepts a ContractReturnRequest

POST /v1/contracts/{contractId}/returns HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "chargeId": "ABCDEFGLOA01-001",
    "amount": 249.0,
    "reason": "Return Reason",
    "caseId": "A4C446D"
}

Response
Returns a ContractReturnResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "id": "9C9A3473F",
        "chargeId": "ABCDEFGLOA01-001",
        "reason": "Return Reason",
        "date": "2024-01-31",
        "amount": 249.0,
        "status": "COMPLETE",
        "self": {
            "href": "http://localhost:8081/v1/contracts/ABCDEFGLOA01/returns/9C9A3473F",
            "method": "GET"
        }
    }
}

GET (All)

Request

GET /v1/contracts/{contractId}/returns HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response
Returns a ContractReturnResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "returns": [
            {
                "id": "D45X12B9F",
                "chargeId": "ABCDEFGLOA01-001",
                "reason": "Lorem Ipsum",
                "date": "2024-01-31",
                "amount": 1.52,
                "status": "COMPLETE",
                "self": {
                    "href": "http://localhost:8081/v1/contracts/ABCDEFGLOA01/returns/D45X12B9F",
                    "method": "GET"
                },
                {
                    "id": "13DXF4F8D",
                    "chargeId": "ABCDEFGLOA01-001",
                    "reason": "Lorem Ipsum",
                    "date": "2024-01-26",
                    "amount": 2.22,
                    "status": "COMPLETE",
                    "self": {
                        "href": "http://localhost:8081/v1/contracts/ABCDEFGLOA01/returns/13DXF4F8D",
                        "method": "GET"
                    }
                }
            ]
        }
    }

GET (Single)

Request

GET /v1/contracts/{contractId}/returns/{transactionId} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response
Returns a ContractReturnResponse

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "returns": [
            {
                "id": "D45X12B9F",
                "chargeId": "ABCDEFGLOA01-001",
                "reason": "Lorem Ipsum",
                "date": "2024-01-31",
                "amount": 1.52,
                "status": "COMPLETE",
                "self": {
                    "href": "http://localhost:8081/v1/contracts/ABCDEFGLOA01/returns/D45X12B9F",
                    "method": "GET"
                }
            }
        ]
    }
}

Support Tickets

Gets Support Ticket data and creates remarks.

GET (Single)

Get Support Ticket data from a single Support Ticket.

Request

GET /v1/support-tickets/{{caseNumber}}
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "accountNumber": "ABCDEFG",
        "applicant": "UGA Testcase",
        "caseNumber": "14055722",
        "contract": {
            "id": "ABCDEFGLOA01"
        },
        "description": "Merchant has entered a return amount of $300 related to ABCDEFGLOA01. A transaction has been created and is linked to this support ticket.",
        "intake": "API: Returns",
        "location": "Demo - Retail",
        "merchantResolution": "Return or Cancel",
        "merchantStatus": "CHD Review",
        "opened": "2025-01-09T00:16:07",
        "program": "Demo - Retail - RISA Closed",
        "specialSituationType": "NA",
        "status": "Processing",
        "subject": "Merchant Return"
    }
}

GET Remarks

Returns all Private and Public (Support Ticket Notes Log) Remarks from a single Support Ticket.

Request

GET /v1/support-tickets/{{caseNumber}}/remarks
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "privateRemarks": "01/27/2025 | 4:17 PM | Mon | CST | Merchant | Demo A | Testing Private Reamrk ||",
        "publicRemarks": "01/27/2025 | 4:17 PM | Mon | CST | Merchant | Demo A | Testing Public Remark ||"
    }
}

POST Add Remarks

Adds a Private and/or Public (Support Ticket Notes Log) Remark to a single Support Ticket.

Request Field Details
privateRemark Optional field that adds a Private Remark to a Support Ticket that only Merchants and Agents can view.
publicRemark Optional field that adds a Public Remark to a Support Ticket that every user can see.
username Optional field that specifies which user is making the request. Has to match Portal - Username on their contact.

Request

POST /v1/support-tickets/{{caseNumber}}/remarks
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "privateRemark": "Testing Private Reamrk",
    "publicRemark": "Testing Public Remark",
    "username": "[email protected]"
}

Response

Returns 201 Created if successful

HTTP/1.1 201 Created
Content-Type: application/json

PATCH

Support Ticket status must be "Merchant Review". Updates a given Support Ticket with given data.

Request Field Details
expectedResolutionDate Optional but required when Merchant Status is set to "Pending - Merchant Resolution". Must be between today and 45 days from today, including today. Gives UAS an expected time a resolution will be given.
merchantLastContactMethod Optional but required when Contact Results is set. Documents how contact was attempted to a consumer. Accepted Values: "Call Other", "Call Primary Number", "Call Secondary Number", "Email", "Text Other", "Text Primary Number", "Text Secondary Number".
contactResults Optional but required when Merchant Last Contact Method is set. Explains what happened after contact attempt with the consumer.
merchantStatus Required field that defines where in the Support Ticket process a Merchant is. Accepted Values: "Pending - Consumer Contact", "Pending - Consumer Return", "Pending - Merchant Resolution", "Pending - Merchant Review", "Resolved"
otherContact Optional but required when merchantLastContactMethod is either "Call Other" or "Text Other". Documents how contact was attempted to a consumer.
publicRemark Required field that explains why the update to the merchant status is being made and any other important details.
rmaNumber Optional field that sets the tracking number used to identify returned products.
username Optional field that specifies which user is making the request. Has to match Portal - Username on their contact.

Request

PATCH /v1/support-tickets/{{caseNumber}}
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "expectedResolutionDate": "2025-01-25",
    "merchantLastContactMethod": "Call Other",
    "contactResults": "No response",
    "merchantStatus": "Pending - Merchant Resolution",
    "otherContact": "555-555-5555",
    "publicRemark": "Testing Update",
    "rmaNumber": "123456",
    "userName": "[email protected]"
}

Response

Returns Support Ticket data.

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "accountNumber": "ABCDEFG",
        "applicant": "Uga Testcase",
        "caseNumber": "14055722",
        "contract": {
            "id": "ABCDEFGLOA01"
        },
        "description": "Merchant has entered a return amount of $300 related to ABCDEFGLOA01. A transaction has been created and is linked to this support ticket.",
        "holdDate": "2025-01-25",
        "intake": "API: Returns",
        "location": "Demo - Retail",
        "merchantResolution": "Close Account - Default",
        "merchantStatus": "Pending - Merchant Resolution",
        "opened": "2025-01-09T00:16:07",
        "program": "Demo - Retail - RISA Closed",
        "resolution": "Contract Adjustment",
        "specialSituationType": "NA",
        "status": "Merchant Review",
        "subject": "Merchant Return"
    }
}

Patch Resolve

Support Ticket status must be "Merchant Review". Sets Support Ticket status to "CHD Review", sets Hold Date to today's date, and sets Merchant Status to "Resolved".

Request Field Details
merchantResolution Required field that sets the Merchant's determined resolution. Accepted values: "Close Account - Default", "Close Account - Return or Cancel", "Continue Servicing"
publicRemark Required field that explains how the merchant came to the resolution and any other important details.
username Optional field that specifies which user is making the request. Has to match Portal - Username on their contact.

Request

PATCH /v1/support-tickets/{{caseNumber}}/resolve
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "merchantResolution": "Close Account - Default",
    "publicRemark": "Testing Resolve - NFK",
    "username": "[email protected]"
}

Response

Returns Support Ticket data.

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "accountNumber": "ABCDEFG",
        "applicant": "Uga Testcase",
        "caseNumber": "14055722",
        "contract": {
            "id": "ABCDEFGLOA01"
        },
        "description": "Merchant has entered a return amount of $300 related to ABCDEFGLOA01. A transaction has been created and is linked to this support ticket.",
        "holdDate": "2025-01-27",
        "intake": "API: Returns",
        "location": "Demo - Retail",
        "merchantResolution": "Close Account - Default",
        "merchantStatus": "Resolved",
        "opened": "2025-01-09T00:16:07",
        "program": "Demo - Retail - RISA Closed",
        "specialSituationType": "NA",
        "status": "CHD Review",
        "subject": "Merchant Return"
    }
}

Identity Verification

GET (All)

Get all the questions

Request

GET /v1/applications/{{application-id}}/questions HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "result": null,
        "nextQuestion": null,
        "questions": [
            {
                "id": 1,
                "text": "Which of the following zip codes have you resided in?",
                "answers": [
                    {
                        "id": 1,
                        "text": "64152"
                    },
                    {
                        "id": 2,
                        "text": "64151"
                    },
                    {
                        "id": 3,
                        "text": "64153"
                    },
                    {
                        "id": 4,
                        "text": "64150"
                    }
                ],
                "answer": {
                    "href": "http://localhost:8081/v1/application/0837fa8c020648469a10/kyc/1",
                    "method": "POST"
                }
            },
            {
                "id": 2,
                "text": "Which of the following phone numbers have you been associated with?",
                "answers": [
                    {
                        "id": 1,
                        "text": "(816) 111-1111"
                    },
                    {
                        "id": 2,
                        "text": "(816) 222-222"

                    },
                    {
                        "id": 3,
                        "text": "(816) 333-3333"
                    },
                    {
                        "id": 4,
                        "text": "(816) 444-4444"
                    }
                ],
                "answer": {
                    "href": "http://localhost:8081/v1/application/0837fa8c020648469a10/kyc/2",
                    "method": "POST"
                }
            },
            {
                "id": 3,
                "text": "In which state was your tax ID issued in?",
                "answers": [
                    {
                        "id": 1,
                        "text": "NY"
                    },
                    {
                        "id": 2,
                        "text": "WV"
                    },
                    {
                        "id": 3,
                        "text": "GA"
                    },
                    {
                        "id": 4,
                        "text": "IL"
                    }
                ],
                "answer": {
                    "href": "http://localhost:8081/v1/application/0837fa8c020648469a10/kyc/3",
                    "method": "POST"
                }
            }
        ]
    }
}

GET (Single)

Gets next unanswered question

Request

GET /v1/applications/{{application-id}}/kyc HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "result": null,
        "nextQuestion": {
              "id": 1,
                "text": "Which of the following zip codes have you resided in?",
                "answers": [
                    {
                        "id": 1,
                        "text": "64152"
                    },
                    {
                        "id": 2,
                        "text": "64151"
                    },
                    {
                        "id": 3,
                        "text": "64153"
                    },
                    {
                        "id": 4,
                        "text": "64150"
                    }
            ],
            "answer": {
                "href": "http://localhost:8081/v1/application/0837fa8c020648469a10/kyc/1",
                "method": "POST"
            }
        }
    }
}

POST (Answer single)

Answer question

Request

POST /v1/applications/{{application-id}}/kyc/{{questionId}} HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "answer": "1"
}

Response

Returns either the next question or the kyc result as FAIL or PASS

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "result": "FAIL"
    }
}

POST (Answer All)

Answer all KYC questions.

Request

POST /v1/applications/{{application-id}}/kyc/answers HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

[
    {
        "question": "1",
        "answer": "3"
    },
    {
        "question": "2",
        "answer": "1"
    },
    {
        "question": "3",
        "answer": "2"
    }
]

Response

Returns the kyc result as FAIL or PASS

HTTP/1.1 200 OK
Content-Type: application/json

{
    "data": {
        "result": "FAIL"
    }
}

Envelopes

This endpoint will void a DocuSign envelope if it hasn't been signed. Voiding an envelope will allow Merchants and Consumers to change contract or charge details and generate a new DocuSign envelope.

If an envelope has already been signed, then it may no longer be voided.

To void an envelope during the origination process, make a DELETE request to /v1/contracts/{contract-id}/envelope.

To void an envelope on an additional charge, make a DELETE request to /v1/contracts/{contract-id}/charges/{charge-slip-id}/envelope.

Delete

To Void Origination Envelope

DELETE /v1/contracts/{contractNumber}/envelope HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

To Void an Additional Charge

DELETE /v1/contracts/{contractNumber}/charges/{chargeSlipNumber}/envelope HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Response

Only should get back a 200 OK response with an empty body.

Contacts

Generate Temporary Login Link

This endpoint allows you to generate a login link to https://uportal360.com using your API credentials. The generated link is valid for 15 minutes. After 15 minutes, the endpoint should be called again to generate a new link.

A link may be generated using a POST request to /v1/contact/generateTemporaryLoginLink:

Request

POST /v1/contact/generateTemporaryLoginLink` HTTP/1.1
Content-Type: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

{
    "username": "{uportal360 username here}"
}

Response

Making a GET request with a web browser using the data.url value will automatically log the user into uPortal360. The link may be re-used for up to 15 minutes.

{
  "data": {
    "url": "https://uportal360.com/login/temporary/MjAyMi0xMC0zMVQxNjowODozNC40MTA1NjVabndSYks="
  }
}

Demo Merchant User

These credentials could be used to access uPortal360.

Test User Name and Password

HOST: "https://staging.uportal360.com"

username: "[email protected]"
password: "Password123"

Payment Methods

The payment method endpoints allow users to manage payment methods related to a particular contract. They support creating new methods, updating existing card details, deleting payment methods, retrieving stored methods such as cards or ACH, and discovering available types that can be added.

Recommended Usage Sequence:

  1. GET
    • Retrieve existing payment methods and view available types and subtypes that can be added.
  2. POST
    • Create a new payment method using supported types returned from the previous step.
  3. PUT
    • (Optional) Update non-sensitive details of an existing card-based payment method, such as billing address or expiration date.
  4. DELETE
    • (Optional) Remove a payment method that is no longer valid or needed.

GET

Retrieve a list of saved payment methods (e.g., cards or ACH) associated with a contract. Also returns available payment method types and subtypes that the user can add (e.g., "Bank Account", "Card" with supported subtypes).

Usage:

  • Used by customer portals and admin tools to:
    • Display stored payment methods to the user.
    • Enable adding new payment methods based on available options.
  • Helps users understand what types of payment methods they can use and manage existing ones.

Request

GET /v1/contracts/{contractId}/payment-methods HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Path Parameter

  • contractId (string) (required)
    • Description: The unique identifier for the contract or account that owns the payment methods.
    • Use: Scopes the request to a specific customer contract, ensuring only associated payment data is retrieved.
    • Example: ABC1234LOA01, ABC1234LOA02

Response

HTTP/1.1 200 OK
Content-Type: application/json
{
  "paymentMethods": [
    {
      "address1": "1234 Maple Street",
      "address2": "Apt 123",
      "autopay": false,
      "city": "Springfield",
      "contractId": "ABC1234LOA01",
      "country": "UNITED STATES",
      "expirationMonth": "12",
      "expirationYear": "2029",
      "firstName": "John",
      "paymentMethodId": "ABC1234LOA01-A10",
      "lastFour": "1111",
      "lastName": "Smith",
      "middleInitial": "T",
      "state": "IL",
      "subType": "Visa",
      "type": "Credit Card",
      "zip": "62704"
    },
    {
      "address1": "1234 Maple Street",
      "address2": "Apt 123",
      "autopay": true,
      "city": "Springfield",
      "contractId": "ABC1234LOA01",
      "country": "UNITED STATES",
      "expirationMonth": "10",
      "expirationYear": "2026",
      "firstName": "John",
      "paymentMethodId": "ABC1234LOA01-A12",
      "lastFour": "2222",
      "lastName": "Smith",
      "middleInitial": "T",
      "state": "IL",
      "subType": "Visa",
      "type": "Credit Card",
      "zip": "62704"
    }
  ],
  "paymentOptions": [
    {
      "type": "Bank Account",
      "subTypes": ["Savings", "Checking"]
    },
    {
      "type": "Card",
      "subTypes": ["Visa", "Discover", "Mastercard"]
    }
  ]
}

paymentMethods

  • paymentMethodId (string)
    • Unique identifier for the payment method.
  • contractId (string)
    • Associated contract identifier.
  • type (string)
    • Payment method type (e.g., "Credit Card", "Bank Account").
  • subType (string)
    • Card brand or bank account type (e.g., "Visa", "Checking").
  • lastFour (string)
    • Last 4 digits of card/account number.
  • expirationMonth / expirationYear (string)
    • Expiration info (only for cards).
  • firstName / middleInitial / lastName (string)
    • Cardholder or account owner info.
  • address1 / address2 / city / state / zip / country (string)
    • Billing address details.
  • autopay (boolean)
    • Indicates if this method is enrolled in autopay.

paymentOptions

  • type (string)
    • The general category of payment method the user can add, such as a card or a bank account.
    • "Credit Card" and "Debit Card" will be combined under "Card" in paymentOptions when applicable.
  • subTypes (string[])
    • Array of supported sub-types (e.g., card brands or account types).

Error Response

HTTP/1.1 401 Unauthorized
Date: Tue, 02 Jul 2024 12:18:47 GMT
WWW-Authenticate: Bearer

Possible cause:

  • Invalid or missing authentication.

HTTP/1.1 403 Forbidden
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • User doesn't have access to the contract account.

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Unexpected server failure.

POST

This endpoint is used to register a new payment method (such as a credit card, debit card, HSA card, or ACH bank account) to a specific contract account, which is typically associated with a customer. Once the payment method is added, it can be used for recurring or one-time bill payments.

For PCI compliance, the CVV is never stored and will not be saved under any circumstance. Each time a payment is made using a stored payment method, the CVV must be re-entered to complete the transaction.

Usage:

  • A customer portal adds a payment method when a user updates their billing preferences.
  • A customer service representative uses this endpoint through an admin tool to register payment details on behalf of a customer.
  • The system will validate the structure of the request.
    • For cards:
      • The system will tokenize the card via a PCI-compliant service.
      • It may run a $0 or $1 authorization to verify validity.
    • For ACH:
      • The system will verify the account number via an identity service.
    • If successful, the system stores the method securely and associates it with the contract account.

Request

POST /v1/contracts/{contractId}/payment-methods HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Path Parameter

  • contractId (string) (required)
    • Description: The unique identifier for the contract or contract account to which the new payment method will be linked.
    • Use: Identifies the contract account that the payment method is being attached to.
    • Example: ABC1234LOA01, ABC1234LOA02

Create ACH Payment Method Sample Request

{
  "firstName": "John",
  "middleInitial": "T",
  "lastName": "Smith",
  "address1": "1234 Maple Street",
  "address2": "Apt 123",
  "city": "Springfield",
  "state": "IL",
  "zip": "62704",
  "country": "UNITED STATES",
  "ach": {
    "accountType": "CHECKING",
    "routingNumber": "021000021",
    "accountNumber": "123456789012"
  }
}

Create Card Payment Method Sample Request

{
  "firstName": "John",
  "middleInitial": "T",
  "lastName": "Smith",
  "address1": "1234 Maple Street",
  "address2": "Apt 123",
  "city": "Springfield",
  "state": "IL",
  "zip": "62704",
  "country": "UNITED STATES",
  "card": {
    "cardType": "CREDIT CARD",
    "cardNumber": "1234 1234 1234 1234",
    "cardBrand": "VISA",
    "cvv": "123",
    "cardExpiration": "0126"
  }
}
  • firstName (string) (required)
    • Description: The payment method holder’s first legal name.
    • Use: Used for billing verification and display on account records.
    • Example: John
  • middleInitial (string) (optional)
    • Description: Middle initial of the payment method holder.
    • Use: May be required for identity resolution or matching existing records.
    • Example: T
  • lastName (string) (required)
    • Description: The payment method holder’s last legal name.
    • Use: Used for billing verification and record keeping.
    • Example: Smith
  • address1 (string) (required)
    • Description: Primary street address.
    • Use: Required for AVS (Address Verification System) validation by card processors and for ACH verification.
    • Example: 1234 Maple Street
  • address2 (string) (optional)
    • Description: Apartment, suite, or secondary address line.
    • Use: Used in AVS checks.
    • Example: Apt 123
  • city (string) (required)
    • Description: City for the billing address.
    • Use: Used in AVS checks.
    • Example: Springfield
  • state (string) (required)
    • Description: State or province for the billing address.
    • Use: Used in AVS checks.
    • Example: IL
  • zip (string) (required)
    • Description: ZIP/postal code.
    • Use: Required for AVS (Address Verification System) validation by card processors and for ACH verification.
    • Example: 62704
  • country (string) (required)
    • Description: The billing address associated with the payment method.
    • Use: Used in AVS checks.
    • Example: UNITED STATES

ach

  • Note: Only one of ach or card should be populated.
  • accountType (string) (required)
    • Description: Indicates the type of bank account:
      • "CHECKING"
      • "SAVINGS"
    • Use: Some financial services use different processing rules or verifications based on account type.
    • Example: CHECKING
  • routingNumber (string) (required)
    • Description: The ABA routing number (also known as the bank routing number) that identifies the financial institution where the account resides. Exactly 9 digits in the U.S.
    • Use: Used to route the ACH transaction to the correct bank.
    • Example: 021000021
  • accountNumber (string) (required)
    • Description: The bank account number to be used for ACH transactions. Typically 6–17 digits.
    • Use: Identifies the specific bank account from which ACH payments will be pulled.
    • Example: 123456789012

card

  • Note: Only one of card or ach should be populated.
  • cardType (string) (required)
    • Description: Indicates the type of card:
      • "CREDIT CARD"
      • "DEBIT CARD"
      • "HSA"
    • Use: Indicates the functional category of the card being added as a payment method.
    • Example: CREDIT CARD
  • cardNumber (string) (required)
    • Description: The full 15–16 digit card number (PAN).
    • Use: Value will be encrypted and tokenized, never saved in plain text.
    • Example: 1234 1234 1234 1234, 1234 123456 12345
  • cardBrand (string) (required)
    • Description: The brand or network of the card:
      • "VISA"
      • "MASTERCARD"
      • "AMEX"
      • "DISCOVER"
    • Use: Identifies the card brand.
    • Example: VISA
  • cvv (string) (required)
    • Description: The 3 or 4-digit card verification value (CVV2 or CVC). CVV is never stored and will not be saved under any circumstance.
    • Use: Used for security and fraud checks during authorization.
    • Example: 123 1234
  • cardExpiration (string) (required)
    • Description: Indicates card expiration in MMYY format.
    • Use: Required for authorization and to ensure card validity.
    • Example: 0126, 1227

Response

HTTP/1.1 201 Created
Content-Type: application/json
{
  "paymentMethodId": "ABC1234LOA01-A12"
}
  • paymentMethodId (string)
    • Unique identifier for the payment method.

Error Response

HTTP/1.1 400 Bad Request
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Missing required fields or invalid format.

HTTP/1.1 401 Unauthorized
Date: Tue, 02 Jul 2024 12:18:47 GMT
WWW-Authenticate: Bearer

Possible cause:

  • Invalid or missing authentication.

HTTP/1.1 403 Forbidden
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • User doesn't have access to the contract account.

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Invalid card or bank account details.
  • The payment method type cannot be added to this account at this time.
    • For example, if a user submits a payment method and the system detects through verification that it is a PrePaid card, and the contract is set up to not allow PrePaid, the system will return an error.

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Unexpected server failure.

PATCH

Updates non-sensitive metadata of an existing card-based payment method (e.g., expiration date, billing address, name).

  • Cannot be used for:
    • Updating ACH methods - must create a new one.
    • Changing card number - must create a new one.

Usage:

  • Update billing address or refresh card expiration details.
  • Used by customer portals or admin tools when the card is still valid but associated information changes.

Request

PATCH /v1/contracts/{contractId}/payment-methods/{paymentMethodId} HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Path Parameter

  • contractId (string) (required)
    • Description: The unique identifier of the contract or contract account that owns the payment method.
    • Use: Used to scope the update to a specific customer account. Ensures the update is authorized and routed to the correct context.
    • Example: ABC1234LOA01, ABC1234LOA02
  • paymentMethodId (string) (required)
    • Description: The unique identifier for the specific card payment method to be updated.
    • Use: Determines which existing payment method record to update. Must refer to a card method, or the request will be rejected.
    • Example: ABC1234LOA01-A12
{
  "firstName": "John",
  "middleInitial": "T",
  "lastName": "Smith",
  "address1": "1234 Maple Street",
  "address2": "Apt 123",
  "city": "Springfield",
  "state": "IL",
  "zip": "62704",
  "country": "UNITED STATES",
  "card": {
    "cardExpiration": "1227"
  }
}
  • firstName (string) (required)
    • Description: The payment method holder’s first legal name.
    • Use: Used for billing verification and display on account records.
    • Example: John
  • middleInitial (string) (optional)
    • Description: Middle initial of the payment method holder.
    • Use: May be required for identity resolution or matching existing records.
    • Example: T
  • lastName (string) (required)
    • Description: The payment method holder’s last legal name.
    • Use: Used for billing verification and record keeping.
    • Example: Smith
  • address1 (string) (required)
    • Description: Primary street address.
    • Use: Required for AVS (Address Verification System) validation by card processors and for ACH verification.
    • Example: 1234 Maple Street
  • address2 (string) (optional)
    • Description: Apartment, suite, or secondary address line.
    • Use: Used in AVS checks.
    • Example: Apt 123
  • city (string) (required)
    • Description: City for the billing address.
    • Use: Used in AVS checks.
    • Example: Springfield
  • state (string) (required)
    • Description: State or province for the billing address.
    • Use: Used in AVS checks.
    • Example: IL
  • zip (string) (required)
    • Description: ZIP/postal code.
    • Use: Required for AVS (Address Verification System) validation by card processors and for ACH verification.
    • Example: 62704
  • country (string) (required)
    • Description: The billing address associated with the payment method.
    • Use: Used in AVS checks.
    • Example: UNITED STATES

card

  • cardExpiration (string) (required)
    • Description: Indicates card expiration in MMYY format.
    • Use: Required for authorization and to ensure card validity.
    • Example: 0126, 1227

Response

HTTP/1.1 204 No Content
  • Payment method updated successfully.

Error Response

HTTP/1.1 400 Bad Request
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Missing required fields or invalid format.

HTTP/1.1 401 Unauthorized
Date: Tue, 02 Jul 2024 12:18:47 GMT
WWW-Authenticate: Bearer

Possible cause:

  • Invalid or missing authentication.

HTTP/1.1 403 Forbidden
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • User doesn't have access to the contract account.
  • User doesn't have access to this payment method.

HTTP/1.1 422 Unprocessable Entity
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Invalid card details.

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Unexpected server failure.

DELETE

Removes a payment method (ACH or card) from active use on a contract. The deletion is irreversible and recovery is not guaranteed.

Usage:

  • Called when a customer or admin removes a saved payment method.
  • Can be used to manage expired, unused, or revoked cards/accounts.

Request

DELETE /v1/contracts/{contractId}/payment-methods/{paymentMethodId} HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Path Parameter

  • contractId (string) (required)
    • Description: The unique identifier of the contract or contract account that owns the payment method.
    • Use: Scopes the delete operation to the correct contract account, ensuring that only authorized and context-specific deletions occur.
    • Example: ABC1234LOA01, ABC1234LOA02
  • paymentMethodId (string) (required)
    • Description: The unique identifier for the specific card or ACH payment method to be deleted.
    • Use: Specifies which existing ACH or card payment method to delete. Must exist and belong to the contract, or the request will be rejected.
    • Example: ABC1234LOA01-A12

Response

HTTP/1.1 204 No Content
  • Payment method deleted successfully.

Error Response

HTTP/1.1 400 Bad Request
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Missing required fields or invalid format.

HTTP/1.1 401 Unauthorized
Date: Tue, 02 Jul 2024 12:18:47 GMT
WWW-Authenticate: Bearer

Possible cause:

  • Invalid or missing authentication.

HTTP/1.1 403 Forbidden
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • User doesn't have access to the contract account.
  • User doesn't have access to this payment method.

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Unexpected server failure.

Payments

The payment endpoint allows users to initiate a charge using a previously stored and authorized payment method, enabling seamless transactions without re-entering payment details.

Recommended Usage Sequence:

  1. GET Payment Methods
    • Retrieve the list of existing payment methods and available options for adding new ones.
  2. POST Payment Methods (if needed)
    • Add a new payment method if the user has not previously stored one.
  3. POST
    • Initiate a one-time payment using a stored and authorized payment method.
    • Note: The CVV must be re-entered at the time of payment, as it is never stored for PCI compliance.

For more details on managing payment methods, see the Payment Method API section.

POST

This API endpoint is used to initiate a payment on behalf of a user using a previously stored and authorized payment method. It enables systems to process charges without requiring users to re-enter their payment information.

Usage:

  • A client application (web, mobile, or backend service) needs to charge a user for a specific transaction.
  • The payment method has already been securely stored (e.g., via tokenization or encryption) and is referenced by its unique ID.
  • When the payment is processed successfully, a receipt is automatically emailed to the user using the email address on file associated with the provided contractId.
    • The receipt includes:
      • Payment amount (in USD)
      • Date/time of payment
      • Payment method used (masked details)
      • Confirmation number, transaction ID, or order reference number
      • Merchant name

Request

POST /v1/contracts/{contractId}/payments HTTP/1.1
Content-Type: application/json
Accept: application/json
Authorization: your_access_token_here
Host: test-api.uportal360.com

Path Parameter

  • contractId (string) (required)
    • Description: The unique identifier for the contract or contract account to which this one-time payment is being made.
    • Use: Tells the system where to apply the payment.
    • Example: ABC1234LOA01, ABC1234LOA02
{
  "cvv": "123",
  "paymentAmount": 25.0,
  "paymentMethodId": "ABC1234LOA01-A12"
}
  • cvv (string) (required)
    • Description: The 3 or 4-digit card verification value (CVV2 or CVC).
    • Use: Used for security and fraud checks.
    • Example: 123 1234
  • paymentAmount (number) (required)
    • Description: The monetary value to be charged for this transaction. Must be a positive number and formatted to two decimal places.
    • Use: This is the actual charge amount in USD.
    • Example: 25.00
  • paymentMethodId (string) (required)
    • Description: A unique identifier for the payment method (e.g., credit card, ACH account) that has been stored and authorized for use.
    • Use: This ID is usually obtained from a prior call where the user added their payment method securely.
    • Example: ABC1234LOA01-A12

Response

HTTP/1.1 200 OK
Content-Type: application/json
{
  "paymentResponse": "PROCESSING",
  "paymentResponseText": "PROCESSING",
  "paymentMethodId": "ABC1234LOA01-A12",
  "paymentAmount": 100.0,
  "paymentReceived": "2025-06-10T14:08:00Z",
  "confirmationNumber": "472658fc-a1d0-4290-85f9-b51701c75b52",
  "merchantName": "UAS"
}
  • Payment processed successfully.

HTTP/1.1 200 OK
Content-Type: application/json
{
  "paymentResponse": "DECLINED",
  "paymentResponseText": "Insufficient Funds",
  "paymentMethodId": "ABC1234LOA01-A12",
  "paymentAmount": 100.0,
  "paymentReceived": "2025-06-10T14:08:00Z"
}
  • Payment failed due to a decline reason.

Error Response

HTTP/1.1 400 Bad Request
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Missing or invalid fields.

HTTP/1.1 401 Unauthorized
Date: Tue, 02 Jul 2024 12:18:47 GMT
WWW-Authenticate: Bearer

Possible cause:

  • Invalid or missing authentication.

HTTP/1.1 403 Forbidden
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • User doesn't have access to the contract account.
  • Unauthorized use of the payment method.
  • Payment method is not available.

HTTP/1.1 500 Internal Server Error
Content-Type: application/json
{
  "errors": [
    {
      "message": "string"
    }
  ]
}

Possible cause:

  • Unexpected server failure.

Webhook

Application Status Change

  • Gives visibility to the progression of a Credit Application

Expected Responses

  • UAS expects to receive 200 when post is successful
  • UAS expects to receive 500 if not successful or not accepted by the receiver.

Payload: Headers

  1. Content-Type: application/json

Payload: Event Examples

Newly Drafted Application

{
  "id": "LogNumber",
  "event": "ApplicationStatusChange",
  "date": "2024-02-06T12:00:00Z",
  "version": "v1",
  "data": {
    "clientId": "Test123",
    "application": {
      "id": "7d9c9c5355574a6beb0g",
      "status": "Draft"
    }
  }
}

Application Approved

{
  "id": "LogNumber",
  "event": "ApplicationStatusChange",
  "date": "2024-02-06T12:00:00Z",
  "version": "v1",
  "data": {
    "clientId": "Test123",
    "application": {
      "id": "7d9c9c5355574a6beb0g",
      "status": "Approved",
      "creditLine": 18000.0,
      "interestRate": 9.99
    }
  }
}

Offer Accepted

{
  "id": "LogNumber",
  "event": "ApplicationStatusChange",
  "date": "2024-02-06T12:00:00Z",
  "version": "v1",
  "data": {
    "clientId": "Test123",
    "application": {
      "id": "7d9c9c5355574a6beb0g",
      "status": "Approved",
      "creditLine": 18000.0,
      "interestRate": 9.99,
      "contract": {
        "id": "Q8D6XBDLOA01",
        "status": "Pending - Merchant",
        "subStatus": "Charge",
        "code": "SRV"
      }
    }
  }
}

Pending Application

{
  "id": "LogNumber",
  "event": "ApplicationStatusChange",
  "date": "2024-02-06T12:00:00Z",
  "version": "v1",
  "data": {
    "clientId": "Test123",
    "application": {
      "id": "7d9c9c5355574a6beb0g",
      "status": "Pending",
      "pendingReason": "UNRESOLVED_DATA_MISMATCH"
    }
  }
}

Declined Application

{
  "id": "LogNumber",
  "event": "ApplicationStatusChange",
  "date": "2024-02-06T12:00:00Z",
  "version": "v1",
  "data": {
    "clientId": "Test123",
    "application": {
      "id": "7d9c9c5355574a6beb0g",
      "status": "Declined"
    }
  }
}

Duplicate Application

{
  "id": "LogNumber",
  "event": "ApplicationStatusChange",
  "date": "2024-02-06T12:00:00Z",
  "version": "v1",
  "data": {
    "clientId": "Test123",
    "application": {
      "id": "7d9c9c5355574a6beb0g",
      "status": "Duplicate"
    }
  }
}

Contract Status Change

  • Gives visibility to the status changes of a contract.

Expected Responses

  • UAS expects to receive 200 when post is successful
  • UAS expects to receive 500 if not successful or not accepted by the receiver.

Payload: Headers

  1. Content-Type: application/json

Payload: Event Examples

Went Past Due

{
  "id": "9c50d198-e9ff-bb7e-da8a-0f0921300e56",
  "event": "ContractStatusChangeV1",
  "date": "2024-11-07T22:50:15.551Z",
  "version": "V1",
  "data": {
    "clientId": "Test123",
    "contract": {
      "id": "VXCA2DBLOA01",
      "code": "PUR",
      "status": "Active",
      "substatus": "Past Due",
      "delinquentDate": "2024-10-17",
      "delinquentDays": "21",
      "delinquentReason": "Support Ticket Open"
    }
  }
}

Became Current

{
  "id": "9c50d198-e9ff-bb7e-da8a-0f0921300e56",
  "event": "ContractStatusChangeV1",
  "date": "2024-11-07T22:50:15.551Z",
  "version": "V1",
  "data": {
    "contract": {
      "id": "VXCA2DBLOA01",
      "code": "PUR",
      "status": "Active",
      "substatus": "Current",
      "delinquentDays": "0"
    }
  }
}

Account Paid in Full

{
  "id": "a4ca669c-4af3-285d-8fbb-eb30127edaaa",
  "event": "ContractStatusChangeV1",
  "date": "2024-11-07T22:50:15.888Z",
  "version": "V1",
  "data": {
    "clientId": "Test123",
    "contract": {
      "id": "VXCA2DBLOA01",
      "code": "PUR",
      "status": "Closed",
      "substatus": "Consumer - Paid in Full",
      "delinquentDays": "0"
    }
  }
}

Account Closed - Default

{
  "id": "ad8250de-b1c9-8799-de12-d50562159211",
  "event": "ContractStatusChangeV1",
  "date": "2024-02-06T12:00:00Z",
  "version": "V1",
  "data": {
    "clientId": "Test123",
    "contract": {
      "id": "ABC1234LOA01",
      "code": "SRV",
      "status": "Closed",
      "substatus": "Consumer - Contract Default",
      "delinquentDate": "2023-02-04",
      "delinquentDays": "1",
      "delinquentReason": "Unknown"
    }
  }
}

Contract Signed

{
  "id": "9bf1b120-a5d4-89ab-cb0a-968a33081994",
  "event": "ContractStatusChangeV1",
  "date": "2024-11-07T23:25:12.487Z",
  "version": "V1",
  "data": {
    "clientId": "Test123",
    "contract": {
      "id": "WF96DA7LOA01",
      "code": "REV",
      "status": "Assignment",
      "substatus": "Processing",
      "delinquentDays": "0"
    }
  }
}

Support Ticket Status Change

  • Gives visibility to the progression of a Support Ticket.

Expected Responses

  • UAS expects to receive 200 when post is successful
  • UAS expects to receive 500 if not successful or not accepted by the receiver.

Payload: Headers

  1. Content-Type: application/json

Payload: Body

{
  "id": "string",
  "event": "string",
  "date": "string",
  "version": "string",
  "data": {
    "case": {
      "program": "string",
      "location": "string",
      "accountNumber": "string",
      "contractNumber": "string",
      "applicant": "string",
      "clientExtId": "string",
      "caseNumber": "string",
      "reason": "string",
      "status": "string",
      "subject": "string",
      "dateTimeOpened": "string",
      "dateTimeClosed": "string",
      "description": "string",
      "intake": "string",
      "merchantStatus": "string",
      "merchantResolution": "string",
      "resolution": "string",
      "specialSituationType": "string",
      "specialSituationInvestigation": "string"
    }
  }
}

Payload: Event Examples

Closed Support Ticket

{
  "id": "ed7a7773-9398-41ca-bf14-be13d78c3236",
  "event": "SupportTicketStatusChangeV1",
  "date": "2025-01-02T17:25:24Z",
  "version": "V1",
  "data": {
    "case": {
      "program": "Program Name",
      "location": "Location Name",
      "accountNumber": "ABCD123",
      "contractNumber": "ABCD123LOA01",
      "applicant": "First Last",
      "clientExtId": "Test123",
      "caseNumber": "01234567",
      "reason": "Product or Service",
      "status": "Closed",
      "subject": "I would Like to Return or Cancel",
      "dateTimeOpened": "2024-10-19T04:15:00Z",
      "dateTimeClosed": "2024-10-25T20:05:00Z",
      "description": "Have you reached out to the Merchant about this issue?: *Yes* Additional Details: *Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.* Select Your Desired Resolution?: * Refund or Partial Refund* Best Phone Number: *5555555555* Best Email: *[email protected]* Best Time to Contact: *Afternoon (12pm-5pm CST)*",
      "intake": "Portal - Consumer",
      "merchantStatus": "Resolved",
      "merchantResolution": "Continue Servicing",
      "resolution": "Continue Servicing - Disagreement",
      "specialSituationType": "Dispute",
      "specialSituationInvestigation": "Open - UAS Initial Review"
    }
  }
}

Initial Review Support Ticket

{
  "id": "d2496b87-bfa3-4c03-97b7-150769aff126",
  "event": "SupportTicketStatusChangeV1",
  "date": "2025-01-02T17:25:24Z",
  "version": "V1",
  "data": {
    "case": {
      "program": "Program Name",
      "location": "Location Name",
      "accountNumber": "ABCD123",
      "contractNumber": "ABCD123LOA01",
      "applicant": "First Last",
      "clientExtId": "Test123",
      "caseNumber": "11234567",
      "reason": "Product or Service",
      "status": "Initial Review",
      "subject": "I Would Like to Return or Cancel",
      "dateTimeOpened": "2025-01-02T03:24:00Z",
      "description": "Have you reached out to the Merchant about this issue?: *Yes* Additional Details: *Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.* Select Your Desired Resolution?: * Refund or Partial Refund* Best Phone Number: *5555555555* Best Email: *[email protected]* Best Time to Contact: *Afternoon (12pm-5pm CST)*",
      "intake": "Portal - Agent",
      "specialSituationType": "NA"
    }
  }
}

Merchant Review Support Ticket

{
  "id": "d2496b87-bfa3-4c03-97b7-150769aff126",
  "event": "SupportTicketStatusChangeV1",
  "date": "2025-01-02T17:25:24Z",
  "version": "V1",
  "data": {
    "case": {
      "program": "Program Name",
      "location": "Location Name",
      "accountNumber": "ABCD123",
      "contractNumber": "ABCD123LOA01",
      "applicant": "First Last",
      "caseNumber": "21234567",
      "reason": "Product or Service",
      "status": "Merchant Review",
      "subject": "I Need Help With My Purchase",
      "dateTimeOpened": "2024-12-30T04:15:00Z",
      "description": "How can we help you with your product?: *Lorem ipsum* Additional Information: *Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.* Best Phone Number: *5555555555* Best Email: *[email protected]* Best Time to Contact: *Morning (7am-12pm CST)*",
      "intake": "Portal - Agent",
      "merchantStatus": "Pending - Merchant Resolution",
      "specialSituationType": "NA"
    }
  }
}

Pre-Buyback Support Ticket

{
  "id": "c5c5d54a-f5ee-4bb9-a813-c4755cb7c51d",
  "event": "SupportTicketStatusChangeV1",
  "date": "2025-01-02T17:25:24Z",
  "version": "V1",
  "data": {
    "case": {
      "program": "ProgWram Name",
      "location": "Location Name",
      "accountNumber": "ABCD123",
      "contractNumber": "ABCD123LOA02",
      "applicant": "First Last",
      "caseNumber": "31234567",
      "reason": "Pre-Buyback",
      "status": "Pre-Buyback",
      "subject": "There May Be a Problem",
      "dateTimeOpened": "2024-12-30T02:00:00Z",
      "description": "This Account has fallen Delinquent. Please confirm with Consumer that they have Received Products and/or Services and confirm there are no issues.",
      "intake": "Pre-Buyback 4 Pay Default",
      "specialSituationType": "NA"
    }
  }
}