> ## Documentation Index
> Fetch the complete documentation index at: https://developers.getbreezyapp.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Read the recorded financials of one job

> The same complete representation as collection pages, using the job ID. Reads saved costs without populating or synchronizing them from timekeeping, wages, invoices or pricebook data.



## OpenAPI

````yaml /openapi.json get /job-financials/{id}
openapi: 3.0.3
info:
  title: Breezy Public API
  version: 1.0.0
  description: >-
    Read customers, team members, jobs, visits, assignments, installed
    equipment, captured form responses, time entries, configured-period
    timesheets, business reference catalogs, job leads, estimates, invoices,
    payments, refunds, recorded job financials, saved sold/earned credits, and
    financial summaries for your company. Read the operational schedule and
    create, edit, cancel and assign visits. Existing API keys grant company-wide
    reads and scheduling writes. Customer notifications require an explicit
    request per operation. Amounts are integer USD cents. Reads return current
    corrected records, with cursor pagination for collecting results.


    Read the [Breezy FSM guides](https://developers.getbreezyapp.com) for
    authentication, pagination, refresh limits, and business measures. All reads
    use latest corrected company records; cursors do not create a snapshot or a
    complete change feed.
servers:
  - url: https://api.getbreezyapp.com/v1
    description: Breezy FSM production API
security:
  - apiKey: []
tags:
  - name: Scheduling
  - name: Company
  - name: Invoices
  - name: Payments
  - name: Refunds
  - name: Reports
  - name: TeamMembers
  - name: Accounts
  - name: Contacts
  - name: Locations
  - name: Jobs
  - name: JobAppointments
  - name: JobAssignments
  - name: BusinessUnits
  - name: JobTypes
  - name: JobClasses
  - name: JobLifecycles
  - name: LeadSources
  - name: Tags
  - name: Estimates
  - name: JobLeads
  - name: Equipment
  - name: FormResponses
  - name: TimeEntries
  - name: Timesheets
  - name: JobFinancials
  - name: RevenueAttributions
externalDocs:
  description: Breezy FSM reporting guides and API reference
  url: https://developers.getbreezyapp.com
paths:
  /job-financials/{id}:
    get:
      tags:
        - JobFinancials
      summary: Read the recorded financials of one job
      description: >-
        The same complete representation as collection pages, using the job ID.
        Reads saved costs without populating or synchronizing them from
        timekeeping, wages, invoices or pricebook data.
      operationId: getJobFinancials
      parameters:
        - schema:
            type: string
            format: uuid
          required: true
          name: id
          in: path
      responses:
        '200':
          description: Successful read. Clients ignore unrecognized response fields.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/JobFinancialsResponse'
              example:
                data:
                  id: 11111111-1111-4111-8111-000000000501
                  number: '200'
                  account:
                    id: 11111111-1111-4111-8111-000000000101
                    name: Example Household
                  location_id: 11111111-1111-4111-8111-000000001107
                  business_unit:
                    id: 11111111-1111-4111-8111-000000000201
                    name: Service
                  job_type:
                    id: 11111111-1111-4111-8111-000000000301
                    name: HVAC Service
                  job_class: SERVICE
                  participants:
                    - id: 11111111-1111-4111-8111-000000000401
                      name: Alex Example
                  created_at: '2026-08-19T16:00:00Z'
                  report_date: '2026-08-20'
                  report_date_basis: INVOICE_ISSUED
                  costing:
                    enabled: true
                    tracking_status: TRACKED
                    verification_status: VERIFIED
                    job_type_included: true
                  currency: USD
                  totals:
                    revenue_cents: 130000
                    labor_cost_cents: 6000
                    parts_cost_cents: 24000
                    equipment_cost_cents: 0
                    misc_cost_cents: 0
                    other_cost_cents: 0
                    total_cost_cents: 30000
                    gross_profit_cents: 100000
                    gross_margin: 0.7692
                  invoices:
                    - id: 11111111-1111-4111-8111-000000000601
                      number: '1001'
                      status: OPEN
                      issued_at: '2026-08-20T16:00:00Z'
                      subtotal_cents: 100000
                    - id: 11111111-1111-4111-8111-000000000602
                      number: '1002'
                      status: PAID
                      issued_at: '2026-09-02T16:00:00Z'
                      subtotal_cents: 30000
                  cost_entries:
                    - id: 11111111-1111-4111-8111-000000001501
                      category: labor
                      source: manual
                      name: Recorded service labor
                      quantity: 120
                      quantity_unit: minute
                      unit_cost_cents: 3000
                      total_cents: 6000
                      labor_activity: On Site
                      misc_category: null
                      pricebook_item_id: null
                      created_at: '2026-09-08T19:00:00Z'
                      updated_at: '2026-09-08T19:00:00Z'
                    - id: 11111111-1111-4111-8111-000000001502
                      category: parts
                      source: invoice
                      name: Recorded replacement part
                      quantity: 2
                      quantity_unit: unit
                      unit_cost_cents: 12000
                      total_cents: 24000
                      labor_activity: null
                      misc_category: null
                      pricebook_item_id: null
                      created_at: '2026-09-08T19:00:00Z'
                      updated_at: '2026-09-08T19:00:00Z'
                meta:
                  request_id: 11111111-1111-4111-8111-000000009999
                  generated_at: '2026-09-08T19:00:00Z'
                  timezone: America/Los_Angeles
        '400':
          description: >-
            Malformed input, unknown query parameter, unsupported combination or
            invalid cursor.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: INVALID_REQUEST
                  message: end_date must be later than start_date
                  request_id: example-request
                  details: []
        '401':
          description: Missing, invalid or expired key, or invalid linked identity.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
            WWW-Authenticate:
              schema:
                type: string
              example: Bearer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: UNAUTHENTICATED
                  message: A valid API key is required
                  request_id: example-request
                  details: []
        '404':
          description: >-
            Missing resource or resource outside the authenticated company. Same
            response for both.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: NOT_FOUND
                  message: Resource not found
                  request_id: example-request
                  details: []
        '405':
          description: >-
            Unsupported methods return 405. See the operation list for supported
            scheduling writes.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
            Allow:
              schema:
                type: string
              example: GET, HEAD, OPTIONS
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: METHOD_NOT_ALLOWED
                  message: This resource supports GET
                  request_id: example-request
                  details: []
        '409':
          description: >-
            Stale revision, idempotency-key reuse with different input,
            scheduling conflict, or unsupported stored recurrence. Inspect
            error.code.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: STALE_REVISION
                  message: The visit changed; read it again before editing
                  request_id: example-request
                  details: []
        '413':
          description: Request body is too large.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: INVALID_REQUEST
                  message: Request body exceeds 64 KB
                  request_id: example-request
                  details: []
        '429':
          description: Company request budget exhausted; retry after the indicated delay.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
            Retry-After:
              schema:
                type: integer
                minimum: 1
              description: Seconds before retrying.
              example: 30
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: RATE_LIMITED
                  message: Request limit exceeded
                  request_id: example-request
                  details: []
        '500':
          description: >-
            Unexpected failure. Share request_id with support; no stack or
            provider secrets in response.
          headers:
            Cache-Control:
              schema:
                type: string
              example: private, no-store
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: INTERNAL_ERROR
                  message: Unable to complete request
                  request_id: example-request
                  details: []
      security:
        - apiKey: []
components:
  schemas:
    JobFinancialsResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/JobFinancials'
        meta:
          $ref: '#/components/schemas/ResponseMeta'
      required:
        - data
        - meta
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: string
              enum:
                - INVALID_REQUEST
                - INVALID_CURSOR
                - SCHEDULE_TOO_LARGE
                - INVALID_SCHEDULE_EVENT
                - SCHEDULE_CONFLICT
                - STALE_REVISION
                - IDEMPOTENCY_CONFLICT
                - UNAUTHENTICATED
                - NOT_FOUND
                - METHOD_NOT_ALLOWED
                - RATE_LIMITED
                - INTERNAL_ERROR
            message:
              type: string
            request_id:
              type: string
            details:
              type: array
              items:
                type: object
                properties:
                  field:
                    type: string
                  message:
                    type: string
                required:
                  - field
                  - message
          required:
            - code
            - message
            - request_id
            - details
      required:
        - error
    JobFinancials:
      type: object
      properties:
        id:
          type: string
          format: uuid
          description: The job ID; this resource has no separate persisted identity.
        number:
          type: string
        account:
          $ref: '#/components/schemas/Reference'
        location_id:
          type: string
          nullable: true
          format: uuid
        business_unit:
          $ref: '#/components/schemas/NullableReference'
        job_type:
          $ref: '#/components/schemas/NullableReference'
        job_class:
          $ref: '#/components/schemas/NullableJobClass'
        participants:
          type: array
          items:
            $ref: '#/components/schemas/Reference'
          description: >-
            Distinct currently associated company members with retained,
            consistently linked assignments. Includes inactive members and
            canceled visits; assignment is not proof of attendance.
        created_at:
          type: string
          format: date-time
          description: Job creation time, not creation of a financial snapshot.
        report_date:
          type: string
          format: date
          description: >-
            Company-local date of the earliest qualifying invoice issue time,
            otherwise job work completion, otherwise job creation. All job
            revenue and recorded costs use this date.
        report_date_basis:
          type: string
          enum:
            - INVOICE_ISSUED
            - WORK_COMPLETED
            - JOB_CREATED
        costing:
          type: object
          properties:
            enabled:
              type: boolean
            tracking_status:
              type: string
            verification_status:
              type: string
              description: >-
                Recorded current verification state; no verifier or verification
                timestamp is implied.
            job_type_included:
              type: boolean
              nullable: true
              description: >-
                Current job-type costing inclusion; null when the owned type is
                unavailable.
          required:
            - enabled
            - tracking_status
            - verification_status
            - job_type_included
        currency:
          type: string
          enum:
            - USD
        totals:
          type: object
          nullable: true
          properties:
            revenue_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: >-
                Recorded pre-discount, pre-tax invoice subtotals in OPEN, PAID
                or UNCOLLECTABLE status.
            labor_cost_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            parts_cost_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            equipment_cost_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            misc_cost_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            other_cost_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
              description: >-
                Recorded costs with an unrecognized category; retained in total
                costs.
            total_cost_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            gross_profit_cents:
              type: integer
              minimum: -9007199254740991
              maximum: 9007199254740991
            gross_margin:
              type: number
              nullable: true
              description: >-
                Gross profit / revenue, rounded to four decimal places; null at
                zero revenue. A fraction, not a percentage.
          required:
            - revenue_cents
            - labor_cost_cents
            - parts_cost_cents
            - equipment_cost_cents
            - misc_cost_cents
            - other_cost_cents
            - total_cost_cents
            - gross_profit_cents
            - gross_margin
          description: >-
            Unavailable when company costing is disabled or the job is not
            TRACKED. Saved entries and invoice facts remain readable. Unverified
            or excluded tracked jobs retain calculations.
        invoices:
          type: array
          items:
            type: object
            properties:
              id:
                type: string
                format: uuid
              number:
                type: string
              status:
                type: string
                enum:
                  - OPEN
                  - PAID
                  - UNCOLLECTABLE
              issued_at:
                type: string
                nullable: true
                format: date-time
              subtotal_cents:
                type: integer
                minimum: -9007199254740991
                maximum: 9007199254740991
            required:
              - id
              - number
              - status
              - issued_at
              - subtotal_cents
          description: >-
            Complete owned qualifying invoice facts; their recorded subtotals
            explain the costing revenue basis.
        cost_entries:
          type: array
          items:
            $ref: '#/components/schemas/JobCostEntry'
          description: >-
            Complete saved cost entries. Reads never populate or synchronize
            costs from time entries, wages, invoice lines or pricebook data.
      required:
        - id
        - number
        - account
        - location_id
        - business_unit
        - job_type
        - job_class
        - participants
        - created_at
        - report_date
        - report_date_basis
        - costing
        - currency
        - totals
        - invoices
        - cost_entries
    ResponseMeta:
      type: object
      properties:
        request_id:
          type: string
        generated_at:
          type: string
          format: date-time
        timezone:
          type: string
      required:
        - request_id
        - generated_at
        - timezone
      description: >-
        Generation time and company timezone. generated_at is not a snapshot or
        synchronization token.
    Reference:
      type: object
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
      required:
        - id
        - name
    NullableReference:
      type: object
      nullable: true
      properties:
        id:
          type: string
          format: uuid
        name:
          type: string
      required:
        - id
        - name
    NullableJobClass:
      type: string
      nullable: true
      enum:
        - SERVICE
        - MAINTENANCE
        - ESTIMATE_REPAIR
        - ESTIMATE_REPLACE
        - INSTALL
        - WARRANTY
        - CALLBACK
        - SALES
        - UNKNOWN
        - null
    JobCostEntry:
      type: object
      properties:
        id:
          type: string
          format: uuid
        category:
          type: string
          description: >-
            Recorded category, normally labor, parts, equipment or misc; legacy
            values are preserved.
        source:
          type: string
          description: >-
            Recorded source, normally manual, timesheet or invoice. This does
            not identify a worker or allocate revenue.
        name:
          type: string
        quantity:
          type: number
        quantity_unit:
          type: string
          enum:
            - minute
            - unit
        unit_cost_cents:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: Recorded hourly cost for labor; per-unit cost for other categories.
        total_cents:
          type: integer
          minimum: -9007199254740991
          maximum: 9007199254740991
          description: >-
            PostgreSQL numeric rounding per entry: quantity / 60 × hourly cost
            for labor, quantity × unit cost otherwise. Half-cent ties round away
            from zero.
        labor_activity:
          type: string
          nullable: true
        misc_category:
          $ref: '#/components/schemas/NullableReference'
        pricebook_item_id:
          type: string
          nullable: true
          format: uuid
        created_at:
          type: string
          format: date-time
        updated_at:
          type: string
          format: date-time
      required:
        - id
        - category
        - source
        - name
        - quantity
        - quantity_unit
        - unit_cost_cents
        - total_cents
        - labor_activity
        - misc_category
        - pricebook_item_id
        - created_at
        - updated_at
  securitySchemes:
    apiKey:
      type: http
      scheme: bearer
      description: >-
        Existing Breezy API key. Grants all published reads and scheduling
        writes in its associated company. No app permission scopes.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.