docs
/
AppEngine API

BusinessMade

The endpoints behind BusinessMade — people, time, pay, benefits, bills and the ledger.

These are the endpoints behind BusinessMade: hiring through offboarding, timesheets through payroll, and a double-entry ledger underneath it. Several dozen controllers, several hundred routes, and 57 bm_* datatypes.

This page is the API surface. For what each area does and how to use it, read the product docs:

The endpoint prefix is `/business-made/*`

Every route on this page lives under that prefix, including the ones the product surfaces as Operations, HR, Payroll, Time and Books.

Setup and seeding

Start here on a new tenant — nothing else works well against an empty chart of accounts.

GET/business-made/setup/statusJWT
POST/business-made/setup/allJWT
POST/business-made/setup/chart-of-accountsJWT
POST/business-made/setup/locationsJWT
POST/business-made/setup/vendorsJWT
POST/business-made/setup/product-attributesJWT
POST/business-made/setup/workflowsJWT
POST/business-made/setup/scenario/applyJWT
POST/business-made/setup/module/applyJWT

Scenarios and modules are the templated paths — apply an industry profile rather than configuring every piece by hand.

Employees

GET/business-made/employeesJWT
POST/business-made/employeesJWT
POST/business-made/employees/updateJWT
POST/business-made/employees/:id/statusJWT
POST/business-made/employees/:id/terminateJWT

Filtered views: /department/:department, /location/:location, /status/active, /supervisor/:supervisorId, /skill/:skillName.

Per-employee records — time off, reviews, training, skills and onboarding tasks — hang off /business-made/employees/:id/….

Reports: /reports/headcount, /reports/anniversaries, /reports/birthdays, and /employees/training/expired.

Updates are POST to a fixed path

Most BusinessMade controllers update through POST /business-made/<area>/update with the id in the body, rather than PUT /…/:id. The pattern is consistent across employees, benefits, payroll, timesheets, schedules and more.

Timesheets and time clock

POST/business-made/timesheets/clock-in/:employeeIdJWT
POST/business-made/timesheets/clock-out/:employeeIdJWT
GET/business-made/timesheets/clock-in/:employeeId/activeJWT
GET/business-made/timesheets/reports/on-the-clockJWT

Approval flow — POST /business-made/timesheets/:id/<action> for submit, approve, reject, reopen. Entries are managed at /:id/entries[/:entryId].

Reports: /reports/summary/:employeeId, /reports/team-status, /reports/missing.

/reports/missing is the one that matters before running payroll.

Payroll

Two controllers — payroll.controller (34 routes) and payroll-config.controller (50) — sharing the /business-made/payroll prefix.

Runs

POST/business-made/payroll/runsJWT
POST/business-made/payroll/runs/:id/calculateJWT
POST/business-made/payroll/runs/:id/parallel-checkJWT
POST/business-made/payroll/runs/:id/approveJWT
POST/business-made/payroll/runs/:id/processJWT
POST/business-made/payroll/runs/:id/cancelJWT

The sequence is create → calculate → approve → process. parallel-check re-computes independently and compares — a self-check before money moves.

GET/business-made/payroll/reports/blockersJWT
GET/business-made/payroll/reports/upcoming-runJWT

Call blockers before calculate: it lists what would make the run wrong — missing timesheets, unverified bank accounts, incomplete tax setup.

Pay stubs

GET/business-made/payroll/stubsJWT
GET/business-made/payroll/stubs/employee/:employeeIdJWT
GET/business-made/payroll/stubs/run/:payrollRunIdJWT

Employee payroll profiles

GET/business-made/payroll/profiles/employee/:employeeIdJWT
POST/business-made/payroll/profilesJWT
POST/business-made/payroll/profiles/employee/:employeeId/deductionsJWT
POST/business-made/payroll/profiles/employee/:employeeId/bank-accountsJWT
POST/business-made/payroll/profiles/employee/:employeeId/bank-accounts/:accountId/verifyJWT

Direct deposit requires a verified account; adding one is not enough.

Employer tax setup

GET/business-made/payroll/employer-setupJWT
POST/business-made/payroll/employer-setupJWT
GET/business-made/payroll/employer-setup/readinessJWT

Reports

GET/business-made/payroll/reports/summary/:yearJWT
GET/business-made/payroll/reports/w2/:employeeId/:yearJWT

Configuration — earning types, deduction types, tax rules, pay periods and schedules — lives in payroll-config.controller. Datatypes: bm_earning_type, bm_deduction_type, bm_tax_rule, bm_pay_period, bm_payroll_schedule, bm_payroll_run, bm_pay_stub, bm_payroll_profile, bm_tax_form.

Government e-filing

Owner, ConfigAdmin or RootAdmin only (anyone else gets 403 EFILE_ADMIN_ONLY). For the how-to, see Contractors, taxes, forms and filings and Set up government filing.

GET/business-made/efile/connections/:programJWT
PUT/business-made/efile/connections/:programJWT
POST/business-made/efile/connections/:program/testJWT
GET/business-made/efile/submissionsJWT
GET/business-made/efile/submissions/:idJWT
GET/business-made/efile/submissions/:id/files/:kindJWT

IRS API connections, one per program — iris (1099 filing), tinm (TIN Matching) or eservices. The private key is write-only and never returned; a connection starts on the IRS test system, and production is refused until the owner turns on allowProduction. test requests a token and reports the stage that failed with the IRS error code. Every transmission is recorded as a submission; files/:kind downloads its payload or ack.

POST/business-made/efile/iris/:taxYear/prepareJWT
POST/business-made/efile/iris/submissions/:id/transmitJWT
POST/business-made/efile/iris/submissions/:id/refreshJWT
GET/business-made/efile/iris/submissions/:id/ackJWT

IRIS 1099 e-filing (1099-NEC or 1099-MISC), against the IRS test (ATS) system. prepare builds and validates only; transmit sends it; refresh asks the IRS for the acknowledgement now (a queue job also polls). No response carries the transmission XML — it holds payee TINs.

POST/business-made/efile/tinm/checkJWT
POST/business-made/efile/tinm/bulkJWT
GET/business-made/efile/tinm/submissions/:id/resultsJWT

IRS TIN Matching for 1099 payees: interactive for up to 25 payees, bulk for up to 100,000 (or scope: "all_1099_payees"). Each answer is written on the payee record as tinMatch.

POST/business-made/payroll/filings/efw2/:taxYear?regenerate=JWT
GET/business-made/payroll/filings/efw2/:taxYear/download?submissionId=JWT

The SSA EFW2 W-2 wage file, built from the year's W-2s for upload to Business Services Online. It needs the BSO User ID in the employer setup (EFW2_BSO_USER_ID_MISSING otherwise) and is recorded as an e-file submission.

Full specifications: Government e-filing.

Books

Double-entry accounting, split across a reporting controller and a posting controller that share /business-made/books.

Accounts and journals

GET/business-made/books/accountsJWT
POST/business-made/books/accountsJWT
GET/business-made/books/journalsJWT
POST/business-made/books/journalsJWT
POST/business-made/books/journals/:id/postJWT
GET/business-made/books/ledger/:accountCodeJWT

A journal is created in draft and only affects the ledger once posted.

Reports

GET/business-made/books/overviewJWT
GET/business-made/books/reports/plJWT
GET/business-made/books/reports/balance-sheetJWT
GET/business-made/books/reports/cash-flowJWT
GET/business-made/books/reports/trial-balanceJWT
GET/business-made/books/reports/by-locationJWT
GET/business-made/books/reports/close-checkJWT
GET/business-made/books/arJWT

P&L and balance sheet also render as PDF: /reports/pl/pdf, /reports/balance-sheet/pdf.

Automatic posting

Commerce activity posts to the ledger through a configurable account map, so a sale in the storefront becomes journal entries without manual work.

GET/business-made/books/account-mapJWT
POST/business-made/books/account-mapJWT
POST/business-made/books/post/saleJWT
POST/business-made/books/post/refundJWT
POST/business-made/books/post/invoiceJWT
POST/business-made/books/post/paymentJWT

Repair tools, for when the ledger and the source records disagree:

GET/business-made/books/balance-driftJWT
POST/business-made/books/balance-drift/repairJWT
POST/business-made/books/backfillJWT
POST/business-made/books/backfill-cogsJWT
POST/business-made/books/resume-postingsJWT

balance-drift detects the divergence; repair corrects it. resume-postings re-runs postings that failed and were parked.

Datatypes: ledger_account, ledger_entry, journal_entry.

Period close

POST/business-made/period-close/startJWT
POST/business-made/period-close/:id/checklist/:itemIdJWT
POST/business-made/period-close/:id/lockJWT
POST/business-made/period-close/:id/reopenJWT
GET/business-made/budgets/:id/varianceJWT

Checklist-driven. lock freezes the period; reopen unfreezes it. Run books/reports/close-check first.

Bills and vendors

GET/business-made/billsJWT

Accounts payable — bills, payments and vendors (bm_bill, bm_bill_payment, bm_vendor). Receivables live on the commerce side, under invoices.

Recruitment

GET/business-made/recruitment/boardJWT
GET/business-made/recruitment/jobsJWT
GET/business-made/recruitment/jobs/:idJWT

Job postings, applicants, interviews and offers (bm_job_posting, bm_applicant, bm_interview, bm_offer). Feeds onboarding on acceptance.

Onboarding and offboarding

POST/business-made/employees/:id/onboarding/startJWT
POST/business-made/employees/:id/onboarding/:taskId/completeJWT

Offboarding (21 routes) covers exit checklists and exit interviews — bm_offboarding, bm_exit_interview.

Leave

29 routes covering leave types, policies, balances and requests — bm_leave_type, bm_leave_policy, bm_leave_balance, bm_leave_request.

Simple time-off requests can also go through POST /business-made/employees/:id/time-off/request, which is the same data reached from the employee record.

Benefits

GET/business-made/benefits/plansJWT
POST/business-made/benefits/plans/:id/open-enrollmentJWT
POST/business-made/benefits/enrollmentsJWT
POST/business-made/benefits/enrollments/:id/activateJWT
POST/business-made/benefits/enrollments/:id/terminateJWT
POST/business-made/benefits/enrollments/:id/waiveJWT
POST/business-made/benefits/enrollments/:id/dependentsJWT
POST/business-made/benefits/enrollments/:id/beneficiariesJWT
GET/business-made/benefits/metricsJWT

Waiving is a recorded decision, not an absence of one — which is what open-enrollment compliance needs.

Performance and learning

Performance (31 routes) — goals, reviews and PIPs (bm_goal, bm_performance_review, bm_pip).

Learning (32 routes) — courses, certifications, learning paths and enrollments (bm_course, bm_certification, bm_learning_path, bm_course_enrollment).

Compensation

28 routes — salary grades, compensation changes and bonuses (bm_salary_grade, bm_compensation_change, bm_bonus).

Organization

32 routes — departments, positions and org charts (bm_department, bm_position, bm_org_chart).

Documents and policies

31 routes — employee documents, policies and acknowledgements (bm_employee_document, bm_policy, bm_policy_acknowledgement). Acknowledgements are the audit trail that someone read the handbook.

Workforce readiness

GET/business-made/readiness/overviewJWT
GET/business-made/readiness/employee/:employeeIdJWT
GET/business-made/readiness/check/:employeeId?gate=JWT
GET/business-made/readiness/rulesJWT
POST/business-made/readiness/rulesJWT

Requirement rules (bm_requirement_rule) say what a person must have — a certification, a signed policy, a completed training — and what happens where it is missing. Each rule sets an effect per gate: scheduler, clockIn, pos, kitchenStation, payroll and access. kitchenStation is labelled Work station: it covers moving a ticket at any station on a work line — prep line, assembly, service bay — not only a kitchen; the key keeps its name so stored rules still apply. access withholds role and group grants at sign-in until the requirement is met. check returns the answer a gate would give, for screens that want to show it first.

Schedules

GET/business-made/schedulesJWT

Shift scheduling (bm_schedule), 22 routes. Pairs with the time clock: scheduled versus actual is what /timesheets/reports/team-status compares.

Work orders

POST/business-made/work-ordersJWT
POST/business-made/work-orders/:id/assignJWT
POST/business-made/work-orders/:id/itemsJWT
POST/business-made/work-orders/:id/time-entriesJWT
POST/business-made/work-orders/:id/materialsJWT
GET/business-made/work-orders/customer/:customerIdJWT

Field service — labor and materials on a job, linked to a customer (bm_work_order).

Employee self-service

Employees reach their own data through StaffPortalModule rather than these controllers:

GET/staff-portal/dashboardJWT
GET/staff-portal/landingJWT
GET/staff-portal/time-offJWT

Profile, pay method, schedule, timesheets, payslips and W-2 — scoped to the signed-in employee.