> This page is for API, version 2026-01-01 (Stable) (default).
> For other versions, use one of these documentation indexes:
> - 2026-01-01 (Stable) (default): https://developer.deel.com/api/stable/llms.txt

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

# List Shareworks equity exercises

GET https://api.letsdeel.com/rest/equity-exercises

Retrieves the equity exercises recorded for an organization, as ingested from Shareworks, in ascending exercise_date order. Use it to report realised option gains into payroll and tax withholding, or to reconcile exercise activity against a cap table. Each record carries the shares exercised, the strike price paid and the fair market value at exercise, so the gain can be recomputed rather than taken on trust. Requires the `equities.view` permission at the organization level.

 **Token scopes**: `equities:read`

Reference: https://developer.deel.com/api/reference/endpoints/equity-tokens/list-equity-shareworks-exercises-v-2026-09-09

## Authentication

- `Authorization` header (bearer token, required) — ## Authentication The Deel API uses bearer tokens to authenticate requests. All API calls must be made over HTTPS — calls over plain HTTP or without authentication will fail. ```curl curl -X GET 'https://api.letsdeel.com/rest/v2/contracts' \ -H 'Authorization: Bearer YOUR-TOKEN-HERE' ``` [Learn more about authentication](/api/authentication)
- `Authorization` header (bearer token, required) — Standard OAuth2 security scheme based on https://swagger.io/docs/specification/authentication/

## Servers

- `https://api.letsdeel.com/rest` (Production, default)
- `https://api-staging.letsdeel.com/rest` (Demo)

## Request

### Query parameters

- `limit` (integer, optional, default: 50) — Maximum number of exercise records to return in this page.
- `cursor` (string, optional) — Opaque pagination cursor returned as next_cursor by a previous response. Omit to fetch the first page.
- `exercise_date_from` (string, optional) — Only return exercises with an exercise_date on or after this date (inclusive), in YYYY-MM-DD format.
- `exercise_date_to` (string, optional) — Only return exercises with an exercise_date on or before this date (inclusive), in YYYY-MM-DD format.
- `employee_number` (string, optional) — Only return exercises for this exact Shareworks employee number.

## Response

### 200

Shareworks equity exercises returned successfully.

- `data` (list of EquityExercisesGetResponsesContentApplicationJsonSchemaDataItems, required) — Page of exercise records. Worker name fields are deliberately not included — employee_number is the intended join key, and first/last name are SENSITIVE PII not needed by downstream consumers of this endpoint.
- `has_more` (boolean, required) — Whether another page of results is available.
- `next_cursor` (string, required, nullable) — Cursor for the next page. Null when has_more is false.

## Errors

### 400 Bad Request Error

Bad request — invalid or missing parameters.

- `errors` (list of EquityExercisesGetResponsesContentApplicationJsonSchemaErrorsItems, required) — List of errors that occurred while processing the request.

### 401 Unauthorized Error

Unauthorized — missing or invalid authentication token.

- `errors` (list of EquityExercisesGetResponsesContentApplicationJsonSchemaErrorsItems, required) — List of errors that occurred while processing the request.

### 403 Forbidden Error

Forbidden — caller lacks the equities.view permission, or the caller's organization is not permitted to access this endpoint.

- `errors` (list of EquityExercisesGetResponsesContentApplicationJsonSchemaErrorsItems, required) — List of errors that occurred while processing the request.

### 404 Not Found Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

### 500 Internal Server Error

Operation failed.

- `request` (ApiErrorRequest, optional)
- `errors` (list of ApiError, optional)

## Types

### EquityExercisesGetResponsesContentApplicationJsonSchemaDataItems

- `id` (string, optional) — The unique identifier of the exercise record.
- `currency` (string, optional) — ISO 4217 currency code for the monetary fields on this record.
- `plan_name` (string, optional, nullable) — Equity plan name, as reported by the ingested file.
- `grant_date` (string, optional, nullable) — Date the grant was issued.
- `grant_name` (string, optional, nullable) — Grant name, as reported by the ingested file.
- `grant_type` (string, optional, nullable) — Grant type (e.g. ISO, NSO, RSU), as reported by the ingested file.
- `updated_at` (string, optional) — Timestamp this record was last upserted, for incremental sync.
- `exercise_fmv` (double, optional, nullable) — Total fair market value of the exercised shares.
- `fmv_per_unit` (double, optional, nullable) — Fair market value per unit at exercise.
- `exercise_date` (string, optional) — Date the exercise took place.
- `exercise_gain` (double, optional, nullable) — Gain realized on exercise (FMV minus cost).
- `exercise_price` (double, optional, nullable) — Strike/exercise price per unit.
- `cost_of_options` (double, optional, nullable) — Total cost paid to exercise the options.
- `employee_number` (string, optional) — Shareworks employee number, as reported by the ingested file. The intended join key for this record.
- `hris_profile_id` (integer, optional, nullable) — Matched HRIS profile id, if employee_number could be resolved to one. Null when unmatched.
- `employee_grant_number` (string, optional) — Shareworks grant number for this employee.
- `shares_exercised_total` (double, optional, nullable) — Total number of shares exercised.
- `shares_exercised_vested` (double, optional, nullable) — Number of vested shares exercised.
- `shares_exercised_unvested` (double, optional, nullable) — Number of unvested shares exercised.

### EquityExercisesGetResponsesContentApplicationJsonSchemaErrorsItems

- `message` (string, required) — Human-readable explanation
- `code` (string, optional) — Machine-readable error code
- `field` (string, optional, nullable) — Field that caused the error, if applicable.

### ApiErrorRequest

- `method` (string, optional) — The HTTP method of the failed request
- `url` (string, optional) — The relative URL of the failed request
- `status` (double, optional) — The status code of the response
- `api_req_id` (string, optional) — The request ID of the failed request
- `docs` (string, optional) — A link to the official documentation for the requested endpoint resource
- `source` (string, optional) — The source handler which produced the returned error
- `code` (double, optional) — The code of the source handler which produced the returned error

### ApiError

- `message` (string, optional) — A description of the returned error
- `path` (string, optional) — The JSON path where input validation failed

## Examples

**Response**

```json
{
  "data": [
    {
      "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "currency": "USD",
      "plan_name": "2020 Stock Plan",
      "grant_date": "2022-06-18",
      "grant_name": "06/18/2022 - NQSO - $4.7",
      "grant_type": "Options (NQ)",
      "updated_at": "2026-08-13T09:01:02.000Z",
      "exercise_fmv": 10000,
      "fmv_per_unit": 10,
      "exercise_date": "2026-08-13",
      "exercise_gain": 5300,
      "exercise_price": 4.7,
      "cost_of_options": 4700,
      "employee_number": "9001",
      "hris_profile_id": 4821,
      "employee_grant_number": "ES-0001",
      "shares_exercised_total": 1000,
      "shares_exercised_vested": 1000,
      "shares_exercised_unvested": 0
    }
  ],
  "has_more": false,
  "next_cursor": "eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ=="
}
```

**SDK Code**

```python
import requests

url = "https://api.letsdeel.com/rest/equity-exercises"

querystring = {"cursor":"eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ==","employee_number":"9001","exercise_date_from":"2026-01-01","exercise_date_to":"2026-12-31","limit":"50"}

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

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

print(response.json())
```

```javascript
const url = 'https://api.letsdeel.com/rest/equity-exercises?cursor=eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ%3D%3D&employee_number=9001&exercise_date_from=2026-01-01&exercise_date_to=2026-12-31&limit=50';
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://api.letsdeel.com/rest/equity-exercises?cursor=eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ%3D%3D&employee_number=9001&exercise_date_from=2026-01-01&exercise_date_to=2026-12-31&limit=50"

	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://api.letsdeel.com/rest/equity-exercises?cursor=eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ%3D%3D&employee_number=9001&exercise_date_from=2026-01-01&exercise_date_to=2026-12-31&limit=50")

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://api.letsdeel.com/rest/equity-exercises?cursor=eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ%3D%3D&employee_number=9001&exercise_date_from=2026-01-01&exercise_date_to=2026-12-31&limit=50")
  .header("Authorization", "Bearer <token>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.letsdeel.com/rest/equity-exercises?cursor=eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ%3D%3D&employee_number=9001&exercise_date_from=2026-01-01&exercise_date_to=2026-12-31&limit=50', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.letsdeel.com/rest/equity-exercises?cursor=eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ%3D%3D&employee_number=9001&exercise_date_from=2026-01-01&exercise_date_to=2026-12-31&limit=50");
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://api.letsdeel.com/rest/equity-exercises?cursor=eyJleGVyY2lzZURhdGUiOiIyMDI2LTAxLTE1IiwiaWQiOiJhMWIyYzNkNC1lNWY2LTc4OTAtYWJjZC1lZjEyMzQ1Njc4OTAifQ%3D%3D&employee_number=9001&exercise_date_from=2026-01-01&exercise_date_to=2026-12-31&limit=50")! 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()
```