---
title: "List Customer Contracts Developer"
method: GET
path: "/billing/developer/contracts/{customer_id}"
tags: ["Billing", "billing"]
---

# List Customer Contracts Developer

`GET /billing/developer/contracts/{customer_id}`

## Request

- Base URL: `https://api.openintake.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.openintake.ai/billing/developer/contracts/{customer_id}`
- Auth: none declared

List all billing contracts for a specific customer (developer only).

Returns contracts ordered by start_date descending (newest first).

## Path parameters

- `customer_id` string, uuid, required

## Response `200`

Successful Response

- BillingContractResponse[]
  - `billing_contract_id` string, uuid, required
  - `customer_id` string, uuid, required
  - `start_date` string, date-time, nullable: NULL while billing_start_pending — billing has not started
  - `number_of_months` integer, nullable: NULL means month-to-month: no fixed term
  - `billing_start_pending` boolean: Billing is on hold until the customer starts taking real calls; nothing is billed
  - `items` BillingContractItemResponse[], required
    - `billing_contract_item_id` string, uuid, required
    - `billing_contract_id` string, uuid, required
    - `item_type` 'base_rate' | 'outbound_call_over_quota' | 'monthly_minimum' | 'per_call_rate', required: Billing contract item types.
    - `price` string, required
    - `quota` integer, nullable
    - `min_call_duration_seconds` integer, nullable
    - `count_voicemails` boolean, nullable
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
  - `created_at` string, date-time, required
  - `updated_at` string, date-time, required
  - `end_date` string, date-time, nullable: Computed: start_date + number_of_months; NULL when month-to-month or pending
  - `is_active` boolean, required

## Other responses

- `422`: Validation Error

## Changes

- **2026-10-07** `d443593f5f45`: 6 breaking, 1 info
  - the response property `items/end_date` became optional for the status `200`
  - the response property `items/number_of_months` became optional for the status `200`
  - the response property `items/start_date` became optional for the status `200`
  - response property `items/end_date` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - …3 more

[Operation history](https://skmtc.dev/openintake/apis/openintake-api/changes/billing/developer/contracts/:customer_id/get.md)

---

[API](https://skmtc.dev/openintake/apis/openintake-api.md) - [All operations](https://skmtc.dev/openintake/apis/openintake-api/llms.txt) - [OpenAPI document](https://skmtc.dev/openintake/apis/openintake-api/revisions/de90a8dcbc07?raw)
