# Overview (/docs/sdks)

Besides the [TypeScript SDK](/docs/sdk), coss.com has an SDK for six more languages. They're
generated from the API's [OpenAPI document](https://api.coss.com/openapi.json), so every endpoint is in
every SDK, typed, as soon as it ships. Each endpoint's page in the [API reference](/docs/api-reference)
shows its call in every language.

| Language                  | Package                                  | Install                                    | Runtime                   |
| ------------------------- | ---------------------------------------- | ------------------------------------------ | ------------------------- |
| [Python](/docs/sdks/python) | `cosscom` (PyPI), imported as `coss`   | `pip install cosscom`                      | Python 3.10+              |
| [Go](/docs/sdks/go)         | `github.com/cosscom/coss-go`           | `go get github.com/cosscom/coss-go`        | Go 1.21+                  |
| [Ruby](/docs/sdks/ruby)     | `coss` (RubyGems)                      | `gem install coss`                         | Ruby 3.3+                 |
| [PHP](/docs/sdks/php)       | `coss/coss` (Packagist)                | `composer require coss/coss`               | PHP 8.1+                  |
| [Java](/docs/sdks/java)     | `com.coss:coss` (Maven Central)        | `implementation("com.coss:coss:latest.release")` | Java 8+            |
| [.NET](/docs/sdks/dotnet)   | `Coss` (NuGet)                         | `dotnet add package Coss`                  | .NET 8+, .NET Framework 4.6.2+, .NET Standard 2.0 |

They all work the same way:

- **One client for every product**, with the API key from the client's options or the
  `COSS_API_KEY` environment variable. Methods are grouped like the TypeScript SDK's:
  `coss.email.suppressions.add` is `client.email.suppressions.add` in Python and Ruby,
  `client.Email.Suppressions.Add` in Go and so on.
- **API versions.** Every request sends `Coss-Version` with the version the SDK was generated for.
  An SDK release that moves to a newer [version](/docs/api-reference/versioning) says so in its changelog.
- **Retries.** A request that gets a 408, 409, 429 or 5xx response is retried up to twice, after
  the response's `Retry-After` or an exponential backoff. Every `POST` carries an
  `Idempotency-Key` that its retries reuse, so a retried send never goes out twice. Pass your own
  key to make retries of your own safe too (`idempotency_key`, or the language's spelling of it).
  Requests the API can't deduplicate (creating a webhook endpoint, for example) are never retried.
- **Errors are exceptions** (Go: errors) carrying the HTTP status and the API's
  [error envelope](/docs/api-reference/errors): `type`, `code`, `message`, `param`, `issues` and
  `request_id`.
- **Lists return one page** (`data`, `has_more`). Pass the last item's `id` as `after` for the next
  one, while `has_more` is true.
- **Webhooks.** Each SDK can check a [webhook](/docs/webhooks)'s or a
  [log drain](/docs/log-drains) batch's signature, like the TypeScript SDK's `verifyWebhook`.

The SDKs are MIT licensed. Their source is in the [coss repository](https://github.com/cosscom/coss/tree/main/sdks),
generated by `bun run sdks:generate` with [Fern](https://github.com/fern-api/fern)'s open-source
generators.
