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:

  1. Marks the offer ACCEPTED and the job’s other PENDING offers REJECTED.
  2. Marks the job ACCEPTED and records accepted_offer_id.
  3. Creates a contract with service_provided=ACCOUNTING, approval_status=APPROVED (the acceptance is the approval; approved_by_id is the accepting owner), start_date from the offer, and end_date from the offer for one-off jobs / null for 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).