> ## Client identification
>
> Requests to this API should include a `Client-Platform` header alongside
> `Authorization`, identifying the application, tool, or model making the
> request. This is used for integration support and analytics.
>
> Use your model or tool name, for example `claude-code` or `chatgpt`.
>
> Example:
>
> ```bash
> curl https://api.salaryboxapp.com/... \
>   -H "Authorization: Api-Key <api-key>" \
>   -H "Client-Platform: claude-code"
> ```

# List Subscription History

GET https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history

Returns every subscription your company has had, including trials and expired ones, newest start date first. Rows with no start date come last. Very old records that reference no plan are left out. Each item has the same shape as `subscription` in Get Company Subscription. Invoices are not included.


Reference: https://docs.salarybox.in/api-reference/company/subscription-history-retrieve

## Authentication

- `Authorization` header (required) (prefixed with ` Api-Key   `) — Format: "Api-Key \{api-key}"

## Request

### Query parameters

- `page` (integer, optional) — Page number, starting at 1.
- `page_size` (integer, optional) — Results per page. Default and maximum 500.

## Response

### 200

Subscriptions, newest start date first.

- `data` (list of CompanySubscription, required)
- `message` (string, optional)
- `status` (boolean, optional)
- `count` (integer, optional) — Total number of results across all pages.
- `prev` (string, optional, nullable) — URL of the previous page, or null.
- `next` (string, optional, nullable) — URL of the next page, or null.

## Types

### CompanySubscription

One subscription of the company.

- `plan_name` (string, required, nullable) — Name of the plan.
- `purchase_mode` (enum, required, nullable) — How it was acquired. `RENEWAL` renewed before expiry; `RENEWAL_POST` renewed after expiry.
  - Allowed values: `NEW`, `UPGRADE`, `EXTENSION`, `RENEWAL`, `RENEWAL_POST`, `TRIAL`
- `is_active` (boolean, required) — Whether the subscription is active today.
- `start_date` (date, required) — First day, in the company's time zone.
- `expiry_date` (date, required) — Last day, in the company's time zone.
- `allowed_staff_count` (integer, required, nullable) — Maximum staff allowed.
- `addons` (list of string, required) — Add-on names, for example `location_tracking`, `crm`. May be empty.
- `price_paid` (string, required, nullable) — Amount paid, 2-decimal string.
- `currency` (string, required, nullable) — Currency code, for example INR.
- `paid_on` (date, required, nullable) — Date of payment.
- `auto_renew` (enum, required, nullable) — Auto-renewal status. Null if not set up.
  - Allowed values: `ACTIVE`, `INACTIVE`

## Examples

**Response**

```json
{
  "data": [
    {
      "plan_name": "Business",
      "purchase_mode": "RENEWAL",
      "is_active": true,
      "start_date": "2026-01-01",
      "expiry_date": "2026-12-31",
      "allowed_staff_count": 100,
      "addons": [
        "location_tracking"
      ],
      "price_paid": "23600.00",
      "currency": "INR",
      "paid_on": "2025-12-28",
      "auto_renew": "ACTIVE"
    },
    {
      "plan_name": null,
      "purchase_mode": "TRIAL",
      "is_active": false,
      "start_date": "2025-12-15",
      "expiry_date": "2025-12-31",
      "allowed_staff_count": null,
      "addons": [],
      "price_paid": null,
      "currency": null,
      "paid_on": null,
      "auto_renew": null
    }
  ],
  "message": "Success",
  "status": true,
  "count": 2,
  "prev": null,
  "next": null
}
```

**SDK Code**

```python Example
import requests

url = "https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history"

headers = {"Authorization": "Api-Key  <apiKey>"}

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

print(response.json())
```

```javascript Example
const url = 'https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history';
const options = {method: 'GET', headers: {Authorization: 'Api-Key  <apiKey>'}};

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

```go Example
package main

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

func main() {

	url := "https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history"

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

	req.Header.Add("Authorization", "Api-Key  <apiKey>")

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

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

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

}
```

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

url = URI("https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history")

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

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Api-Key  <apiKey>'

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

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

HttpResponse<String> response = Unirest.get("https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history")
  .header("Authorization", "Api-Key  <apiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history', [
  'headers' => [
    'Authorization' => 'Api-Key  <apiKey>',
  ],
]);

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

```csharp Example
using RestSharp;

var client = new RestClient("https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Api-Key  <apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Example
import Foundation

let headers = ["Authorization": "Api-Key  <apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.salaryboxapp.com/v2/customer/v1/company/subscription/history")! 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()
```