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

# Create Partner

POST https://api.catenatelematics.com/v2/orgs/partners
Content-Type: application/json

Create a new partner.

Reference: https://catena.ferndocs.com/api-reference/orgs/partners/create-partner

## Authentication

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

## Request

### Body (application/json)

This endpoint expects a PartnerCreate.

- `name` (string, required) — The name of your organization
- `description` (string, optional, nullable) — A description of your organization
- `websites` (list of string, optional, nullable) — List of websites associated with the organization. The website is used to map users to an organization based on their email domain and to authenticate them accordingly in the scope of the organization.
- `categories` (list of enum, optional) — A list of categories for the services offered by your organization
  - Allowed values: `Maintenance & Vehicle Health`, `Fuel, Energy & Sustainability`, `Insurance & Risk Management`, `Safety & Driver Performance`, `Compliance & Legal`, `Operations & Dispatch`, `Visibility & Logistics`, `Payments & Finance`, `Workforce & HR`, `Customer Experience & Growth`, `Data & Connectivity`
- `is_sandbox` (boolean, optional, default: false) — Indicates whether the account is a sandbox account for testing purposes.
- `parent_partner_id` (string, optional, nullable) — Used to link a partner to a parent partner. If set, the partner will be associated with the parent partner specified by this ID. Used to consolidate billing and reporting for multiple related partners under a single parent organization.
- `properties` (list of PartnerPropertyCreate, optional, default: []) — Optional custom properties for the partner organization

## Response

### 201

Successful Response

- `name` (string, required) — Partner organization name
- `id` (string, required) — Unique Catena partner identifier
- `created_at` (datetime, required) — When the partner was onboarded to Catena
- `updated_at` (datetime, required) — Last modification timestamp
- `description` (string, optional, nullable) — Partner organization description
- `websites` (list of string, optional, nullable) — List of websites associated with the organization. The website is used to map users to an organization based on their email domain and to authenticate them accordingly in the scope of the organization.
- `categories` (list of enum, optional) — A list of categories for the services offered by your organization
  - Allowed values: `Maintenance & Vehicle Health`, `Fuel, Energy & Sustainability`, `Insurance & Risk Management`, `Safety & Driver Performance`, `Compliance & Legal`, `Operations & Dispatch`, `Visibility & Logistics`, `Payments & Finance`, `Workforce & HR`, `Customer Experience & Growth`, `Data & Connectivity`
- `is_sandbox` (boolean, optional, default: false) — Indicates whether the account is a sandbox account for testing purposes.
- `parent_partner_id` (string, optional, nullable) — Used to link a partner to a parent partner. If set, the partner will be associated with the parent partner specified by this ID. Used to consolidate billing and reporting for multiple related partners under a single parent organization.
- `slug` (string, optional, nullable) — URL-friendly identifier for your organization

## Errors

### 400 Bad Request Error

Bad Request

- `code` (integer, optional, default: 400)
- `message` (string, optional, default: Bad Request)
- `detail` (string, optional, nullable)

### 401 Unauthorized Error

Unauthorized

- `code` (integer, optional, default: 401)
- `message` (string, optional, default: Unauthorized)
- `detail` (string, optional, nullable)

### 403 Forbidden Error

Forbidden

- `code` (integer, optional, default: 403)
- `message` (string, optional, default: Forbidden)
- `detail` (string, optional, nullable)

### 404 Not Found Error

Not Found

- `code` (integer, optional, default: 404)
- `message` (string, optional, default: Not Found)
- `detail` (string, optional, nullable)

### 405 Method Not Allowed Error

Method Not Allowed

- `code` (integer, optional, default: 405)
- `message` (string, optional, default: Method Not Allowed)
- `detail` (string, optional, nullable)

### 409 Conflict Error

Conflict

- `code` (integer, optional, default: 409)
- `message` (string, optional, default: Conflict)
- `detail` (string, optional, nullable)

### 422 Unprocessable Entity Error

Unprocessable Entity

- `code` (integer, optional, default: 422)
- `message` (string, optional, default: Invalid Request Body)
- `detail` (list of ValidationErrorDetail, optional, nullable)

### 429 Too Many Requests Error

Too Many Requests

- `code` (integer, optional, default: 429)
- `message` (string, optional, default: Too Many Requests)
- `detail` (RetryAfterDetail, optional, nullable)

### 500 Internal Server Error

Internal Server Error

- `message` (string, optional, default: Internal Server Error)

## Types

### PartnerPropertyCreate

API model for creating a partner Property

- `key` (enum, required) — The key of the property
  - Allowed values: `default_failure_redirect_url`, `default_success_redirect_url`, `default_callback_url`, `default_invitation_expires_in_hours`, `contract_signed`, `contract_url`, `contract_started_at`, `billing_model`, `billing_day_of_month`, `account_status`, `notes`
- `value` (string, required) — The value of the property

### ValidationErrorDetail

- `path` (string, required)
- `input` (string, required)
- `message` (string, required)
- `error_type` (string, required)

### RetryAfterDetail

- `retry_after_seconds` (integer, required)
- `message` (string, required)

## Examples

**Request**

```json
{
  "name": "string"
}
```

**Response**

```json
{
  "name": "Acme Logistics",
  "id": "11223344-5566-7788-99aa-bbccddeeff00",
  "created_at": "2024-06-01T10:00:00Z",
  "updated_at": "2025-12-01T15:30:00Z",
  "description": "AI-powered route optimization and fleet intelligence platform",
  "websites": [
    "https://acmelogistics.com",
    "https://acme.io"
  ],
  "categories": [
    "Operations & Dispatch",
    "Visibility & Logistics",
    "Data & Connectivity"
  ],
  "is_sandbox": false,
  "slug": "acme-logistics"
}
```

**SDK Code**

```python
import requests

url = "https://api.catenatelematics.com/v2/orgs/partners"

payload = { "name": "string" }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.catenatelematics.com/v2/orgs/partners';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"name":"string"}'
};

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"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.catenatelematics.com/v2/orgs/partners"

	payload := strings.NewReader("{\n  \"name\": \"string\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "Bearer <token>")
	req.Header.Add("Content-Type", "application/json")

	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.catenatelematics.com/v2/orgs/partners")

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

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"name\": \"string\"\n}"

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.post("https://api.catenatelematics.com/v2/orgs/partners")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"name\": \"string\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.catenatelematics.com/v2/orgs/partners', [
  'body' => '{
  "name": "string"
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.catenatelematics.com/v2/orgs/partners");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"name\": \"string\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["name": "string"] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.catenatelematics.com/v2/orgs/partners")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```