# New Marketplaces - Offer Carousel

## Why Integrate with Offer Wall API - New Marketplaces&#x20;

Channel partners historically want a lightweight integration with Engine’s marketplace that delivers personalized offers without heavy engineering effort. To support this, Engine offers the **Offer Wall API for New Marketplaces**—ideal for smaller sub-verticals like Credit Builders, Earned Wage Access, and Debt Relief. This API lets partners send data via API and receive the Partner Page (PP) redirect URL without needing to build a custom front-end UX.&#x20;

**Key Benefits vs. Hosted Integration:**

* **Better Lead Performance**: Send lead PII and request product types for better pre-click offer matching and post-click conversion.&#x20;
* **Stronger Re-engagement**: Leverage collected user data to re-target users across additional marketing channels.&#x20;
* **Broader Reach & Targeting**: Access Engine’s full Offer Catalog to deliver more personalized and relevant product recommendations to users.&#x20;

## High-Level Integration Overview

1. **Define `productTypes`**: Determine which product types to include in your request. Reach out to your Engine by MoneyLion Partner Managers for recommendations.
2. **Collect Lead Data**: Gather all required user and contextual fields needed for the API payload.
3. **Submit to Offer Wall API**: Send a single `POST` request to the Offer Wall API endpoint with the assembled lead data.
4. **Check for Offers**: Review the response fields `numOffers` and `numPendingResponses` to confirm offer availability.
5. **Redirect to Offer Page**: Use the `partnerPageUrl` from the response to direct users to the white-labeled or co-branded offer experience.

## Integration Steps:&#x20;

### Offer Wall API - New Marketplaces Endpoint:

```
POST - https://api.engine.tech/leads/rateTables/offerWallUrls
```

### Post Request Authorization <a href="#post-request-authorization" id="post-request-authorization"></a>

Engine will provide testing and production API access tokens. All requests to the Engine API must be authenticated using a bearer token specified in the Authorization header.

The header value is prefixed with the string "Bearer". Please contact your Engine Partner Manager for an appropriate bearer token for API testing.

```
Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

### Other Header Information <a href="#post-request-body-object-structure" id="post-request-body-object-structure"></a>

The supply partner must include the server's `userAgent` in request headers (for logging, access control, and analytics) or the request will be rejected by Engine's servers.&#x20;

### Post Request Body - Object Structure <a href="#post-request-body-object-structure" id="post-request-body-object-structure"></a>

The **required format** of the request payload to the Offer Wall API is as follows:&#x20;

```json
curl -L -X POST 'https://api.engine.tech/leads/rateTables/offerWallUrls' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer eyJhbGciOieyJhbGciOieyJhbGiOieyJhbGciOixxxxxxxxxx' \
-H 'User-Agent: My-App/1.3 (Pod 3)' \
--data-raw 
'{
    "productTypes": 
    [
        "EarnedWageAccess",
        "CashAdvance"
    ],
    "personalInformation": {
        "firstName": "John",
        "lastName": "Doe",
        "email": "john@example.com",
        "city": "New York",
        "state": "NY", 
        "primaryPhone": "2125556789",
        "address1": "45 West 21st Street",
        "address2": "5th Floor",
        "zipcode": "10010",
        "dateOfBirth": "1993-10-09",
        "ssn": "111-22-3333"
    },
    "sessionInformation": {
        "ipAddress": "8.8.8.8",
        "userAgent": "MyApp/2.1 (iOS 16.3; iPhone13,2)"
    },
    "loanInformation": {
        "purpose": "debt_consolidation",
        "loanAmount": 1000
    },
    "mortgageInformation": {
        "propertyStatus": "own_with_mortgage"
    },
    "creditInformation": {
        "providedCreditRating": "excellent"
    },
    "financialInformation": {
        "employmentStatus": "employed",
        "employmentPayFrequency": "weekly",
        "annualIncome": 100000 
    },
    "educationInformation": {
        "educationLevel": "masters"
    },
    "legalInformation": {
        "consentsToFcra": true,
        "consentsToTcpa": true,
        "fcraLanguage": "By checking this box/clicking '\''agree'\'' I hereby consent to the '\''E-Sign Agreement'\'', the '\''Credit Authorization Agreement'\'', the Terms of Service and Privacy Policy, and I am providing written consent under the Fair Credit Reporting Act (FCRA) for [Engine by MoneyLion and/or Insert Company Name], its partners and financial institutions to obtain consumer report information from my credit profile. I request that my information be provided to their partners, lenders, and financial services partners to provide me with financial recommendations, which may also include debt relief, credit repair, credit monitoring or other related services.",
        "tcpaLanguage": "I agree to be contacted by Engine by MoneyLion and its partners at the telephone number(s) I have provided above to explore personal loan offers, including contact through automatic dialing systems, artificial or pre-recorded voice messaging, or text message. I understand my consent is not required as a condition to purchasing any goods or services from anyone."
    },
    "clientTags": {
        "clientId": ["client1"],
        "trafficsource": ["email"],
        "campaignId": ["campaign1"]
    }
}'

```

### Required fields:&#x20;

While only `productTypes` and `state` are technically required in the API request, Engine highly recommends including the additional fields mentioned below. Doing so will enhance lead decision-making and boost conversion rates.

**Product Types**

<table><thead><tr><th>Field</th><th width="94.5736083984375">Type</th><th>Required?</th><th>Sample Value</th><th>Enum/Comment</th></tr></thead><tbody><tr><td><code>productTypes</code></td><td>Array</td><td>Y</td><td>"EarnedWageAccess", "CashAdvance"</td><td>Engine supports over 60 products in the New Marketplaces, listed below*</td></tr></tbody></table>

> \*"AlternativeInvestments", "AutoInsurance", "AutoServices", "AutomobileInsurance", "AutomobileLoan", "AutomobileRefinance", "BankingAccount", "BrokerageAccount", "BudgetingTools", "BusinessLendingMarketplace", "BusinessLineOfCredit", "CancellationServices", "CashAdvance", "CashManagementAccount", "CashRewards", "CertificateOfDeposit", "CheckingAccount", "CommercialAutoLoan", "CreditBuilderDebitCard", "CreditBuilderLoan", "CreditBuilderSecuredCreditCard", "CreditMonitoring", "CreditRepair", "CryptoBrokerage", "DebtSettlement", "EarnedWageAccess", "EducationOffers", "Freebies", "GigEconomy", "HealthDiscounts", "HealthInsurance", "HomeEquityInvestment", "HomeEquityLineOfCredit", "HomeEquityLoan", "IdentityProtection", "IncomeOpportunities", "IncomeProtection", "InstallmentLoanMarketplace", "MoneyMarketAccount", "MortgagePurchase", "MortgageRefinance", "MotorcycleInsurance", "OverdraftProtection", "PetInsurance", "RentUtilityBillReporting", "RentersInsurance", "RevenueBasedFinancing", "RoboInvesting", "SavingsAccount", "SecuredCreditCard", "SecuredPersonalLoan", "SpecialtyVehicleInsurance", "StudentLoan", "StudentLoanRefinance", "TaxFiling", "TermLifeInsurance", "TravelOffers", "UnsecuredCreditCard", "UnsecuredLineOfCredit", "UnsecuredPersonalLoan", "UtilitiesDiscounts", "WholeLifeInsurance"

**Personal Information**&#x20;

| Field          | Type   | Required? (Yes/No/Conditional) | Sample Value        | Enum/Comment                                                                                             |
| -------------- | ------ | ------------------------------ | ------------------- | -------------------------------------------------------------------------------------------------------- |
| `firstName`    | String | N                              | John                | <p><br></p>                                                                                              |
| `lastName`     | String | N                              | Doe                 |                                                                                                          |
| `email`        | String | N                              | <john@example.com>  |                                                                                                          |
| `city`         | String | N                              | New York            |                                                                                                          |
| `state`        | String | Y                              | NY                  | <p>State<br>50 U.S. states + DC (District of Columbia) + PR (Puerto Rico) + VI (U.S. Virgin Islands)</p> |
| `primaryPhone` | String | N                              | 2125556789          | See Regex Validations below for more information                                                         |
| `address1`     | String | N                              | 45 West 21st Street |                                                                                                          |
| `address2`     | String | N                              | 5th Floor           |                                                                                                          |
| `zipcode`      | String | N                              | 10010               | See Regex Validations below for more information                                                         |
| `dateOfBirth`  | String | N                              | 1993-10-09          | yyyy-mm-dd                                                                                               |
| `ssn`          | String | N                              | 124-22-3333         | <p>Social Security Number.<br>See Regex Validations below for more information</p>                       |

**Loan Information**

| Field        | Type    | Required? (Yes/No) | Sample Value        | Comment                                                                                         |
| ------------ | ------- | ------------------ | ------------------- | ----------------------------------------------------------------------------------------------- |
| `purpose`    | String  | N                  | debt\_consolidation | See enum at API reference - [purpose](https://engine.tech/docs/api-reference/#tocS_LoanPurpose) |
| `loanAmount` | Integer | N                  | 1000                | Unit in USD                                                                                     |

**Mortgage Information**

| Field            | Type   | Required? (Yes/No) | Sample Value        | Comment                                                                                                   |
| ---------------- | ------ | ------------------ | ------------------- | --------------------------------------------------------------------------------------------------------- |
| `propertyStatus` | String | N                  | own\_with\_mortgage | See enum at API reference - [propertyStatus](https://engine.tech/docs/api-reference/#tocS_PropertyStatus) |

**Credit Information**

| Field                        | Type   | Required? (Yes/No/Conditional) | Sample Value | Comment                                                                                                                   |
| ---------------------------- | ------ | ------------------------------ | ------------ | ------------------------------------------------------------------------------------------------------------------------- |
| `providedCreditRating`       | String | N                              | good         | See enum at API reference - [providedCreditRating](https://engine.tech/docs/api-reference/#tocS_ProvidedCreditRating)     |
| `providedNumericCreditScore` | Int    | N                              | 750          | Include either `providedCreditRating` or `providedNumericCreditScore` if passing the data (not necessary to include both) |

**Financial Information**

| Field                    | Type    | Required? (Yes/No/Conditional) | Sample Value | Enum/Comment                                                                                                              |
| ------------------------ | ------- | ------------------------------ | ------------ | ------------------------------------------------------------------------------------------------------------------------- |
| `employmentStatus`       | String  | N                              | employed     | See enum at API reference - [employmentStatus](https://engine.tech/docs/api-reference/#tocS_EmploymentStatus)             |
| `employmentPayFrequency` | String  | N                              | weekly       | See enum at API reference - [employmentPayFrequency](https://engine.tech/docs/api-reference/#tocS_EmploymentPayFrequency) |
| `annualIncome`           | Integer | N                              | 100000       | Unit in USD                                                                                                               |

**Legal Information**

| Field            | Type    | Required? (Yes/No/Conditional) | Sample Value                                                    | Enum/Comment                                                                                      |
| ---------------- | ------- | ------------------------------ | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| `consentsToFcra` | Boolean | N                              | true                                                            |                                                                                                   |
| `fcraLanguage`   | String  | Conditional                    | "By checking this box/clicking 'agree' I hereby consent to ..." | Required if `consentsToFcra` is `true`. Must include the exact FCRA language shown to users.      |
| `consentstoTcpa` | Boolean | N                              | true                                                            |                                                                                                   |
| `tcpaLanguage`   | String  | Conditional                    | "By checking this box/clicking 'agree' I hereby consent to ..." | Required only if `consentsToTcpa` is `true`. Must include the exact TCPA language shown to users. |

**Session Information**&#x20;

| Field       | Type   | Required? (Yes/No) | Sample Value                     | Enum/Comment                                                            |
| ----------- | ------ | ------------------ | -------------------------------- | ----------------------------------------------------------------------- |
| `ipAddress` | String | N                  | 8.8.8.8                          | Used for fraud detection by Engine and Financial Institution partners   |
| userAgent   | String | N                  | MyApp/2.1 (iOS 16.3; iPhone13,2) | Used for fraud detection/prevention by Financial Institution partners\* |

{% hint style="info" %}
`sessionInformation.userAgent` should reflect the userAgent of the *client* (i.e. **consumer**'s device), which is different from the `User-Agent` required in request headers (which should reflect the channel partner's server )
{% endhint %}

**Client Tags**

| Field      | Type  | Required? (Yes/No) | Sample Value | Enum/Comment                                                                                                                                                                                                                                                                                                      |
| ---------- | ----- | ------------------ | ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `clientId` | Array | N                  | clientId123  | <p>Client Tags can be added for ease of reporting/attribution (i.e. for the partner's convenience when Engine reports metrics to the partner). Refer to <a href="https://engine.tech/developer-center/loans-savings-second-look-marketplace/api/client-tags">Client Tags for Reporting</a> for details</p><p></p> |

**Regex Validations**

The following fields have the regex checks and will return errors if your lead submission does not adhere to this logic:

**personalInformation.primaryPhone**

The primary must be a string of 10 digits, with or without a leading 1, and with or without special characters e.g. `()-.`&#x20;

The area code cannot be the same 3 digits repeated, e.g. `222` or `333`.

**personalInformation.zipcode**

The zip code must be a string of either:

1. 5 digits
2. 5 digits, a hyphen `-`, and 4 more digits

**personalInformation.ssn**

1. The SSN cannot have all digits in each group be identical (e.g., `111-11-1111` or `222-22-2222`).
2. The following specific SSNs are not allowed because they are commonly used in examples or considered invalid:

* `123-45-6789`
* `219-09-9999`
* `078-05-1120`

3. The first group of three digits cannot be:

* `666`
* `000`
* Any number starting with `9` (e.g., `900`–`999`).

4. The middle group of two digits cannot be:

* `00`

5. The last group of four digits cannot be:

* `0000` &#x20;

### API Response and Parsing

#### Sample response: &#x20;

```json
{
    "uuid": "uuid will appear here",
    "leadUuid": "leadUuid will appear here",
    "numOffers": 3, //static offers + custom audience offers that have resolved
    "numPendingResponses": 1, //pending responses 
    "partnerPageUrl": "https://www.moneylion.com/network/moneylion/cash-advance/compare/<uuid>"
} 
```

As shown in the sample response above, Partners will get the following information upon making a successful request:&#x20;

* `uuid` - this is a Rate Table UUID.&#x20;
* `leadUuid` - this is the uuid for each lead, or user. Generally a leadUuid should have only one rate table UUID. Only after the rate table for a lead expires (usually 30 days), should the user get a new rate table uuid.&#x20;
* `numOffers` - Number of offers resolved by Engine.
* `numPendingResponses` - Number of pending responses Engine is still resolving internally or awaiting from Financial Institution partners.
* `partnerPageUrl` - this is the partner page URL Engine will render for leads originated from the partner.  Partners should redirect the user into this url (if there are any offers for that lead).

#### **Suggested Parsing Logic of the API Response:**&#x20;

1. **Store Identifiers.** Partners should first store the `uuid` and `leadUuid` fields for analytics, optimization, or internal tracking as needed.
2. **Redirect:**&#x20;
   1. If  `numOffers` is > 0, you may redirect the lead to the returned partnerPageUrl immediately.
   2. If **both** `numPendingResponses` and `numOffers` are 0, we **advise against** redirecting the lead to the `partnerPageUrl`. The lead will see an empty offer wall. The `partnerPageUrl` field will be present even if `numOffers` is 0.
3. Do **NOT** poll [`https://api.engine.tech/leads/rateTables/offerWallUrls`](https://api.engine.tech/leads/rateTables/offerWallUrls) for the same lead. Engine will create a **new rate table UUID** on every call to this endpoint, which can lead to inconsistencies and duplicate lead tracking. This endpoint **blocks** until all pending responses have resolved.

#### Sample Partner Page&#x20;

<figure><img src="https://3849802388-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MeMvVDbjd8vJWZ9Hwf0%2Fuploads%2FxxTxgjlA32yKJEo8caKr%2Fimage.png?alt=media&#x26;token=35800a59-3728-4783-9be2-57c21011d3fc" alt=""><figcaption></figcaption></figure>

#### Future Improvements

Engine plans to expand partnerships with more financial institutions to enhance the range of financial products available, meeting the diverse needs of our supply partners' end customers.&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://even-financial.gitbook.io/developer-center/hybrid-api-integrations/offer-wall-api-integrations/new-marketplaces-offer-carousel.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
