Skip to main content
The Scrums.com API is planned and not yet publicly available. Endpoints and behaviour are subject to change before release.

Overview

Invoices (INV-*) are generated at the close of each billing period for each active Subscription. They consolidate charges from all Service Lines under that subscription into a single billable document. Every invoice line item traces to a LIN-* identifier. This makes invoice data directly reconcilable with usage summaries and execution records. Invoices are immutable once finalized. Draft invoices exist during the billing period as the accrual grows.

Core Concepts

Invoice lifecycle

draft -> open -> paid
              |
              +-> void
              +-> uncollectible
Invoices move from draft (accruing usage) to open (issued, awaiting payment) at period close. Successful payment moves them to paid. Finance teams can void an invoice if there is a billing dispute.

Line items and Service Lines

Each line item on an invoice corresponds to one Service Line’s usage for the period. The line item shows the service_line_id, the billing model applied, the quantity consumed, the rate or price, and the total. This structure makes the invoice auditable at the delivery level.

Billing models and line item shapes

Billing modelLine item structure
time_and_materialsHours x rate
subscriptionFlat period charge
fixed_scopeAgreed scope total
usage_plus_subscriptionBase charge + usage overage
usageQuantity x rate per meter

Endpoints

GET /v1/invoices

List invoices for an organization.

Request

GET /v1/invoices?organization_id=ORG-26-090500&status=open
Authorization: Bearer <token>
Query parameters
ParameterTypeDescription
organization_idstringScope to organization (required)
subscription_idstringFilter by subscription
statusenumdraft, open, paid, void, uncollectible
fromdatePeriod start filter
todatePeriod end filter
cursorstringPagination cursor
limitintegerResults per page (max 100, default 25)

Response

{
  "data": [
    {
      "id": "INV-26-001341",
      "organization_id": "ORG-26-090500",
      "subscription_id": "SUB-26-001122",
      "status": "open",
      "total": 142650.00,
      "subtotal": 142650.00,
      "tax": 0.00,
      "currency": "USD",
      "period_start": "2026-03-01T00:00:00Z",
      "period_end": "2026-03-31T23:59:59Z",
      "due_date": "2026-04-14T23:59:59Z",
      "issued_at": "2026-04-01T06:00:00Z",
      "paid_at": null,
      "line_item_count": 6
    }
  ],
  "meta": {
    "cursor": null,
    "has_more": false
  }
}

GET /v1/invoices/

Retrieve a single invoice with full line item detail.

Response

{
  "data": {
    "id": "INV-26-001341",
    "organization_id": "ORG-26-090500",
    "subscription_id": "SUB-26-001122",
    "status": "open",
    "total": 142650.00,
    "subtotal": 142650.00,
    "tax": 0.00,
    "currency": "USD",
    "period_start": "2026-03-01T00:00:00Z",
    "period_end": "2026-03-31T23:59:59Z",
    "due_date": "2026-04-14T23:59:59Z",
    "issued_at": "2026-04-01T06:00:00Z",
    "paid_at": null,
    "line_items": [
      {
        "service_line_id": "LIN-26-084729",
        "service_line_name": "Backend Engineering - Q2 2026",
        "product_line": "talent",
        "billing_model": "time_and_materials",
        "meter": "talent.hours",
        "quantity": 640.0,
        "unit": "hours",
        "rate": 95.00,
        "total": 60800.00,
        "currency": "USD"
      },
      {
        "service_line_id": "LIN-26-088401",
        "service_line_name": "Managed Delivery Pod - Payments",
        "product_line": "managed_services",
        "billing_model": "ongoing_sla",
        "meter": "talent.days",
        "quantity": 88.0,
        "unit": "days",
        "rate": 760.00,
        "total": 66880.00,
        "currency": "USD"
      },
      {
        "service_line_id": "LIN-26-091100",
        "service_line_name": "Agent Gateway - Production",
        "product_line": "agent_gateway",
        "billing_model": "usage",
        "meter": "agent.tokens",
        "quantity": 15800000,
        "unit": "tokens",
        "rate": 0.00095,
        "total": 15010.00,
        "currency": "USD"
      }
    ]
  }
}

GET /v1/invoices//pdf

Returns a signed URL for downloading the invoice as a PDF document. The URL expires after 15 minutes.

Response

{
  "data": {
    "url": "https://billing.scrums.com/invoices/INV-26-001341.pdf?token=...",
    "expires_at": "2026-04-15T10:15:00Z"
  }
}

POST /v1/invoices//pay

Trigger payment on an open invoice using the organization’s default payment method.

Request

{
  "payment_method_id": "pm_1234567890"
}

Response

{
  "data": {
    "id": "INV-26-001341",
    "status": "paid",
    "paid_at": "2026-04-15T10:00:00Z",
    "payment_reference": "txn_9988776655"
  }
}

Notes

  • If payment_method_id is omitted, the organization’s default payment method is used.
  • If payment fails, the invoice status remains open and a invoice.payment_failed event is emitted.
  • Only org owner or billing role can trigger payment.

Common Workflows

Finance reconciliation workflow

# List all open invoices
GET /v1/invoices?organization_id=ORG-26-090500&status=open

# Get full line item detail for each invoice
GET /v1/invoices/INV-26-001341

# Download PDF for approval workflow
GET /v1/invoices/INV-26-001341/pdf

# Pay once approved
POST /v1/invoices/INV-26-001341/pay

Allocating costs to internal teams

Each line item carries a service_line_id. Cross-reference that against Service Line project_tags to attribute costs to the correct internal projects or cost centres.
# Get the invoice line items
GET /v1/invoices/INV-26-001341

# For each line item, check the project tags on the service line
GET /v1/service-lines/LIN-26-084729  # -> project_tags: ["PROJ-26-004281"]

Objects

Invoice

FieldTypeDescription
idstringINV-* identifier
organization_idstringBilling organization
subscription_idstringSource subscription (SUB-*)
statusenumdraft, open, paid, void, uncollectible
totalnumberTotal amount due
subtotalnumberPre-tax total
taxnumberTax amount
currencystringISO 4217 currency code
period_startdatetimeBilling period start
period_enddatetimeBilling period end
due_datedatetimePayment due date
issued_atdatetimeWhen the invoice was finalized
paid_atdatetimePayment timestamp (null if unpaid)
line_itemsarrayIndividual line items (returned on GET by ID)

Line item

FieldTypeDescription
service_line_idstringSource LIN-*
service_line_namestringService Line display name
product_lineenumProduct line that generated the charge
billing_modelenumModel used to calculate this line
meterstringMeter name for consumption lines
quantitynumberConsumed quantity
unitstringUnit of measure
ratenumberRate applied
totalnumberLine total
currencystringISO 4217 currency code

Best Practices

  • Build finance tooling against line items, not invoice totals. The total field is useful for payment flows, but cost attribution, reporting, and reconciliation require line-item-level data tied to service_line_id.
  • Subscribe to invoice.finalized webhooks. When an invoice moves from draft to open, the platform emits invoice.finalized. Use this to trigger finance approval workflows rather than polling.
  • Verify due_date before invoking POST /pay. Some plans have extended payment terms. Do not auto-pay immediately on invoice.finalized; respect the due date.
Last modified on April 15, 2026