Hello!

My GPT, sbv4GPT, is designed to allow users to check the New Market Tax Credit (NMTC) eligibility of batches of addresses. I have tested it for batches of up to 100 addresses. The New Markets Tax Credit (NMTC) is a federal program in the United States aimed at stimulating economic development in low-income communities. The program achieves this by encouraging private investment in these areas. Eligibility for NMTC is determined based on criteria set by the U.S. Census Bureau, identifying regions that qualify as low-income communities. Investors participating in the program can receive a tax credit worth up to 39% of their investment. This credit is not a direct write-off from the gross operating returns of the economic activity but is instead claimed over a period of seven years, providing a significant incentive for investment in these designated areas. A friend who works for an ev charger startup was tasked to manually check the eligibility of several hundred potential charger locations. When she described this mundane task to me I thought that it would be a great use case for a custom GPT (and potentially monetizable). We plan to contact real estate developers, ev charger installation companies, and other relevant enterprises and offer access to sbv4GPT as a microSaaS.

How it works:

  1. The user inputs a batch of US addresses that they want to check the NMTC eligibility of.
  2. sbv4GPT formats the addresses correctly, and sends them via a /POST API call to a webapp on heroku (sbappv2-2) as a JSON array of strings.
  3. Sbappv2-2 reformats the addresses as a JSON object containing an array of strings. This is sent off to a geocoding service with the other required parameters via a /POST API call.
  4. The geocoding service returns all census2020 data from the geocoding service to sbappv2-2.
  5. Sbappv2-2 extracts the relevant data from the census2020 data (the tract_code and county_fips) and returns the relevant data to sbv4GPT
  6. Sbv4GPT concatenates the tract_code and county_fips strings into an 11 digit census tract FIPS number.
  7. Sbv4GPT then checks the 11 digit number generated for each address against a tabular spreadsheet containing every US census tracts 11 digit FIPS number and corresponding NMTC eligibility status, which is uploaded to sbv4GPT as "knowledge".
  8. Sbv4GPT then prints each address and its eligibility status for the user.

Why we built it like this:

  1. Because checking one address at a time is inefficient and tiresome. 2,3. OpenAPI 3.0.0 spec will not let you send a flat JSON array of strings, it requires a JSON object schema. The geocoder batch geocoding API requires addresses formatted as a flat JSON array of strings. Sbappv2-2 is a workaround around this. 4,5. The geocoding service returns significantly more characters than is necessary for our purpose. By extracting only the county_fips and tract_code before returning geocoding data to sbv4GPT, we can allow for much larger batches of addresses to be checked. This is due to the limitations in AAPI response length that GPTs can handle.
  2. This is necessary to match the 11 digit format of the FIPS numbers in the spreadsheet.
  3. This is the crux of out methodology. The spreadsheet is a trimmed down version of one available from the federal government.

The challenges we faced came from our teams lack of programming experience. Our first challenge was figuring out what a JSON array vs JSON object was, and how to get around the inherent incompatibility between what our GPT could send and what the geocoding service required. Our second challenge was reliably getting the GPT to concatenate the two strings into the correct and required 11 digit format. Our third challenge was ensuring that sbv4GPT could reliably check against its eligibility spreadsheet.

To use sbv4GPT you will need a batch of real US addresses to check the eligibility of! To generate this go to https://chat.openai.com/g/g-HJwIVipEu-rentcastv2gpt and ask for n random addresses (rentcastv2 can generate up to 20 random addresses at a time). Please use the prompt:

"Please generate 10 random addresses. Return the addresses only."

Then go to https://chat.openai.com/g/g-cfYDBbqbw-sbv4gpt and paste the list of addresses.

The prompt should be formatted like:

"954 Galloway Ridge Ct, Lawrenceville, GA 30045 1256 Tuna, Lot 37, Crystal Beach, TX 77650 10610 Idlebrook Dr, Houston, TX 77070 817 N Catalina Ave, Tucson, AZ 85711 1424 W 103rd St, Los Angeles, CA 90047 191 Rockwood, Unit 62, Irvine, CA 92614 457 Prairie Cv, Marion, AR 72364"

sbv4GPT should then return the eligibility status of each address from the batch.

You can check the veracity of the output at https://cimsprodprep.cdfifund.gov/CIMS4/apps/pn-nmtc/index.aspx

If it does not work, please open a new chat session with sbv4GPT and try again. Sometimes the nondeterministic aspect of GPT-4 will do strange things to the logic flow in the prompt.

Both sbv4GPT and rentcastv2GPT are connected to my cc through api/heroku costs. The services underpinning both allow a generous free number of calls, but there is always the potential to run up costs if they were to get loose on the internet, especially rentcastv2GPT. Please do not share the link to either.

Happy prompting, and thanks for your time!

Built With

Share this project:

Updates