REST endpoints for payroll in ServFlo: 9 operations with parameters, request and response fields, permissions and curl examples.
Base URL: https://app.servflo.ai/api. Every call needs Authorization: Bearer sfk_… (Authentication ); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id .
GET /organizations/{organizationId}/payroll/settings
The pay schedule (WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY and the anchor date weekly/bi-weekly periods repeat from), the overtime rules (weekly threshold, optional daily overtime and double time, California's seventh-day rule, multipliers, workweek start), non-job time types that are unpaid, the default payroll service and its company codes. saved is false while the defaults (bi-weekly, 40 h weekly overtime at 1.5×) apply. Read-only.
Permission payroll.read (Owner, Admin)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool payroll_getSettings (toolset team)
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/settings" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description scheduleenum One of WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY. anchorDatestring A day a pay period starts on (weekly and bi-weekly repeat from it). workweekStartDayinteger 0 = Sunday … 6 = Saturday. weeklyOvertimeMinutesinteger or null dailyOvertimeMinutesinteger or null dailyDoubleTimeMinutesinteger or null seventhDayRuleboolean overtimeMultipliernumber doubleTimeMultipliernumber unpaidActivitiesarray of enum defaultProviderenum One of GENERIC, GUSTO, ADP, PAYCHEX, QUICKBOOKS. adpCompanyCodestring or null paychexClientIdstring or null savedboolean False while the defaults apply.
PATCH /organizations/{organizationId}/payroll/settings
Changes the fields sent: pay schedule, anchor date, overtime rules (California: dailyOvertimeMinutes 480, dailyDoubleTimeMinutes 720, seventhDayRule true), multipliers, unpaid non-job time types, default payroll service, ADP company code, Paychex client id. Affects every open period's run (closed periods keep their snapshot). Returns the settings.
Permission payroll.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool payroll_updateSettings (toolset team)
Field Type Required Description scheduleenum No One of WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY. anchorDatestring No A first day of a pay period. workweekStartDayinteger No 0–6. weeklyOvertimeMinutesinteger or null No Weekly overtime threshold in minutes; null = none. 0–10080. dailyOvertimeMinutesinteger or null No Daily overtime threshold in minutes; null = none. 0–10080. dailyDoubleTimeMinutesinteger or null No Daily double-time threshold in minutes; null = none. 0–10080. seventhDayRuleboolean No overtimeMultipliernumber No 1–5. doubleTimeMultipliernumber No 1–5. unpaidActivitiesarray of enum No Up to 20 items. defaultProviderenum No One of GENERIC, GUSTO, ADP, PAYCHEX, QUICKBOOKS. adpCompanyCodestring or null No ADP "Co Code" for the paydata file. Up to 100 characters. paychexClientIdstring or null No Paychex Flex client id for the import file. Up to 100 characters.
curl -X PATCH "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/settings" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"schedule":"WEEKLY","anchorDate":"2026-11-03","workweekStartDay":1}'
200: the answer's fields Field Type Description scheduleenum One of WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY. anchorDatestring A day a pay period starts on (weekly and bi-weekly repeat from it). workweekStartDayinteger 0 = Sunday … 6 = Saturday. weeklyOvertimeMinutesinteger or null dailyOvertimeMinutesinteger or null dailyDoubleTimeMinutesinteger or null seventhDayRuleboolean overtimeMultipliernumber doubleTimeMultipliernumber unpaidActivitiesarray of enum defaultProviderenum One of GENERIC, GUSTO, ADP, PAYCHEX, QUICKBOOKS. adpCompanyCodestring or null paychexClientIdstring or null savedboolean False while the defaults apply.
GET /organizations/{organizationId}/payroll/people
Every technician and everyone who has tracked time here or has a payroll profile: pay type, hourly rate (a technician's is their technician pay rate), annual salary, overtime multiplier override and exemption, and their ids in each payroll service. Read-only.
Permission payroll.read (Owner, Admin)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool payroll_listPeople (toolset team)
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/people" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields An array of objects:
Field Type Description personKeystring The person's user id, or technician:<id> for a technician without an account. userIdstring or null technicianIdstring or null namestring activeboolean payTypeenum One of HOURLY, SALARY. hourlyPayCentsinteger or null annualSalaryCentsinteger or null overtimeMultipliernumber or null Overrides the business's; null = theirs. overtimeExemptboolean employeeNumberstring or null gustoEmployeeIdstring or null adpFileNumberstring or null paychexWorkerIdstring or null quickbooksEmployeeIdstring or null
PATCH /organizations/{organizationId}/payroll/people
Sets how one person is paid and who they are in the payroll services (fields sent only). Name them by technicianId (from GET /technicians) or userId (someone who tracked time; from GET /payroll/people). A technician's hourly rate is their technician pay rate, also used by job costing and the payroll hours report. Returns the person.
Permission payroll.manage (Owner, Admin)Risk write, OAuth scope servflo.write. Write: creates or changes records inside the business; nothing leaves it.MCP tool payroll_updatePerson (toolset team)
Field Type Required Description technicianIdstring or null No The technician (preferred when they have one). userIdstring or null No A ServFlo account that tracked time here. payTypeenum No One of HOURLY, SALARY. hourlyPayCentsinteger or null No 0–100000000. annualSalaryCentsinteger or null No 0–10000000000. overtimeMultipliernumber or null No Null = the business's multiplier. 1–5. overtimeExemptboolean No employeeNumberstring or null No Up to 100 characters. gustoEmployeeIdstring or null No Up to 100 characters. adpFileNumberstring or null No ADP "File #". Up to 100 characters. paychexWorkerIdstring or null No Up to 100 characters. quickbooksEmployeeIdstring or null No Up to 100 characters.
curl -X PATCH "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/people" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"technicianId":"technician_id","userId":"user_id","payType":"HOURLY"}'
200: the answer's fields Field Type Description personKeystring The person's user id, or technician:<id> for a technician without an account. userIdstring or null technicianIdstring or null namestring activeboolean payTypeenum One of HOURLY, SALARY. hourlyPayCentsinteger or null annualSalaryCentsinteger or null overtimeMultipliernumber or null Overrides the business's; null = theirs. overtimeExemptboolean employeeNumberstring or null gustoEmployeeIdstring or null adpFileNumberstring or null paychexWorkerIdstring or null quickbooksEmployeeIdstring or null
GET /organizations/{organizationId}/payroll/periods
The current pay period and the ones before it (newest first, count 1–52, default 12), each OPEN, CLOSED or REOPENED, from the pay schedule. Read-only. Next: GET /payroll/run?date=<start>.
Permission payroll.read (Owner, Admin)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool payroll_listPeriods (toolset team)
Name In Type Required Description countquery integer No 1–52. Default 12.
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/periods" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description todaystring scheduleenum One of WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY. itemsarray of object items[].startstring items[].endstring items[].stateenum One of OPEN, CLOSED, REOPENED. items[].currentboolean items[].closedAtstring (date-time) or null
GET /organizations/{organizationId}/payroll/run
Per person for the pay period holding date: regular, overtime and double-time hours (by the overtime rules, per workweek and day), paid and unpaid non-job time, unapproved and running entries, wages (hourly × multipliers, or salary ÷ periods per year), approved commissions earned in the period, tips on payments in the period (to the job's technician), reimbursable expenses, gross and total, with warnings. Each person carries their home business unit and byBusinessUnit subtotals the run per unit; businessUnitId keeps one unit's people. Live while open; the snapshot taken at closing once closed (changedSinceClose counts entries changed later). Read-only.
Permission payroll.read (Owner, Admin)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool payroll_getRun (toolset team)
Name In Type Required Description datequery string Yes Any day in the pay period (its first day is usual); the period comes from the pay schedule. businessUnitIdquery string No Only the people whose home business unit is this one (ids from GET /business-units), or "none" for people without a unit (office staff, generalists). Totals are then that unit's. Omit for everyone (a business without units never needs it). Up to 100 characters.
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/run?date=2026-11-03" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description periodobject period.startstring period.endstring scheduleenum One of WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY. timezonestring rulesobject rules.workweekStartDayinteger rules.weeklyOvertimeMinutesinteger or null rules.dailyOvertimeMinutesinteger or null rules.dailyDoubleTimeMinutesinteger or null rules.seventhDayRuleboolean rules.overtimeMultipliernumber rules.doubleTimeMultipliernumber rules.unpaidActivitiesarray of enum peoplearray of object people[].personKeystring people[].userIdstring or null people[].technicianIdstring or null people[].namestring people[].businessUnitIdstring or null The person's home business unit (their technician's; GET /business-units); null = none, also for people who are not technicians. people[].businessUnitNamestring or null people[].payTypeenum One of HOURLY, SALARY. people[].hourlyPayCentsinteger or null people[].annualSalaryCentsinteger or null people[].overtimeMultipliernumber people[].overtimeExemptboolean people[].paidMinutesinteger people[].regularMinutesinteger people[].overtimeMinutesinteger people[].doubleTimeMinutesinteger people[].paidNonJobMinutesinteger Paid non-job time (shop, training…), inside the hours. people[].unpaidNonJobMinutesinteger Non-job time of unpaid types, left out of the hours. people[].unapprovedEntriesinteger people[].unapprovedMinutesinteger people[].runningEntriesinteger people[].wagesCentsinteger or null Null when no rate or salary is set. people[].commissionCentsinteger Approved and paid commission lines earned in the period. people[].pendingCommissionCentsinteger Not in the gross until approved. people[].tipsCentsinteger people[].reimbursementCentsinteger people[].grossCentsinteger Wages + commissions + tips, before taxes and deductions. people[].totalCentsinteger Gross + reimbursements. people[].employeeNumberstring or null people[].gustoEmployeeIdstring or null people[].adpFileNumberstring or null people[].paychexWorkerIdstring or null people[].quickbooksEmployeeIdstring or null people[].warningsarray of string totalsobject totals.peopleinteger totals.paidMinutesinteger totals.regularMinutesinteger totals.overtimeMinutesinteger totals.doubleTimeMinutesinteger totals.paidNonJobMinutesinteger totals.wagesCentsinteger totals.commissionCentsinteger totals.tipsCentsinteger totals.reimbursementCentsinteger totals.grossCentsinteger totals.totalCentsinteger totals.unapprovedEntriesinteger totals.runningEntriesinteger unattributedTipsCentsinteger Tips on payments with no technician on the job and not taken by a technician (0 when filtered by unit). businessUnitIdstring or null The unit filter applied (an id or "none"); null = everyone. usesBusinessUnitsboolean The business has business units. byBusinessUnitarray of object The run grouped by home business unit: a subtotal per unit with people in it (by name), then "No unit". Empty for a business without units. byBusinessUnit[].peopleinteger byBusinessUnit[].paidMinutesinteger byBusinessUnit[].regularMinutesinteger byBusinessUnit[].overtimeMinutesinteger byBusinessUnit[].doubleTimeMinutesinteger byBusinessUnit[].wagesCentsinteger byBusinessUnit[].commissionCentsinteger byBusinessUnit[].tipsCentsinteger byBusinessUnit[].reimbursementCentsinteger byBusinessUnit[].grossCentsinteger byBusinessUnit[].totalCentsinteger byBusinessUnit[].idstring or null The unit; null = "No unit". byBusinessUnit[].namestring computedAtstring stateenum OPEN (never closed), CLOSED (locked), REOPENED. One of OPEN, CLOSED, REOPENED. sourceenum Snapshot: the figures frozen when it was closed. One of LIVE, SNAPSHOT.endedboolean The period is over (it can be closed). closedAtstring (date-time) or null closedByUserIdstring or null reopenedAtstring (date-time) or null reopenedByUserIdstring or null reopenReasonstring or null changedSinceCloseinteger Time entries in a closed period changed after closing (e.g. synced from a phone).
POST /organizations/{organizationId}/payroll/run/close
Locks timesheets: closes the pay period holding date once it has ended. Its time entries can no longer be added, edited, deleted, submitted, approved or rejected until it is reopened (409). Refused while a clock runs in it; with unapproved entries it is refused unless acknowledgeUnapproved is true. The run is frozen as the period's snapshot, which the exports then use. Emits payroll.closed. Returns the run.
Permission payroll.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool payroll_close (toolset team)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Field Type Required Description datestring Yes Any day in the pay period (its first day is usual); the period comes from the pay schedule. acknowledgeUnapprovedboolean No Close even though some entries are not approved.
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/run/close" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"date":"2026-11-03"}'
200: the answer's fields Field Type Description periodobject period.startstring period.endstring scheduleenum One of WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY. timezonestring rulesobject rules.workweekStartDayinteger rules.weeklyOvertimeMinutesinteger or null rules.dailyOvertimeMinutesinteger or null rules.dailyDoubleTimeMinutesinteger or null rules.seventhDayRuleboolean rules.overtimeMultipliernumber rules.doubleTimeMultipliernumber rules.unpaidActivitiesarray of enum peoplearray of object people[].personKeystring people[].userIdstring or null people[].technicianIdstring or null people[].namestring people[].businessUnitIdstring or null The person's home business unit (their technician's; GET /business-units); null = none, also for people who are not technicians. people[].businessUnitNamestring or null people[].payTypeenum One of HOURLY, SALARY. people[].hourlyPayCentsinteger or null people[].annualSalaryCentsinteger or null people[].overtimeMultipliernumber people[].overtimeExemptboolean people[].paidMinutesinteger people[].regularMinutesinteger people[].overtimeMinutesinteger people[].doubleTimeMinutesinteger people[].paidNonJobMinutesinteger Paid non-job time (shop, training…), inside the hours. people[].unpaidNonJobMinutesinteger Non-job time of unpaid types, left out of the hours. people[].unapprovedEntriesinteger people[].unapprovedMinutesinteger people[].runningEntriesinteger people[].wagesCentsinteger or null Null when no rate or salary is set. people[].commissionCentsinteger Approved and paid commission lines earned in the period. people[].pendingCommissionCentsinteger Not in the gross until approved. people[].tipsCentsinteger people[].reimbursementCentsinteger people[].grossCentsinteger Wages + commissions + tips, before taxes and deductions. people[].totalCentsinteger Gross + reimbursements. people[].employeeNumberstring or null people[].gustoEmployeeIdstring or null people[].adpFileNumberstring or null people[].paychexWorkerIdstring or null people[].quickbooksEmployeeIdstring or null people[].warningsarray of string totalsobject totals.peopleinteger totals.paidMinutesinteger totals.regularMinutesinteger totals.overtimeMinutesinteger totals.doubleTimeMinutesinteger totals.paidNonJobMinutesinteger totals.wagesCentsinteger totals.commissionCentsinteger totals.tipsCentsinteger totals.reimbursementCentsinteger totals.grossCentsinteger totals.totalCentsinteger totals.unapprovedEntriesinteger totals.runningEntriesinteger unattributedTipsCentsinteger Tips on payments with no technician on the job and not taken by a technician (0 when filtered by unit). businessUnitIdstring or null The unit filter applied (an id or "none"); null = everyone. usesBusinessUnitsboolean The business has business units. byBusinessUnitarray of object The run grouped by home business unit: a subtotal per unit with people in it (by name), then "No unit". Empty for a business without units. byBusinessUnit[].peopleinteger byBusinessUnit[].paidMinutesinteger byBusinessUnit[].regularMinutesinteger byBusinessUnit[].overtimeMinutesinteger byBusinessUnit[].doubleTimeMinutesinteger byBusinessUnit[].wagesCentsinteger byBusinessUnit[].commissionCentsinteger byBusinessUnit[].tipsCentsinteger byBusinessUnit[].reimbursementCentsinteger byBusinessUnit[].grossCentsinteger byBusinessUnit[].totalCentsinteger byBusinessUnit[].idstring or null The unit; null = "No unit". byBusinessUnit[].namestring computedAtstring stateenum OPEN (never closed), CLOSED (locked), REOPENED. One of OPEN, CLOSED, REOPENED. sourceenum Snapshot: the figures frozen when it was closed. One of LIVE, SNAPSHOT.endedboolean The period is over (it can be closed). closedAtstring (date-time) or null closedByUserIdstring or null reopenedAtstring (date-time) or null reopenedByUserIdstring or null reopenReasonstring or null changedSinceCloseinteger Time entries in a closed period changed after closing (e.g. synced from a phone).
POST /organizations/{organizationId}/payroll/run/reopen
Unlocks a closed pay period so its time can change again; the reason, who and when are kept (and in the activity log). The run is live again until it is closed again. Emits payroll.reopened. Returns the run.
Permission payroll.manage (Owner, Admin)Risk sensitive, OAuth scope servflo.sensitive. Sensitive: moves money, deletes, sends or shows something to a customer, or grants or revokes access.MCP tool payroll_reopen (toolset team)Approval Over MCP, this tool always waits for your approval in ServFlo. See Approvals .
Field Type Required Description datestring Yes Any day in the pay period (its first day is usual); the period comes from the pay schedule. reasonstring Yes Why it is reopened. Up to 2000 characters.
curl -X POST "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/run/reopen" \
-H "Authorization: Bearer $SERVFLO_API_KEY " \
-H "Content-Type: application/json" \
-d '{"date":"2026-11-03","reason":"string"}'
200: the answer's fields Field Type Description periodobject period.startstring period.endstring scheduleenum One of WEEKLY, BIWEEKLY, SEMIMONTHLY, MONTHLY. timezonestring rulesobject rules.workweekStartDayinteger rules.weeklyOvertimeMinutesinteger or null rules.dailyOvertimeMinutesinteger or null rules.dailyDoubleTimeMinutesinteger or null rules.seventhDayRuleboolean rules.overtimeMultipliernumber rules.doubleTimeMultipliernumber rules.unpaidActivitiesarray of enum peoplearray of object people[].personKeystring people[].userIdstring or null people[].technicianIdstring or null people[].namestring people[].businessUnitIdstring or null The person's home business unit (their technician's; GET /business-units); null = none, also for people who are not technicians. people[].businessUnitNamestring or null people[].payTypeenum One of HOURLY, SALARY. people[].hourlyPayCentsinteger or null people[].annualSalaryCentsinteger or null people[].overtimeMultipliernumber people[].overtimeExemptboolean people[].paidMinutesinteger people[].regularMinutesinteger people[].overtimeMinutesinteger people[].doubleTimeMinutesinteger people[].paidNonJobMinutesinteger Paid non-job time (shop, training…), inside the hours. people[].unpaidNonJobMinutesinteger Non-job time of unpaid types, left out of the hours. people[].unapprovedEntriesinteger people[].unapprovedMinutesinteger people[].runningEntriesinteger people[].wagesCentsinteger or null Null when no rate or salary is set. people[].commissionCentsinteger Approved and paid commission lines earned in the period. people[].pendingCommissionCentsinteger Not in the gross until approved. people[].tipsCentsinteger people[].reimbursementCentsinteger people[].grossCentsinteger Wages + commissions + tips, before taxes and deductions. people[].totalCentsinteger Gross + reimbursements. people[].employeeNumberstring or null people[].gustoEmployeeIdstring or null people[].adpFileNumberstring or null people[].paychexWorkerIdstring or null people[].quickbooksEmployeeIdstring or null people[].warningsarray of string totalsobject totals.peopleinteger totals.paidMinutesinteger totals.regularMinutesinteger totals.overtimeMinutesinteger totals.doubleTimeMinutesinteger totals.paidNonJobMinutesinteger totals.wagesCentsinteger totals.commissionCentsinteger totals.tipsCentsinteger totals.reimbursementCentsinteger totals.grossCentsinteger totals.totalCentsinteger totals.unapprovedEntriesinteger totals.runningEntriesinteger unattributedTipsCentsinteger Tips on payments with no technician on the job and not taken by a technician (0 when filtered by unit). businessUnitIdstring or null The unit filter applied (an id or "none"); null = everyone. usesBusinessUnitsboolean The business has business units. byBusinessUnitarray of object The run grouped by home business unit: a subtotal per unit with people in it (by name), then "No unit". Empty for a business without units. byBusinessUnit[].peopleinteger byBusinessUnit[].paidMinutesinteger byBusinessUnit[].regularMinutesinteger byBusinessUnit[].overtimeMinutesinteger byBusinessUnit[].doubleTimeMinutesinteger byBusinessUnit[].wagesCentsinteger byBusinessUnit[].commissionCentsinteger byBusinessUnit[].tipsCentsinteger byBusinessUnit[].reimbursementCentsinteger byBusinessUnit[].grossCentsinteger byBusinessUnit[].totalCentsinteger byBusinessUnit[].idstring or null The unit; null = "No unit". byBusinessUnit[].namestring computedAtstring stateenum OPEN (never closed), CLOSED (locked), REOPENED. One of OPEN, CLOSED, REOPENED. sourceenum Snapshot: the figures frozen when it was closed. One of LIVE, SNAPSHOT.endedboolean The period is over (it can be closed). closedAtstring (date-time) or null closedByUserIdstring or null reopenedAtstring (date-time) or null reopenedByUserIdstring or null reopenReasonstring or null changedSinceCloseinteger Time entries in a closed period changed after closing (e.g. synced from a phone).
GET /organizations/{organizationId}/payroll/run/export
The pay period's payroll as a CSV for a payroll service: GUSTO (Import hours: hours and earnings per employee), ADP (Workforce Now / RUN paydata import), PAYCHEX (Paychex Flex import, one row per pay component), QUICKBOOKS, or GENERIC (every figure). Default: the business's default service. Uses the closed snapshot when the period is closed. missingIds names people without that service's id (their id cell is blank). Everyone unless businessUnitId limits it to one unit's people. Read-only; contains pay data.
Permission payroll.read (Owner, Admin)Risk read, OAuth scope servflo.read. Read: reads only.MCP tool payroll_export (toolset team)
Name In Type Required Description datequery string Yes Any day in the pay period (its first day is usual); the period comes from the pay schedule. providerquery enum No One of GENERIC, GUSTO, ADP, PAYCHEX, QUICKBOOKS. businessUnitIdquery string No Only the people whose home business unit is this one (ids from GET /business-units), or "none" for people without a unit (office staff, generalists). Totals are then that unit's. Omit for everyone (a business without units never needs it). Up to 100 characters.
curl "https://app.servflo.ai/api/organizations/ $ORGANIZATION_ID /payroll/run/export?date=2026-11-03" \
-H "Authorization: Bearer $SERVFLO_API_KEY "
200: the answer's fields Field Type Description fileNamestring csvstring countinteger missingIdsarray of string providerenum One of GENERIC, GUSTO, ADP, PAYCHEX, QUICKBOOKS. stateenum One of OPEN, CLOSED, REOPENED.