Jobs
Jobs are customer requests for accounting help, listed on a job board that every provider firm (accounting/auditing firm) can browse. Provider firms respond with offers; when the customer accepts an offer, an APPROVED contract is created between the firm and the customer in the same transaction, granting the firm access to the customer’s books through the normal contract-based access model.
Job types:
FULL_SERVICE_ACCOUNTING— a continuous engagement; the resulting contract has no end date.ONE_OFF_ASSISTANCE— a one-time task; offers must propose an end date, which becomes the contract’s end date.
Lifecycle: a job is OPEN until the customer accepts an offer (ACCEPTED) or cancels it (CANCELLED). Offers are PENDING until accepted, rejected by the customer, or withdrawn by the firm. Accepting one offer automatically rejects the job’s other pending offers, and cancelling a job rejects all of its pending offers.
Authorization
The two sides of the marketplace are gated differently:
- Customer side — creating a job, cancelling it, and accepting/rejecting offers require an active client-account owner (role
CA) on the customer account. Listing jobs and offers requires normal access to the client account. - Provider side — browsing open jobs, downloading job reports, creating offers, and withdrawing them require the caller to be a direct, active member of the provider firm (
provider_client_account_id), and the firm’s organization must be a registered accounting/auditing business. Contract-derived access does not count, since bidding firms have no contract with the customer yet.
In the marketplace scope, only OPEN jobs are visible and the only expandable relation is client — a deliberately narrow identity block (name, organization number, industry code, city, municipality, employee count, plus two flags indicating whether books data exists for the current/previous year). Requesting offers or contract in this scope is rejected, since that would expose competing bids. While a job is OPEN, provider members may also download the customer’s general ledger and trial balance reports to scope their offer; this access ends as soon as the job leaves OPEN.
Endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /jobs | List jobs — customer scope, or the open-jobs marketplace when provider_client_account_id is given |
| POST | /jobs | Create a job (client-account owners only) |
| PATCH | /jobs/{id} | Cancel a job ({"status": "CANCELLED"}; the only supported update) |
| GET | /jobs/{id}/reports | Download the posting customer’s general ledger or trial balance (provider scope, OPEN jobs only) |
| GET | /job-offers | List offers — by job_id (customer scope) or provider_client_account_id (firm’s own offers) |
| POST | /job-offers | Create an offer on an open job (provider-firm members only) |
| PATCH | /job-offers/{id} | Status transition: ACCEPTED / REJECTED (client-account owners) or WITHDRAWN (firm members) |
GET /jobs query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
| provider_client_account_id | integer | No | Switches to the marketplace scope: only OPEN jobs are visible (the firm’s own account’s jobs excluded), and with is restricted to client. Caller must be a direct, active member of this provider firm |
| client_account_id | integer/string | No | Customer scope: filter by client account ID(s), separated by comma, semicolon, or space. Defaults to all eligible client accounts |
| status | string | No | Filter by job status: OPEN, ACCEPTED, or CANCELLED |
| with | string | No | Include relations: client (narrow identity block, both scopes), offers and contract (customer scope only) |
| page / per_page | integer | No | Pagination (default: page 1, 100 per page) |
GET /jobs/{id}/reports query parameters
Format is chosen by the Accept header: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet (xlsx) or application/pdf.
| Parameter | Type | Required | Description |
|---|---|---|---|
| provider_client_account_id | integer | Yes | The provider firm the caller acts for (direct membership required) |
| report_type | string | Yes | GENERAL_LEDGER or TRIAL_BALANCE |
| year | integer | Yes | Calendar year; only the current or previous year is allowed |
Job attributes
| Attribute | Type | Description |
|---|---|---|
| id | integer | The unique identifier of the job |
| created_at | datetime | When the job was created |
| created_by_id | integer | The ID of the user who created the job |
| client_account_id | integer | The customer client account requesting help |
| job_type | string | FULL_SERVICE_ACCOUNTING or ONE_OFF_ASSISTANCE |
| description | string | What the customer needs help with (max 2000 chars) |
| status | string | OPEN, ACCEPTED, or CANCELLED |
| accepted_offer_id | integer | The accepted offer, set when the job is accepted |
| contract_id | integer | The contract created by acceptance |
The client relation adds the company identity block described above, including the has_current_year_data / has_previous_year_data flags.
Job offer attributes
| Attribute | Type | Description |
|---|---|---|
| id | integer | The unique identifier of the offer |
| created_at | datetime | When the offer was created |
| created_by_id | integer | The ID of the user who created the offer |
| job_id | integer | The job the offer responds to |
| provider_client_account_id | integer | The offering provider firm |
| message | string | The firm’s message to the customer (max 2000 chars) |
| price | decimal | Optional indicative price |
| currency_code | string | Currency of price; defaults to the firm’s accounting currency |
| proposed_start_date | date | Proposed engagement start (becomes the contract start date) |
| proposed_end_date | date | Required for ONE_OFF_ASSISTANCE (becomes the contract end date); ignored for full service |
| status | string | PENDING, ACCEPTED, REJECTED, or WITHDRAWN |
GET /job-offers supports with=provider_client_account (firm id + display name, included by default) and with=job (the marketplace-safe job projection, for the firm’s own offer list).
Acceptance semantics
PATCH /job-offers/{id} with {"status": "ACCEPTED"}, performed by a client-account owner, atomically:
- Marks the offer
ACCEPTEDand the job’s otherPENDINGoffersREJECTED. - Marks the job
ACCEPTEDand recordsaccepted_offer_id. - Creates a contract with
service_provided=ACCOUNTING,approval_status=APPROVED(the acceptance is the approval;approved_by_idis the accepting owner),start_datefrom the offer, andend_datefrom the offer for one-off jobs /nullfor full service.
Email notifications are sent to the customer’s owners when an offer is received, and to the provider firm’s members when their offer is accepted (notification types JOB_OFFER_RECEIVED and JOB_OFFER_ACCEPTED, configurable per user via notification settings).