> ## Documentation Index
> Fetch the complete documentation index at: https://developer.opus.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a Provider

> Register the vendor or system an integration is authored under

Create the provider an integration is authored under — the vendor or system it talks to, such as Google, Slack, or an internal service of your own.

The provider carries your organization, and that binding is what authorizes later action, credential and publish calls on integrations built on it. Create one before your first integration and reuse its `id` for everything from the same vendor.

Requires the **Integration: Full** permission at organization level.

## Headers

<ParamField header="x-service-key" type="string" required>
  Your API authentication key
</ParamField>

## Body Parameters

<ParamField body="name" type="string" required>
  Provider display name. Maximum 255 characters.
</ParamField>

<ParamField body="icon" type="string">
  Provider icon as a base64-encoded SVG (or PNG) — a plain string, with no `data:` prefix. Typically 360–8000 characters, maximum 65535.
</ParamField>

<ParamField body="email" type="string">
  Provider contact email. Maximum 254 characters. Defaults automatically when omitted.
</ParamField>

<Note>
  Your organization is always taken from the API key — it cannot be set in the body.
</Note>

<Warning>
  `email` must use a real domain. Reserved domains — `.test`, `.example`, `.invalid`, `.localhost` — are rejected with `422`. Omit the field if you do not have a real address.
</Warning>

## Response

<ResponseField name="id" type="string" required>
  The provider id. Pass it as `providerId` when [creating an integration](/api-reference/v1-integration/create-integration).
</ResponseField>

<ResponseField name="name" type="string">
  Provider display name.
</ResponseField>

<ResponseField name="email" type="string">
  Provider contact email.
</ResponseField>

<ResponseField name="status" type="string">
  Provider status — `active` or `inactive`.
</ResponseField>

<ResponseField name="icon" type="string">
  Provider icon.
</ResponseField>

<ResponseField name="createdAt" type="string">
  Creation timestamp (ISO 8601).
</ResponseField>

<Note>
  Only `id` is guaranteed. The other fields may be absent, because the provider version is not loaded on create.
</Note>

## Errors

<ResponseField name="400" type="Bad Request">
  Invalid body — for example a `name` longer than 255 characters, or a malformed `email`.
</ResponseField>

<ResponseField name="401" type="Unauthorized">
  Missing, invalid, or expired API key.
</ResponseField>

<ResponseField name="403" type="Forbidden">
  Your organization is not verified to author integrations, the API key is not org-scoped, or the key owner lacks the **Integration: Full** permission.
</ResponseField>

<ResponseField name="422" type="Unprocessable Entity">
  Rejected downstream after passing validation here — most commonly an `email` on a reserved domain.
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl --request POST \
    --url https://operator.opus.com/api/v1/integration/provider \
    --header 'Content-Type: application/json' \
    --header 'x-service-key: {YOUR_SERVICE_KEY}' \
    --data '{
      "name": "Acme Corp"
    }'
  ```

  ```python Python theme={null}
  import requests

  url = "https://operator.opus.com/api/v1/integration/provider"
  headers = {
      "Content-Type": "application/json",
      "x-service-key": "{YOUR_SERVICE_KEY}"
  }
  payload = {"name": "Acme Corp"}

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

  ```javascript JavaScript theme={null}
  const response = await fetch(
    "https://operator.opus.com/api/v1/integration/provider",
    {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "x-service-key": "{YOUR_SERVICE_KEY}",
      },
      body: JSON.stringify({ name: "Acme Corp" }),
    }
  );

  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ResponseExample>
  ```json 201 Response theme={null}
  {
    "id": "{PROVIDER_ID}",
    "name": "Acme Corp",
    "email": "org-provider@opus.ai",
    "status": "active",
    "icon": "",
    "createdAt": "2026-08-13T10:24:11.000Z"
  }
  ```
</ResponseExample>
