> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.termina.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.termina.ai/_mcp/server.

# Contribution Summary

GET https://app.termina.ai/api/v1/group/{group_id}/deal/{deal_id}/data/contribution-summary

Get an assortment of summary metrics about the contribution for the user type.

Reference: https://docs.termina.ai/api-reference/data/unit-economics/get-contribution-summary

## Authentication

- `Authorization` header (bearer token, required) — Bearer authentication of the form `Bearer <token>`, where token is your auth token.

## Servers

- `https://app.termina.ai` (Production server, default)
- `https://app.termina.dev` (Development server)
- `http://localhost:8000` (Local development server)

## Request

### Path parameters

- `group_id` (integer, required)
- `deal_id` (integer, required)

### Query parameters

- `user_type` (enum, required)
  - Allowed values: `business`, `consumer`, `supplier`, `asset`, `labor`, `business_user`
- `freq` (enum, optional)
  - Allowed values: `M`, `Q`, `A`

## Response

### 200

Successful Response

- `list of ContributionSummaryResponse`

## Errors

### 422 Unprocessable Entity Error

Validation Error

- `detail` (list of ValidationError, optional)

## Types

### ContributionSummaryResponse

Represents summary Unit Economics statistics for each cohort. This approach assumes all acquisition spend was toward the specified user type. Important note: the `cohort` is the cohort start period, not the date of the observation. The `lifetime_*` columns are cumulative aggregates across cohorts up to that period; the `rolling_*` columns are quarter-length, cohort-size-weighted trailing means.

- `cohort` (string, required) — The date of the cohort.
- `modeled_payback_periods` (double, optional, nullable) — The modeled payback periods for the cohort. For example, a value of 12.5 for monthly frequency means it takes 12.5 months to pay back. Important Note: this is MODELED, which is done by fitting curves to contribution curves and deriving the payback period by finding the zero-intercept. This may deviate from actual payback periods, including from cohorts who have already paid back. This metric aims to fit curves in order to reduce the effect of noise in the data.
- `lifetime_cac` (double, optional, nullable) — The lifetime-integrated customer acquisition costs (CAC) across cohorts.
- `lifetime_contribution2` (double, optional, nullable) — The lifetime-integrated contribution (gmLTV - CAC) across cohorts. Used for quarterly frequency.
- `lifetime_contribution4` (double, optional, nullable) — The lifetime-integrated contribution (gmLTV - CAC) across cohorts. Used for quarterly frequency.
- `lifetime_contribution6` (double, optional, nullable) — The lifetime-integrated contribution (gmLTV - CAC) across cohorts. Used for monthly frequency.
- `lifetime_contribution12` (double, optional, nullable) — The lifetime-integrated contribution (gmLTV - CAC) across cohorts. Used for monthly frequency.
- `lifetime_ltv2_cac` (double, optional, nullable) — The lifetime-integrated LTV to CAC ratio across cohorts. Used for quarterly frequency.
- `lifetime_ltv4_cac` (double, optional, nullable) — The lifetime-integrated LTV to CAC ratio across cohorts. Used for quarterly frequency.
- `lifetime_ltv6_cac` (double, optional, nullable) — The lifetime-integrated LTV to CAC ratio across cohorts. Used for monthly frequency.
- `lifetime_ltv12_cac` (double, optional, nullable) — The lifetime-integrated LTV to CAC ratio across cohorts. Used for monthly frequency.
- `lifetime_gmltv2_cac` (double, optional, nullable) — The lifetime-integrated gmLTV to CAC ratio across cohorts. Used for quarterly frequency.
- `lifetime_gmltv4_cac` (double, optional, nullable) — The lifetime-integrated gmLTV to CAC ratio across cohorts. Used for quarterly frequency.
- `lifetime_gmltv6_cac` (double, optional, nullable) — The lifetime-integrated gmLTV to CAC ratio across cohorts. Used for monthly frequency.
- `lifetime_gmltv12_cac` (double, optional, nullable) — The lifetime-integrated gmLTV to CAC ratio across cohorts. Used for monthly frequency.
- `rolling_cac` (double, optional, nullable) — Quarter-length, cohort-size-weighted trailing mean of CAC.
- `rolling_contribution` (double, optional, nullable) — Quarter-length rolling mean of contribution at period 1. Used for quarterly frequency.
- `rolling_contribution2` (double, optional, nullable) — Quarter-length rolling mean of contribution at period 2. Used for quarterly frequency.
- `rolling_contribution3` (double, optional, nullable) — Quarter-length rolling mean of contribution at period 3. Used for monthly frequency.
- `rolling_contribution4` (double, optional, nullable) — Quarter-length rolling mean of contribution at period 4. Used for quarterly frequency.
- `rolling_contribution6` (double, optional, nullable) — Quarter-length rolling mean of contribution at period 6. Used for monthly frequency.
- `rolling_contribution12` (double, optional, nullable) — Quarter-length rolling mean of contribution at period 12. Used for monthly frequency.
- `rolling_gmltv` (double, optional, nullable) — Quarter-length rolling mean of gmLTV at period 1. Used for quarterly frequency.
- `rolling_gmltv2` (double, optional, nullable) — Quarter-length rolling mean of gmLTV at period 2. Used for quarterly frequency.
- `rolling_gmltv3` (double, optional, nullable) — Quarter-length rolling mean of gmLTV at period 3. Used for monthly frequency.
- `rolling_gmltv4` (double, optional, nullable) — Quarter-length rolling mean of gmLTV at period 4. Used for quarterly frequency.
- `rolling_gmltv6` (double, optional, nullable) — Quarter-length rolling mean of gmLTV at period 6. Used for monthly frequency.
- `rolling_gmltv12` (double, optional, nullable) — Quarter-length rolling mean of gmLTV at period 12. Used for monthly frequency.
- `rolling_gmltv_cac` (double, optional, nullable) — Quarter-length rolling mean of the gmLTV/CAC ratio at period 1. Used for quarterly frequency.
- `rolling_gmltv2_cac` (double, optional, nullable) — Quarter-length rolling mean of the gmLTV/CAC ratio at period 2. Used for quarterly frequency.
- `rolling_gmltv3_cac` (double, optional, nullable) — Quarter-length rolling mean of the gmLTV/CAC ratio at period 3. Used for monthly frequency.
- `rolling_gmltv4_cac` (double, optional, nullable) — Quarter-length rolling mean of the gmLTV/CAC ratio at period 4. Used for quarterly frequency.
- `rolling_gmltv6_cac` (double, optional, nullable) — Quarter-length rolling mean of the gmLTV/CAC ratio at period 6. Used for monthly frequency.
- `rolling_gmltv12_cac` (double, optional, nullable) — Quarter-length rolling mean of the gmLTV/CAC ratio at period 12. Used for monthly frequency.
- `rolling_ltv` (double, optional, nullable) — Quarter-length rolling mean of LTV at period 1. Used for quarterly frequency.
- `rolling_ltv2` (double, optional, nullable) — Quarter-length rolling mean of LTV at period 2. Used for quarterly frequency.
- `rolling_ltv3` (double, optional, nullable) — Quarter-length rolling mean of LTV at period 3. Used for monthly frequency.
- `rolling_ltv4` (double, optional, nullable) — Quarter-length rolling mean of LTV at period 4. Used for quarterly frequency.
- `rolling_ltv6` (double, optional, nullable) — Quarter-length rolling mean of LTV at period 6. Used for monthly frequency.
- `rolling_ltv12` (double, optional, nullable) — Quarter-length rolling mean of LTV at period 12. Used for monthly frequency.
- `rolling_ltv_cac` (double, optional, nullable) — Quarter-length rolling mean of the LTV/CAC ratio at period 1. Used for quarterly frequency.
- `rolling_ltv2_cac` (double, optional, nullable) — Quarter-length rolling mean of the LTV/CAC ratio at period 2. Used for quarterly frequency.
- `rolling_ltv3_cac` (double, optional, nullable) — Quarter-length rolling mean of the LTV/CAC ratio at period 3. Used for monthly frequency.
- `rolling_ltv4_cac` (double, optional, nullable) — Quarter-length rolling mean of the LTV/CAC ratio at period 4. Used for quarterly frequency.
- `rolling_ltv6_cac` (double, optional, nullable) — Quarter-length rolling mean of the LTV/CAC ratio at period 6. Used for monthly frequency.
- `rolling_ltv12_cac` (double, optional, nullable) — Quarter-length rolling mean of the LTV/CAC ratio at period 12. Used for monthly frequency.
- `rolling_ltv_minus_cac` (double, optional, nullable) — Quarter-length rolling mean of (LTV - CAC) at period 1. Used for quarterly frequency.
- `rolling_ltv2_minus_cac` (double, optional, nullable) — Quarter-length rolling mean of (LTV - CAC) at period 2. Used for quarterly frequency.
- `rolling_ltv3_minus_cac` (double, optional, nullable) — Quarter-length rolling mean of (LTV - CAC) at period 3. Used for monthly frequency.
- `rolling_ltv4_minus_cac` (double, optional, nullable) — Quarter-length rolling mean of (LTV - CAC) at period 4. Used for quarterly frequency.
- `rolling_ltv6_minus_cac` (double, optional, nullable) — Quarter-length rolling mean of (LTV - CAC) at period 6. Used for monthly frequency.
- `rolling_ltv12_minus_cac` (double, optional, nullable) — Quarter-length rolling mean of (LTV - CAC) at period 12. Used for monthly frequency.

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)
- `input` (any, optional)
- `ctx` (ValidationErrorCtx, optional)

### ValidationErrorLocItems

- string
- integer

### ValidationErrorCtx

## Examples

**Response**

```json
[
  {
    "cohort": "2026-01",
    "modeled_payback_periods": 14.5,
    "lifetime_cac": 125,
    "lifetime_contribution2": 1000,
    "lifetime_contribution4": 2000,
    "lifetime_contribution6": 3000,
    "lifetime_contribution12": 6000,
    "lifetime_ltv2_cac": 0.5,
    "lifetime_ltv4_cac": 0.75,
    "lifetime_ltv6_cac": 0.9,
    "lifetime_ltv12_cac": 1.2,
    "lifetime_gmltv2_cac": 0.25,
    "lifetime_gmltv4_cac": 0.5,
    "lifetime_gmltv6_cac": 0.75,
    "lifetime_gmltv12_cac": 1,
    "rolling_cac": 110,
    "rolling_contribution": 150,
    "rolling_contribution2": 300,
    "rolling_contribution3": 450,
    "rolling_contribution4": 600,
    "rolling_contribution6": 900,
    "rolling_contribution12": 1800,
    "rolling_gmltv": 150,
    "rolling_gmltv2": 300,
    "rolling_gmltv3": 450,
    "rolling_gmltv4": 600,
    "rolling_gmltv6": 900,
    "rolling_gmltv12": 1800,
    "rolling_gmltv_cac": 1.25,
    "rolling_gmltv2_cac": 2.5,
    "rolling_gmltv3_cac": 3.75,
    "rolling_gmltv4_cac": 5,
    "rolling_gmltv6_cac": 7.5,
    "rolling_gmltv12_cac": 10,
    "rolling_ltv": 150,
    "rolling_ltv2": 300,
    "rolling_ltv3": 450,
    "rolling_ltv4": 600,
    "rolling_ltv6": 900,
    "rolling_ltv12": 1800,
    "rolling_ltv_cac": 1.25,
    "rolling_ltv2_cac": 2.5,
    "rolling_ltv3_cac": 3.75,
    "rolling_ltv4_cac": 5,
    "rolling_ltv6_cac": 7.5,
    "rolling_ltv12_cac": 10,
    "rolling_ltv_minus_cac": 100,
    "rolling_ltv2_minus_cac": 200,
    "rolling_ltv3_minus_cac": 300,
    "rolling_ltv4_minus_cac": 400,
    "rolling_ltv6_minus_cac": 600,
    "rolling_ltv12_minus_cac": 1200
  }
]
```

**SDK Code**

```python
import requests

url = "https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary"

querystring = {"user_type":"business"}

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript
const url = 'https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary?user_type=business';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary?user_type=business"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary?user_type=business")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary?user_type=business")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary?user_type=business', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary?user_type=business");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://app.termina.ai/api/v1/group/1/deal/1/data/contribution-summary?user_type=business")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```