Payroll access, simplified

Connect to over 120M payroll and HRIS accounts, and make it easy for your customers to verify income and employment, switch direct deposit, or connect HR admin accounts to your app.

89.2%

coverage of Fortune 1000 companies

48

supported payroll providers

Frictionless user experience

User selects
their employer

We support the 48 most actively used payroll providers — offering 85% coverage of the US workforce.

User enters credentials

Citadel API handles security questions and 2FA right in the app, connecting to their payroll data in under 15 seconds.

Citadel API connects the account

Citadel API takes the final steps to access, organize, and deliver the data to you via API or directly to your Citadel API dashboard.

Accurate, consumer-permissioned data
to verify income and employment

Identity

Name
John K Doe
SSN
•••••6789
Email
jo@example.com
Birth
1992.03.03

Employer

Name
BetterName Inc.
Address
1 Hacker Way, Menlo
Park, CA, 94025
Phone
6503087300

Employment

Status
active
Start date
2018-01-01
End date
2019-08-24
Job type
Full-time
Job title
PR associate
Manager
Jenny McDouglas
Income
70000.00
Income unit
YEARLY
Frequency
M

Income

Year
2018
Salary
23,000
Bonus
1,000
Commission
24,000
Overtime
500
Other pay
700
Net pay
31,980
Gross pay
49,200

Pay Stubs

Pay date
2018.05.15
Start
2018.05.01
End of year
2018
End
2018.05.15
Basis of pay
Salary
Hours
40.00
Net pay
11500.32
Gross pay
13900.11
Regular
1900.11
Bonus
100.00
Commission
120
Overtime
0
Other pay
700.00

Bank Account

Year
2018
Salary
23,000
Bonus
1,000
Commission
24,000
Overtime
500
Other pay
700
Net pay
31,980
Gross pay
49,200

Payroll report

  1. {

  2.   "id": "5ca644606ab9e26113349291",

  3.   "report_date": "2020-02-14",

  4.   "start_date": "2019-01-01",

  5.   "end_date": "2020-09-19",

  6.   "status": "done",

  7.   "payroll_report": [

  8.     {

  9.       "id": "24d7e80942ce4ad58a93f70ce4115f5c",

  10.       "employee_id": "5ca65da36ab9e2123febfe24",

  11.       "employee_number": "1",

  12.       "first_name": "Eva",

  13.       "last_name": "Green",

  14.       "gross_earnings": "2500.00",

  15.       "net_pay": "1965.33",

  16.       "employee_taxes": "472.02",

  17.       "employer_taxes": "472.02",

  18.       "period_start": "2019-01-01",

  19.       "period_end": "2019-01-07",

  20.       "pay_date": "2019-01-06"

  21.     },

  22.     {

  23.       "id": "34d7e80942ce4ad58a93f70ce4115f5c",

  24.       "employee_id": "5ca65da36ab9e2123febfe22",

  25.       "employee_number": "2",

  26.       "first_name": "John",

  27.       "last_name": "Smith",

  28.       "gross_earnings": "1250.00",

  29.       "net_pay": "1045.14",

  30.       "employee_taxes": "137.85",

  31.       "employer_taxes": "90.50",

  32.       "period_start": "2019-01-08",

  33.       "period_end": "2019-01-15",

  34.       "pay_date": "2019-01-14"

  35.     },

  36.     {

  37.       "id": "44d7e80942ce4ad58a93f70ce4115f5c",

  38.       "employee_id": "5ca65da36ab9e2123febfe24",

  39.       "employee_number": "1",

  40.       "first_name": "Eva",

  41.       "last_name": "Green",

  42.       "gross_earnings": "2500.00",

  43.       "net_pay": "1965.33",

  44.       "employee_taxes": "472.02",

  45.       "employer_taxes": "472.02",

  46.       "period_start": "2019-01-16",

  47.       "period_end": "2019-01-23",

  48.       "pay_date": "2019-01-22"

  49.     },

  50.     {

  51.       "id": "54d7e80942ce4ad58a93f70ce4115f5c",

  52.       "employee_id": "5ca65da36ab9e2123febfe22",

  53.       "employee_number": "2",

  54.       "first_name": "John",

  55.       "last_name": "Smith",

  56.       "gross_earnings": "1250.00",

  57.       "net_pay": "1045.14",

  58.       "employee_taxes": "137.85",

  59.       "employer_taxes": "90.50",

  60.       "period_start": "2019-01-24",

  61.       "period_end": "2019-01-31",

  62.       "pay_date": "2019-01-30"

  63.     }

  64.   ],

  65.   "count": 4,

  66.   "next": null,

  67.   "previous": null,

  68.   "page_size": 100

  69. }

Directory

  1. {

  2.   "id": "5ca644606ab9e26113349291",

  3.   "status": "done",

  4.   "report_date": "2020-06-27",

  5.   "directory": [

  6.     {

  7.       "employee_id": "5ca65da36ab9e2123febfe22",

  8.       "employee_number": "1",

  9.       "first_name": "Jane",

  10.       "last_name": "Chief",

  11.       "dob": "1981-01-11",

  12.       "gender": "F",

  13.       "email_personal": "jane.email@example.com",

  14.       "email_work": "jane.ceo@example.com",

  15.       "phone_number": "2121111111",

  16.       "home_address": {

  17.         "city": "New York",

  18.         "state": "NY",

  19.         "zip": "10001",

  20.         "street": "111 1st Ave",

  21.         "country": "US"

  22.       },

  23.       "position_type": "F",

  24.       "start_date": "2011-01-11",

  25.       "end_date": null,

  26.       "title": "CEO",

  27.       "department": "Executive",

  28.       "work_address": {

  29.         "city": "New York",

  30.         "state": "NY",

  31.         "zip": "10001",

  32.         "street": "20 W 34th St",

  33.         "country": "US"

  34.       },

  35.       "manager_id": null,

  36.       "manager_first_name": null,

  37.       "manager_last_name": null,

  38.       "income": "750000.00",

  39.       "income_currency": "USD",

  40.       "income_unit": "YEARLY",

  41.       "pay_frequency": "SM",

  42.       "is_active": true

  43.     },

  44.     {

  45.       "employee_id": "5ca65da36ab9e2123febfe23",

  46.       "employee_number": "2",

  47.       "first_name": "Juan",

  48.       "last_name": "Perez",

  49.       "dob": "1982-02-22",

  50.       "gender": "M",

  51.       "email_personal": "juan.perez@example.com",

  52.       "email_work": "juan.cto@example.com",

  53.       "phone_number": "2122222222",

  54.       "home_address": {

  55.         "city": "New York",

  56.         "state": "NY",

  57.         "zip": "10002",

  58.         "street": "222 2nd Ave",

  59.         "country": "US"

  60.       },

  61.       "position_type": "F",

  62.       "start_date": "2012-02-22",

  63.       "end_date": null,

  64.       "title": "CTO",

  65.       "department": "Engineering",

  66.       "work_address": {

  67.         "city": "New York",

  68.         "state": "NY",

  69.         "zip": "10001",

  70.         "street": "20 W 34th St",

  71.         "country": "US"

  72.       },

  73.       "manager_id": "5ca65da36ab9e2123febfe56",

  74.       "manager_first_name": "Jane",

  75.       "manager_last_name": "Chief",

  76.       "income": "550000.00",

  77.       "income_currency": "USD",

  78.       "income_unit": "YEARLY",

  79.       "pay_frequency": "SM",

  80.       "is_active": true

  81.     },

  82.     {

  1.       "employee_id": "5ca65da36ab9e2123febfe24",

  2.       "employee_number": "3",

  3.       "first_name": "Joe",

  4.       "last_name": "Bloggs",

  5.       "dob": "1983-03-03",

  6.       "gender": "M",

  7.       "email_personal": "joe.bloggs@example.com",

  8.       "email_work": "joe.engineer@example.com",

  9.       "phone_number": "2123333333",

  10.       "home_address": {

  11.         "city": "Brooklyn",

  12.         "state": "NY",

  13.         "zip": "11211",

  14.         "street": "333 3rd St",

  15.         "country": "US"

  16.       },

  17.       "position_type": "F",

  18.       "start_date": "2013-03-03",

  19.       "end_date": null,

  20.       "title": "Principal Engineer",

  21.       "department": "Engineering",

  22.       "work_address": {

  23.         "city": "New York",

  24.         "state": "NY",

  25.         "zip": "10001",

  26.         "street": "20 W 34th St",

  27.         "country": "US"

  28.       },

  29.       "manager_id": "5ca65da36ab9e2123febfe56",

  30.       "manager_first_name": "Juan",

  31.       "manager_last_name": "Perez",

  32.       "income": "220000.00",

  33.       "income_currency": "USD",

  34.       "income_unit": "YEARLY",

  35.       "pay_frequency": "SM",

  36.       "is_active": true

  37.     },

  38.     {

  39.       "employee_id": "5ca35da36ab9e2123febfe23",

  40.       "employee_number": "4",

  41.       "first_name": "Fred",

  42.       "last_name": "Nerks",

  43.       "dob": "1984-04-04",

  44.       "gender": "M",

  45.       "email_personal": "fred.nerks@example.com",

  46.       "email_work": "fred.data_entry@example.com",

  47.       "phone_number": "2124444444",

  48.       "home_address": {

  49.         "city": "Brooklyn",

  50.         "state": "NY",

  51.         "zip": "11211",

  52.         "street": "444 4th St",

  53.         "country": "US"

  54.       },

  55.       "position_type": "C",

  56.       "start_date": "2014-04-04",

  57.       "end_date": null,

  58.       "title": "Data Entry Specialist",

  59.       "department": "Operations",

  60.       "work_address": {

  61.         "city": "New York",

  62.         "state": "NY",

  63.         "zip": "10001",

  64.         "street": "20 W 34th St",

  65.         "country": "US"

  66.       },

  67.       "manager_id": "7ca67da36ab9e2127febfe76",

  68.       "manager_first_name": "Bob",

  69.       "manager_last_name": "Boring",

  70.       "income": "850.00",

  71.       "income_currency": "USD",

  72.       "income_unit": "WEEKLY",

  73.       "pay_frequency": "W",

  74.       "is_active": true

  75.     },

  76.     {

  77.       "employee_id": "5ca65da56ab5e5125febfe25",

  1.       "employee_number": "5",

  2.       "first_name": "Sally",

  3.       "last_name": "McSales",

  4.       "dob": "1985-05-05",

  5.       "gender": "F",

  6.       "email_personal": "sally.mcsales@example.com",

  7.       "email_work": "sally.sales@example.com",

  8.       "phone_number": "2125555555",

  9.       "home_address": {

  10.         "city": "Hoboken",

  11.         "state": "NJ",

  12.         "zip": "07030",

  13.         "street": "555 5th St",

  14.         "country": "US"

  15.       },

  16.       "position_type": "P",

  17.       "start_date": "2015-05-05",

  18.       "end_date": "2020-01-01",

  19.       "title": "Sales Associate",

  20.       "department": "Sales",

  21.       "work_address": {

  22.         "city": "New York",

  23.         "state": "NY",

  24.         "zip": "10001",

  25.         "street": "20 W 34th St",

  26.         "country": "US"

  27.       },

  28.       "manager_id": "8ca68da36ab9e2128febfe86",

  29.       "manager_first_name": "Sam",

  30.       "manager_last_name": "Seller",

  31.       "income": "25.00",

  32.       "income_currency": "USD",

  33.       "income_unit": "HOURLY",

  34.       "pay_frequency": "BW",

  35.       "is_active": false

  36.     }

  37.   ],

  38.   "count": 5,

  39.   "next": null,

  40.   "previous": null,

  41.   "page_size": 100

  42. }

Developing with Citadel API is a breeze

We agonize over the right abstractions so your teams don’t need to stitch together disparate systems or spend months integrating payments functionality.

Documentation

Our documentation, like our API, is built by developers, for developers

API keys

Sign up for the Citadel Dashboard and get instant access to API keys.

  1. <html>

  2. <head>

  3.   <!-- Step 1 - add the Bridge library to your app with a script tag -->

  4.   <script src="https://cdn.citadelid.com/bridge.js"></script>

  5. </head>

  6. <body>

  7. <script>

  8.   // Step 2 - Call your back end to retrieve a bridge_token from citadel

  9.   const bridgeToken = <%= Value returned by API call to acquire bridge_token %>

  10.   // Step 3 - Initialize Bridge

  11.   const bridge = CitadelBridge.init({

  12.     bridgeToken: bridgeToken.bridge_token,

  13.     onLoad: function(){

  14.       // Optional, called when Bridge loads

  15.       console.log('Bridge loaded')

  16.     },

  17.     onSuccess: function(public_token, metadata){

  18.       console.log('success handler')

  19.       // Send the public_token to your server to exchange for an access_token

  20.       // and retrieve payroll data.

  21.       // The metadata object contains info about the Link.

  22.       console.log("token: ",public_token)

  23.       console.log("metadata: ", metadata)

  24.     },

  25.     onEvent: function(event_type, payload) {

  26.       // all events fire this function. event_type indicates what the event is,

  27.       // payload has additional information depending on the event.

  28.       console.log('event: ', event_type)

  29.       console.log('payload: ', payload)

  30.     },

  31.     onClose: function(){

  32.       // Optional, called when Bridge is closed by the user.

  33.       console.log('Bridge closed')

  34.     }

  35.   })

  36. </script>

  37. <!-- Normal page content -->

  38. <!-- Step 4 - Create a button or action that calls bridge.open() to Bridge -->

  39. <button type="button" id="button" onclick="bridge.open()">

  40.   Connect

  41. </button>

  42. </body>

  43. </html>

Citadel API is enterprise-ready
and FCRA compliant

Strict security standards

Citadel is SOC 2 Type 2 compliant. We’re currently undergoing ISO 27001 and D1C certifications.

Robust monitoring

We use Vanta, the leading SOC 2 Type 2 continuous monitoring software to stay compliant and secure.

End-to-end encryption

Data transmitted is kept safe using SSL standards. We use 256-bit AES encryption at rest and TLS 1.2+ in transit.

Explore how Citadel API can accelerate
your growth

Ready to get started?

Create an account instantly and start building. Or contact us directly for a custom package that works for your business.