Implementation Guide
  • 16 May 2024
  • 18 Minutes to read
  • Contributors
  • Dark
    Light
  • PDF

Implementation Guide

  • Dark
    Light
  • PDF

Article Summary

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

Production Credentials - To receive production 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]

API Base URLs

EnvironmentURL
Sandboxhttps://test-api.uportal360.com/
Productionhttps://api.uportal360.com/

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

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

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

Please email [email protected] to receive your OAuth2
credentials.

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

grant_type=password&
client_id=CLIENT-ID-HERE&
client_secret=CLIENT-SECRET-HERE&
username=USERNAME-HERE&
password=PASSWORD-HERE

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.

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" : "DEMOX",
  "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 NameSSN
Approved1001
Pending1002
Declined1003
NoHit1004
CreditFreeze1005
OfacReview1007
OfacReviewPositive1008
OfacReviewUnresolved1009

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": "CALIB",
      "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

The financedAmount path variable should be the dollar amount that will be financed.

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

Response
Returns an OffersResponse

Note - if the request is with a contract then the applicationId will return null

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": [
            {
                "id": "7888459A6",
                "interestRate": 17.99,
                "apr": 17.99,
                "term": 11,
                "estimatedPayment": 122.54,
                "downPayment": 0.0,
                "minAmountFinanced": 500.0,
                "maxAmountFinanced": 1301.0,
                "minPaymentFactor": 9.93
            }
        ]
    }
}

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

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

Cases

Create cases for a contract.

POST

Creates a new Client Request Case for a Contract.

Request
Accepts a CreateClientRequest

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

{
    "contractId": "{Contract Id}",
    "caseType": "Client Request",
    "description": "{Case description}",
    "reason": "{Reason for Request}"
}

Response

Returns the id of the new Case.

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

{
    "data": "47A507A",
}

GET (Single)

View a specific Case.

Request

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

Response
Returns a CaseDataResponse

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

{
    "data": {
        "caseId": "T9B9AXD",
        "status": "Closed",
        "assignTo": "Consumer Help Desk",
        "reason": "Standard",
        "contractId": "{Related Contract Id}",
        "subject": "LOS - Contract Welcome Call",
        "description": "requires a welcome call.",
        "origin": "New Contract",
        "createdDate": "2018-10-21T09:23:35",
        "closedDate": "2018-10-23T00:18:22",
        "daysOpen": 1.0,
        "caseComments": [
            {
                "commentNotes": "Case Notes",
                "createdDate": "2018-10-23T00:18:28"
            }
        ]
    }
}

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.

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

Test Data

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

Applications

There are many possible outcomes during the decisioning of an
application. Use these static tests with the /applications endpoint.

OutcomeFirst NameLast NameSSNDescription

Approved

Approved

Testcase

1001

The applicant has passed a credit check. The application has been locked and converted into a contract.

Pending

Pending

Testcase

1002

The applicant has passed a credit check. However, the application must be accepted by the Merchant through the uPortal360 interface.

Declined

Declined

Testcase

1003

The applicant has failed a credit check. The application is locked.

No Hit

NoHit

Testcase

1004

The applicant’s information was not found during the credit check. PATCH the application with updated information to try again.

Credit Freeze

CreditFreeze

Testcase

1005

The applicant’s credit report is frozen.


What's Next