D1C reports guide
Learn how to monitor and generate D1C reports.
An updated version of this guide is now available.
Argyle is working together with Fannie Mae to become a designated vendor for supporting Day-1 Certainty (D1C) applications for mortgage underwriting.
With data from its consumer-permissioned platform, Argyle can populate and format D1C reports to work seamlessly with Fannie Mae's automated DU Validation Services (DUVS) system.
Overview#
Argyle is able to generate D1C reports when the required data is available from a user's connected payroll accounts. This guide shows you how to monitor whether a D1C report can be generated for a user and, if so, how to generate a D1C report.
Our webhooks can be used together to determine if a D1C report is ready to be generated through Argyle:
- Subscribe to the
users.fully_synced
webhook to be notified when data retrieval has completed for all accounts connected by a user. Use this webhook to determine if there are any payroll platforms or employer accounts missing that may contain data required to generate a D1C report. - Subscribe to the
reports.d1c_data_ready
webhook to be notified when a D1C report can be generated from the available data for a user. - Subscribe to the
reports.d1c_data_incomplete
webhook to be notified if a D1C report cannot be generated from the available data for a user.
Once you receive the reports.d1c_data_ready
webhook, you can generate a D1C report by making a POST request to the /v1/du-validation/generate
endpoint. See this section below for further details on retrieving a D1C report via this endpoint.
Subscribe to webhooks#
users.fully_synced
#
The users.fully_synced
webhook is publicly documented and can be viewed here.
Use this webhook to determine if there are any payroll platforms or employer accounts missing that may contain data required to generate a D1C report.
To subscribe, send a POST request in this form:
1curl -X POST https://api.argyle.com/v1/webhooks \ 2 -u api_key_id:api_key_secret \ 3 -H "Content-Type: application/json" \ 4 -d '{"events": ["users.fully_synced"], 5 "secret": "<secret for signature verification>", 6 "name": "<name for your webhook>", 7 "url": "https://webhook.site/url"}'
The payload of this webhook will contain the ID of the user and a list of payroll platforms and employers they have connected.
Example users.fully_synced response payload:
1{ 2 "name": "<name for your webhook>", 3 "event": "users.fully_synced", 4 "data": { 5 "user": "01838ad1-b6bd-22f8-22f1-d3f5b3953484", 6 "resource": { 7 "id": "01838ad1-b6bd-22f8-22f1-d3f5b3953484", 8 "data_providers_connected": [ 9 "mypayroll_platform" 10 ], 11 "employers_connected": [ 12 "Whole Goods", 13 "SprintCar" 14 ], 15 "external_metadata": { 16 "key": "value" 17 }, 18 "created_at": "2022-09-29T19:55:43.166095Z" 19 } 20 } 21}
reports.d1c_data_ready
#
Subscribe to the reports.d1c_data_ready
webhook to be notified when a D1C report can be generated from the available data for a user.
To subscribe, send a POST request in this form:
1curl -X POST https://api.argyle.com/v1/webhooks \ 2 -u api_key_id:api_key_secret \ 3 -H "Content-Type: application/json" \ 4 -d '{"events": ["reports.d1c_data_ready"], 5 "secret": "<secret for signature verification>", 6 "name": "<name for your webhook>", 7 "url": "https://webhook.site/url"}'
Example reports.d1c_data_ready response payload:
1{ 2 "name": "<name for your webhook>", 3 "event": "reports.d1c_data_ready", 4 "data": { 5 "user": { 6 "id": "01838ad1-b6bd-22f8-22f1-d3f5b3953484", 7 "data_providers_connected": [ 8 "mypayroll_platform" 9 ], 10 "employers_connected": [ 11 "Whole Goods", 12 "SprintCar" 13 ], 14 "external_metadata": {}, 15 "created_at": "2022-09-29T20:24:43.166095Z" 16 } 17 } 18}
reports.d1c_data_incomplete
#
Subscribe to the reports.d1c_data_incomplete
webhook to be notified if a D1C report cannot be generated from the available data for a user.
To subscribe, send a POST request in this form:
1curl -X POST https://api.argyle.com/v1/webhooks \ 2 -u api_key_id:api_key_secret \ 3 -H "Content-Type: application/json" \ 4 -d '{"events": ["reports.d1c_data_incomplete"], 5 "secret": "<secret for signature verification>", 6 "name": "<name for your webhook>", 7 "url": "https://webhook.site/url"}'
Example reports.d1c_data_incomplete response payload:
1{ 2 "name": "<name for your webhook>", 3 "event": "reports.d1c_data_incomplete", 4 "data": { 5 "user": { 6 "id": "01838ad1-b6bd-22f8-22f1-d3f5b3953484", 7 "data_providers_connected": [ 8 "mypayroll_platform" 9 ], 10 "employers_connected": [ 11 "Whole Goods", 12 "SprintCar" 13 ], 14 "external_metadata": {}, 15 "created_at": "2022-09-29T20:11:43.166095Z" 16 } 17 } 18}
Endpoint — /v1/du-validation/generate#
Once you receive the reports.d1c_data_ready
webhook, you can generate a D1C report by making a POST request to the /v1/du-validation/generate
endpoint.
For authentication, use your production api_key_id
and api_key_secret
found in Console.
D1C report — Request#
To retrieve a D1C report, send a POST request in this form:
1curl -X POST https://api.argyle.com/v1/du-validation/generate \ 2 -u api_key_id:api_key_secret \ 3 -H "Content-Type: application/xml" \ 4 -d '<GenerateReportRequest> 5 <UserId>"integer user Id"</UserId> 6 <Identity>"ssn in XXX-XX-XXXX format"</Identity> 7 <TrackingKey>"tracking key goes here"</TrackingKey> 8 </GenerateReportRequest>'
Note that XML is used in requests to the /v1/du-validation/generate
endpoint.
Required body parameters:
<UserId>
- the unique ID of the user
<Identity>
- the user's social security number, which can be partially masked xxx-xx-1234 or unmasked 123-45-6789.
<TrackingKey>
- a pass through field containing random uuid metadata that can be used for your internal tracking needs.
Example of body parameters in XML with values filled in:
1<GenerateReportRequest> 2 <UserId>012491d2-54ce-22cd-32fe-a806141235c0</UserId> 3 <Identity>XXX-XX-1191</Identity> 4 <TrackingKey>8d652475-cb19-429b-b2b0-9648f71f2690</TrackingKey> 5</GenerateReportRequest>
D1C report — Response#
After requesting a D1C report using the /v1/du-validation/generate endpoint, an XML response will be returned in the format prescribed by Fannie Mae, outlined formally in the below documents.
The response contains:
<GenerateReportResponse>
- the outermost wrapper, which includes:
<IsValid>
- boolean value indicating whether<ReissueResponse>
contains the necessary data to conform to the D1C report requirements prescribed by Fannie Mae.<Status>
- value indicating whether<ReissueResponse>
can be generated. Possible values are valid, processing, or incomplete.<Error>
- included when<IsValid>
is false. Contains error details.<ReissueResponse>
- the D1C report itself. It will contain the following items in the opening tag:- Identity - social security number of the user
- ReportID - report code that can be used in future communication with Fannie Mae
- Product - report type (VOE indicates Verification of Employment)
- TrackingKey - contains the uuid that you included in the body parameters of the request
- ServiceProviderCode - designated partner providing the D1C report
- OriginalTransactionDate - date the report was generated
- Status - error field. “0” indicates success. See the error codes section below for more information.
Example /v1/du-validation/generate response payload:
1<GenerateReportResponse> 2 <IsValid>true</IsValid> 3 <Status>valid</Status> 4 <ReissueResponse Identity="xxx-xx-9007" ReportID="0183a4e7-5925-c6de-6af3-bf3514ce14c0" Product="VOE" TrackingKey="120d0c26-b23e-481e-976b-6444f3153d02" ServiceProviderCode="Argyle" OriginalTransactionDate="2022-10-04" Status="0" Message="Success"> 5 <VerificationResponse> 6 <VOE_VOI> 7 <VOEHEADER> 8 <TransactionId>01837123-09e7-fa5f-c4c3-310f965be93f</TransactionId> 9 <TransactionDate>2022-10-04T21:29:30</TransactionDate> 10 </VOEHEADER> 11 <VOEBODY> 12 <VOE> 13 <EMPLOYER> 14 <NAME>Happy Company</NAME> 15 <ADDRESS> 16 <ADDR1>Some street</ADDR1> 17 <ADDR2/> 18 <CITY>New York</CITY> 19 <STATE>NY</STATE> 20 <POSTALCODE>1234</POSTALCODE> 21 <ISOCOUNTRYCODE>US</ISOCOUNTRYCODE> 22 </ADDRESS> 23 </EMPLOYER> 24 <EMPLOYEE> 25 <SSN>xxxxx9007</SSN> 26 <FULLNAME> 27 <FIRST_NAME>Bob</FIRST_NAME> 28 <MIDDLE_NAME/> 29 <LAST_NAME>Jones</LAST_NAME> 30 </FULLNAME> 31 <POSITION_TITLE>PT Preload Supervisor</POSITION_TITLE> 32 <EMPLOYEESTATUS> 33 <CODE>1</CODE> 34 <MESSAGE>Active</MESSAGE> 35 </EMPLOYEESTATUS> 36 <DTINFO>2022-09-24T00:00:00</DTINFO> 37 <DTMOSTRECENTHIRE>2006-01-11</DTMOSTRECENTHIRE> 38 <DTORIGINALHIRE>2006-01-11</DTORIGINALHIRE> 39 </EMPLOYEE> 40 <COMPLETENESS>INCOME</COMPLETENESS> 41 <BASECOMP> 42 <PAYFREQUENCY> 43 <CODE>9</CODE> 44 <MESSAGE>Hourly</MESSAGE> 45 </PAYFREQUENCY> 46 <RATEOFPAY>26.16</RATEOFPAY> 47 <ISOCurrencyCode>USD</ISOCurrencyCode> 48 </BASECOMP> 49 <ANNUALCOMPS> 50 <ANNUALCOMP> 51 <YEAR>2022</YEAR> 52 <BASE>29211.69</BASE> 53 <OVERTIME>118.82</OVERTIME> 54 <COMMISSION>0.0</COMMISSION> 55 <BONUS>0.0</BONUS> 56 <OTHER>1644.39</OTHER> 57 <TOTAL>30974.9</TOTAL> 58 </ANNUALCOMP> 59 <ANNUALCOMP> 60 <YEAR>2021</YEAR> 61 <BASE>42807.3</BASE> 62 <OVERTIME>2463.18</OVERTIME> 63 <COMMISSION>0.0</COMMISSION> 64 <BONUS>0.0</BONUS> 65 <OTHER>3565.17</OTHER> 66 <TOTAL>48835.65</TOTAL> 67 </ANNUALCOMP> 68 <ANNUALCOMP> 69 <YEAR>2020</YEAR> 70 <BASE>39877.9</BASE> 71 <OVERTIME>1344.91</OVERTIME> 72 <COMMISSION>0.0</COMMISSION> 73 <BONUS>0.0</BONUS> 74 <OTHER>1541.76</OTHER> 75 <TOTAL>42764.57</TOTAL> 76 </ANNUALCOMP> 77 </ANNUALCOMPS> 78 <VERIFICATIONTYPE>INSTANT</VERIFICATIONTYPE> 79 </VOE> 80 </VOEBODY> 81 </VOE_VOI> 82 </VerificationResponse> 83 </ReissueResponse> 84</GenerateReportResponse>
Endpoint — Error codes#
Error codes can be found in the “Status” field in the <ReissueResponse>
layer that is returned by the /v1/du-validation/generate
endpoint. A “Status” value of “0” indicates a successful response has been generated.
Validation errors#
- Status = “17357” (Argyle data validation)
A D1C report cannot be generated with currently available data in Argyle for the user.
1<GenerateReportResponse> 2 <IsValid>false</IsValid> 3 <Status>incomplete</Status> 4 <Error> 5 <message>User 0183e3fb-1eea-a7e2-350f-4f680c4782ca report is missing information for all 1 accounts</message> 6 <details> 7 <detail>Account 0183e3fb-98eb-6599-e64c-dbcec5ed296a: employment.base_pay is missing</detail> 8 <detail>Account 0183e3fb-98eb-6599-e64c-dbcec5ed296a: employment.base_pay.amount is missing</detail> 9 <detail>Account 0183e3fb-98eb-6599-e64c-dbcec5ed296a: employment.base_pay.period is missing</detail> 10 </details> 11 </Error> 12 <ReissueResponse 13 Identity="123-45-6789" 14 ReportID="0183e7d1-0d61-2c56-8c64-839decf29c82" 15 Product="VOE" TrackingKey="2248a6f1-cf15-437a-87af-a7c0bcb302e3" 16 ServiceProviderCode="Argyle" 17 OriginalTransactionDate="2022-10-17" 18 Status="17357" 19 Message="Unable to match reference data"> 20 ... 21 </ReissueResponse> 22</GenerateReportResponse>
- Status = "202" (report generation)
The D1C report is still processing and cannot currently be generated.
1<GenerateReportResponse> 2 <IsValid>false</IsValid> 3 <Status>processing</Status> 4</GenerateReportResponse>
- Status = “400” (request payload validation)
The request to /v1/du-validation/generate
does not match the expected format.
1<Error> 2 <message>Invalid request</message> 3</Error>
- Status = “422” (identity validation)
The SSN in the request to /v1/du-validation/generate
does not match the SSN for the user in Argyle. Use the /profiles
endpoint to check the SSN for a user in Argyle.
1<Error> 2 <message>Request SSN doesn't match user SSN.</message> 3</Error>
System errors#
- Status = “401” (auth failed)
Authorization failed when calling the /v1/du-validation/generate
endpoint.
1<Error> 2 <message>Failed authenticating password</message> 3</Error>
- Status = “500” (storage service failed)
The generated D1C report could not be saved by the storage service.
1<Error> 2 <message>Failed to save report</message> 3</Error>
PDF reports#
When you generate a Verification of Income and Employment (VOIE) report using Console or the API, Argyle will automatically attempt to generate a D1C report from the user's available data.
Generate via Console#
Generate a VOIE report through Console from within an individual user's profile.
If a D1C report was successfully generated from the user's available data, a DU reference ID will be included in the upper-right of the VOIE report. This ID can be passed to Fannie Mae's DUVS system.
Generate via API#
Generate a report using the /reports
endpoint with a type value of voie-d1c
.
- The response payload will include a
d1c_report
object within metadata. - If a D1C report was successfully generated from the user's available data, the
id
field within thed1c_report
object will contain a DU reference ID that can be passed to Fannie Mae's DUVS system.
Example voie-d1c report JSON payload:
1{ 2 "id":"9f82994c-774d-11eb-b1c7-13e87316bacb", 3 "reference_id":"VOIE12357", 4 "generated_at":"2020-11-29T08:33:41.525392Z", 5 "type":"voie", 6 "user":"8a5f613a-673a-4434-aeee-1a38b960b936", 7 "status":"generated", 8 "file_url":"www.company.com/voie_report.pdf", 9 "metadata":{ 10 "d1c_report":{ 11 "id": "0183a4e7-5925-c6de-6af3-bf3514ce14c0", 12 "error":null, 13 } 14 } 15}
There are two possible errors:
-
data_incomplete
— There is not sufficient data available for the user in order to generate a D1C report. -
processing
— D1C report generation is still in progress.
Example voie-d1c report JSON payload with error:
1{ 2 "id":"9f82994c-774d-11eb-b1c7-13e87316bacb", 3 "reference_id":"VOIE12357", 4 "generated_at":"2020-11-29T08:33:41.525392Z", 5 "type":"voie", 6 "user":"8a5f613a-673a-4434-aeee-1a38b960b936", 7 "status":"generated", 8 "file_url":"www.company.com/voie_report.pdf", 9 "metadata":{ 10 "d1c_report":{ 11 "id": null, 12 "error":"data_incomplete" 13 } 14 } 15}