---
title: "Operating policies"
description: "Create, version, and apply concrete operating configurations to child apps."
canonical: "https://studio.inttegro.dev/api/operating-policies"
format: inttegro-machine-docs/v1
language: "C#"
sdk_version: "v13.1.0"
reader_profile: optional
reader_manifest: "https://studio.inttegro.dev/machine/csharp/readers/index.json"
reader_identification: "Optional: declare your client only if known and your current-session capabilities; use reader_manifest for supplemental recommendations."
preamble_estimated_tokens: 403
model_token_report: "https://studio.inttegro.dev/machine/token-report.json"
preamble_questions: 5
preamble_source: "general"
recommended_mcp_tools: []
estimated_tokens: 5911
token_estimate_method: "utf8_bytes_divided_by_4"
---

## Machine preamble

**Summary:** Create, version, and apply concrete operating configurations to child apps. This C# representation uses the selected SDK's native names wherever Studio has a verified mapping.

### Five questions

#### Q1. When should the reader use Operating policies?

Use this API reference when exact operations, fields, states, or errors are required.

#### Q2. What is authoritative on this page?

Types and enum members link to pinned SDK references; a response field may link only to its containing type. A “wire-only” request field is not a verified native SDK member.

#### Q3. What page-specific constraint matters most?

Do not infer a business workflow from endpoint order or treat request acceptance as proof that an asynchronous outcome completed.

#### Q4. Can Inttegro MCP materially help with this task?

No catalog ability is sufficiently specific to recommend for this page. Use the documentation directly; consult the MCP catalog only if the task later requires governed live account context or a supported operation.

#### Q5. How should the reader verify the answer and continue?

For a read, compare the returned resource with the requested identifier and scope. For a write, preserve its identifier and retrieve authoritative current state before declaring the business outcome complete. Continue with [Lookup an app](https://studio.inttegro.dev/machine/csharp/api/apps.md#lookup-an-app) and [Look up a children policy version](https://studio.inttegro.dev/machine/csharp/api/children-policies.md#look-up-a-children-policy-version) when those concerns enter scope.

## Document content

# Operating policies

An operating policy is the concrete configuration applied to a child app: payment currencies and limits, payout behavior, and payment-method settings. Every selected value must fit within the governing parent's [children policy](https://studio.inttegro.dev/machine/csharp/api/children-policies.md), which defines the choices that parent is allowed to grant.

> **Note:**
>
> This feature is available to selected accounts during private beta.

## Reusable policies and app snapshots

A parent can apply operating settings in two ways:

- Create a named, reusable operating policy, then select it by `op_` ID when creating or updating a child app.
- Send concrete capabilities inline when creating or updating a child app.

Both forms produce an immutable operating-policy snapshot on the child. A snapshot created from a reusable policy records the selected policy ID and version; later versions of that reusable policy do not silently change existing children. Reapply a policy through [Update an app](https://studio.inttegro.dev/machine/csharp/api/apps.md#update-an-app) when the child's configuration should change.

Reusable operating policies use immutable versions. The policy `id` stays stable, while each successful update creates and activates a new `version`. Lookup returns the latest active version by default or a requested version by number. The page endpoint returns the complete history newest first.

## The operating policy object

### Properties

- [`ActiveVersion`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `int`

  Latest active version of this reusable policy.

- [`Capabilities`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `OperatingPolicyCapabilities`

  Concrete payment, payout, and payment-method configuration selected by this
  version.

- [`ChildrenPolicyId`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `string`

  Children policy against which this version was validated.

- [`ChildrenPolicyVersion`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `int`

  Exact children-policy version against which this version was validated.

- [`CreatedAt`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `DateTimeOffset`

  When version one of the reusable policy was created.

- [`Description`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `string?`

  Optional explanation of the account configuration represented by the policy.

- [`Id`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `string`

  Stable reusable-policy identifier beginning with op\_.

- [`Name`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `string`

  Human-readable policy name.

- [`UpdatedAt`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `DateTimeOffset`

  When the active version last changed.

- [`Version`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `int`

  Immutable version represented by this object.

- [`VersionCreatedAt`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `DateTimeOffset`

  When this exact immutable version was created.

### Capability properties

- [`PaymentMethods`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `OperatingPolicyPaymentMethodsCapabilities?`

  Optional concrete settings for
  [`BankAccount`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs),
  [`Card`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs),
  [`MobileMoney`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs), and
  [`Motito`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs). Each included
  method has boolean [`ConfirmsUse`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) and
  [`Enabled`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) values.

- [`Payments`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `OperatingPolicyPaymentsCapabilities?`

  Optional payment configuration.
  [`Currencies`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) contains unique
  lowercase three-letter currency codes.
  [`Max`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) and
  [`Min`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) are inclusive
  amounts in minor currency units.

- [`Payouts`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) — `OperatingPolicyPayoutsCapabilities?`

  Optional payout configuration.
  [`Enabled`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) is a concrete boolean,
  [`Amount`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) is an inclusive
  minor-unit range, and
  [`BTAgingSpec`](https://github.com/inttegro/inttegro-sdk-dotnet/blob/45f9084b6b0dab5eb970498c89bb15f7b581454b/src/Inttegro/Policies.cs) is a platform-owned
  aging configuration.

## Select a policy for an app

The `operating_policy` request attribute is accepted by both [Create an app](https://studio.inttegro.dev/machine/csharp/api/apps.md#create-an-app) and [Update an app](https://studio.inttegro.dev/machine/csharp/api/apps.md#update-an-app). Send exactly one selection form.

To reuse a named policy, send its ID:

```json
{
  "operating_policy": {
    "id": "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL"
  }
}
```

The reusable policy must belong to the parent that governs the child. During app creation, that is the resolved placement parent. During an existing child-app update, it is the child's direct placement parent. Inttegro resolves the policy's latest active version and validates it again against that parent's latest active children policy before saving the child snapshot.

To configure the child directly, send inline capabilities:

```json
{
  "operating_policy": {
    "capabilities": {
      "payment_methods": {
        "card": {
          "confirms_use": true,
          "enabled": true
        },
        "mobile_money": {
          "confirms_use": true,
          "enabled": true
        }
      },
      "payments": {
        "currencies": ["ghs", "usd"],
        "limits": {
          "amount": {
            "max": 9999999,
            "min": 1
          }
        }
      },
      "payouts": {
        "bt_aging_spec": {
          "id": "bt_aging_spec_168_hourly"
        },
        "enabled": false,
        "limits": {
          "amount": {
            "max": 9999999,
            "min": 25000
          }
        }
      }
    }
  }
}
```

For inline input, `payouts.bt_aging_spec` accepts only `id`; Inttegro resolves the platform-owned `t_plus` value. Inline capabilities must fit the same governing parent children policy as a reusable selection.

When `operating_policy` is omitted, Inttegro derives a usable restrictive configuration from the governing children policy: payments keep its permitted currencies and limits; payment methods prefer enabled settings with confirmation; and payouts prefer disabled settings with the longest permitted aging period. If a preferred boolean is not permitted, Inttegro uses an allowed value.

### Snapshot returned on app responses

App responses expose `operating_policy` directly on `app`. The snapshot contains only the resolved capabilities and their source. It does not expose `children_policy_id` or `children_policy_version`.

```json
{
  "app": {
    "id": "app_2LBJqPrTzbXW9E7lFZgMhFtfoytCxewNwXqoUAXe",
    "operating_policy": {
      "capabilities": {
        "payments": {
          "currencies": ["ghs", "usd"],
          "limits": {
            "amount": {
              "max": 9999999,
              "min": 1
            }
          }
        },
        "payouts": {
          "bt_aging_spec": {
            "id": "bt_aging_spec_168_hourly",
            "t_plus": "168h"
          },
          "enabled": false
        }
      },
      "source": {
        "id": "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
        "type": "template",
        "version": 2
      }
    }
  }
}
```

For inline or derived configurations, `source.type` is `inline` and `source.id` and `source.version` are omitted. For reusable selections, `source.type` is `template` and the source includes the exact selected `id` and `version`.

## Create an operating policy

Creates version one of a reusable operating policy. The concrete capabilities must fit the app's latest active children policy.

### Request body

- `Capabilities` — `object` — required

  Concrete capabilities selected within the active children-policy authority.
  At least one capability group is required.

- `Description` — `string`

  Optional description, up to 500 characters.

- `Name` — `string` — required

  Policy name, from 1 to 100 characters.

### Response

Returns the created version in `operating_policy`.

**Request — POST /operating\_policies/create**

```csharp
using Inttegro;

var apiKey = Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")
    ?? throw new InvalidOperationException("INTTEGRO_API_KEY is required");

using var inttegro = new InttegroClient(apiKey);
var operatingPolicy = await inttegro.OperatingPolicies.CreateAsync(
    new CreateOperatingPolicyRequest
    {
        Capabilities = new OperatingPolicyCapabilitiesInput
        {
            Payments = new OperatingPolicyPaymentsCapabilitiesInput
            {
                Currencies = ["ghs", "usd"],
            },
            Payouts = new OperatingPolicyPayoutsCapabilitiesInput
            {
                BTAgingSpec = new PolicyBTAgingSpecReference
                {
                    Id = "bt_aging_spec_168_hourly",
                },
                Enabled = false,
            },
        },
        Description = "Configuration for standard merchant accounts.",
        Name = "Standard merchant",
    }
);
```

```json
{
  "operating_policy": {
    "active_version": 1,
    "capabilities": {
      "payments": {
        "currencies": ["ghs", "usd"]
      },
      "payouts": {
        "bt_aging_spec": {
          "id": "bt_aging_spec_168_hourly",
          "t_plus": "168h"
        },
        "enabled": false
      }
    },
    "children_policy_id": "cp_36vCQl1XPkXvtFGbK5KZ4dZF4lvwURGFoCCqhUcp",
    "children_policy_version": 3,
    "created_at": "2026-11-05T10:00:00Z",
    "description": "Configuration for standard merchant accounts.",
    "id": "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
    "name": "Standard merchant",
    "updated_at": "2026-11-05T10:00:00Z",
    "version": 1,
    "version_created_at": "2026-11-05T10:00:00Z"
  }
}
```

### Errors

- `400 Bad Request` — The request is malformed or contains unsupported attributes.
- `401 Unauthorized` — Authentication is missing or invalid.
- `403 Forbidden` — This feature is not available to the account.
- `409 Conflict` — The governing children policy changed before creation completed. Read the active children policy and retry deliberately.
- `422 Unprocessable Entity` — The requested capabilities are invalid or exceed the active children-policy authority.
- `503 Service Unavailable` — Policy validation or storage is temporarily unavailable. Retry with backoff.

## Look up an operating policy

Returns one version of the specified reusable operating policy. Omit `version` to return the latest active version.

### Request body

- `OperatingPolicyID` — `string` — required

  Reusable policy ID beginning with op\_.

- `Version` — `integer`

  Immutable version to return. Must be at least 1. Omit it to return the
  latest active version.

### Response

Returns the requested version in `operating_policy`.

**Request — POST /operating\_policies/lookup**

```csharp
using Inttegro;

var apiKey = Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")
    ?? throw new InvalidOperationException("INTTEGRO_API_KEY is required");

using var inttegro = new InttegroClient(apiKey);
var operatingPolicy = await inttegro.OperatingPolicies.LookupAsync(
    "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
    2
);
```

```json
{
  "operating_policy": {
    "active_version": 3,
    "capabilities": {
      "payments": {
        "currencies": ["ghs", "usd"]
      },
      "payouts": {
        "bt_aging_spec": {
          "id": "bt_aging_spec_168_hourly",
          "t_plus": "168h"
        },
        "enabled": false
      }
    },
    "children_policy_id": "cp_36vCQl1XPkXvtFGbK5KZ4dZF4lvwURGFoCCqhUcp",
    "children_policy_version": 3,
    "created_at": "2026-11-05T10:00:00Z",
    "description": "Configuration for standard merchant accounts.",
    "id": "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
    "name": "Standard merchant",
    "updated_at": "2026-11-12T15:00:00Z",
    "version": 2,
    "version_created_at": "2026-11-08T09:30:00Z"
  }
}
```

### Errors

- `400 Bad Request` — The policy ID is malformed, or `version` is less than 1.
- `401 Unauthorized` — Authentication is missing or invalid.
- `403 Forbidden` — This feature is not available to the account.
- `404 Not Found` — No policy exists with that ID and version.
- `422 Unprocessable Entity` — The policy cannot be returned safely.
- `503 Service Unavailable` — Policy storage is temporarily unavailable. Retry with backoff.

## Page operating policy versions

Returns the immutable versions of one operating policy newest first.

### Request body

- `Number` — `integer`

  1-based page number. Defaults to 1.

- `OperatingPolicyID` — `string` — required

  Reusable policy ID beginning with op\_.

- `Size` — `integer`

  Number of versions per page. Defaults to 20 and cannot exceed 100.

### Response

The response contains pagination metadata and complete operating policy objects in `page`.

- `Count` — `integer`

  Number of versions returned on this page.

- `HasMore` — `boolean`

  Whether another page of older versions is available.

- `Number` — `integer`

  Current 1-based page number.

- `Size` — `integer`

  Requested page size.

- `Total` — `integer`

  Total number of immutable versions.

- `Versions` — `array`

  Full operating policy objects, ordered newest first.

**Request — POST /operating\_policies/page**

```csharp
using Inttegro;

var apiKey = Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")
    ?? throw new InvalidOperationException("INTTEGRO_API_KEY is required");

using var inttegro = new InttegroClient(apiKey);
var page = await inttegro.OperatingPolicies.PageAsync(
    new PageOperatingPoliciesRequest
    {
        Number = 1,
        OperatingPolicyId = "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
        Size = 2,
    }
);
```

```json
{
  "page": {
    "count": 2,
    "has_more": true,
    "number": 1,
    "size": 2,
    "total": 3,
    "versions": [
      {
        "active_version": 3,
        "capabilities": {
          "payments": {
            "currencies": ["ghs", "usd"]
          },
          "payouts": {
            "bt_aging_spec": {
              "id": "bt_aging_spec_168_hourly",
              "t_plus": "168h"
            },
            "enabled": false
          }
        },
        "children_policy_id": "cp_36vCQl1XPkXvtFGbK5KZ4dZF4lvwURGFoCCqhUcp",
        "children_policy_version": 3,
        "created_at": "2026-11-05T10:00:00Z",
        "description": "Configuration for standard merchant accounts.",
        "id": "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
        "name": "Standard merchant",
        "updated_at": "2026-11-12T15:00:00Z",
        "version": 3,
        "version_created_at": "2026-11-12T15:00:00Z"
      },
      {
        "active_version": 3,
        "capabilities": {
          "payments": {
            "currencies": ["ghs"]
          },
          "payouts": {
            "bt_aging_spec": {
              "id": "bt_aging_spec_168_hourly",
              "t_plus": "168h"
            },
            "enabled": false
          }
        },
        "children_policy_id": "cp_36vCQl1XPkXvtFGbK5KZ4dZF4lvwURGFoCCqhUcp",
        "children_policy_version": 3,
        "created_at": "2026-11-05T10:00:00Z",
        "description": "Initial configuration for standard merchant accounts.",
        "id": "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
        "name": "Standard merchant",
        "updated_at": "2026-11-12T15:00:00Z",
        "version": 2,
        "version_created_at": "2026-11-08T09:30:00Z"
      }
    ]
  }
}
```

### Errors

- `400 Bad Request` — The policy ID is malformed, `number` is less than 1, or `size` is outside 1–100.
- `401 Unauthorized` — Authentication is missing or invalid.
- `403 Forbidden` — This feature is not available to the account.
- `404 Not Found` — No operating policy exists with that ID.
- `422 Unprocessable Entity` — The versions cannot be returned for this operation.
- `503 Service Unavailable` — Policy storage is temporarily unavailable. Retry with backoff.

## Create a new operating policy version

Creates and activates a new immutable version. Send the active version you read as `expected_version`; Inttegro rejects stale writes instead of overwriting a concurrent update. Include at least one of `capabilities`, `description`, or `name`.

### Request body

- `Capabilities` — `object`

  Replacement concrete capabilities. They are validated against the latest
  active children policy.

- `Description` — `string`

  Replacement description, up to 500 characters.

- `ExpectedVersion` — `integer` — required

  Active version returned by the previous lookup. Must be at least 1.

- `Name` — `string`

  Replacement name, from 1 to 100 characters.

- `OperatingPolicyID` — `string` — required

  Reusable policy ID beginning with op\_.

### Response

Returns the new active version in `operating_policy`. Use [Page operating policy versions](#page-operating-policy-versions) to retrieve previous versions.

**Request — POST /operating\_policies/update**

```csharp
using Inttegro;

var apiKey = Environment.GetEnvironmentVariable("INTTEGRO_API_KEY")
    ?? throw new InvalidOperationException("INTTEGRO_API_KEY is required");

using var inttegro = new InttegroClient(apiKey);
var operatingPolicy = await inttegro.OperatingPolicies.UpdateAsync(
    new UpdateOperatingPolicyRequest
    {
        ExpectedVersion = 1,
        Name = "Standard merchant v2",
        OperatingPolicyId = "op_36xByFj7Qf6gdaYxjPE6pSTpSkgJqC6a6f9rR5cL",
    }
);
```

### Errors

- `400 Bad Request` — The request is malformed, does not include a change, or contains unsupported attributes.
- `401 Unauthorized` — Authentication is missing or invalid.
- `403 Forbidden` — This feature is not available to the account.
- `404 Not Found` — No active policy exists with that ID.
- `409 Conflict` — `expected_version` is stale, or the governing children policy changed during validation. Look up both active policies, review the intended change, and retry with the current version.
- `422 Unprocessable Entity` — The new version is invalid or exceeds the active children-policy authority.
- `503 Service Unavailable` — Policy validation or storage is temporarily unavailable. Retry with backoff.

## Related resources

- [Look up a children policy version](https://studio.inttegro.dev/machine/csharp/api/children-policies.md#look-up-a-children-policy-version) — Inspect the authority that constrains operating settings.
- [Create an app](https://studio.inttegro.dev/machine/csharp/api/apps.md#create-an-app) — Apply a reusable or inline operating policy to a new child.
- [Lookup an app](https://studio.inttegro.dev/machine/csharp/api/apps.md#lookup-an-app) — Read the immutable operating-policy snapshot.
- [Update an app](https://studio.inttegro.dev/machine/csharp/api/apps.md#update-an-app) — Replace an existing child's operating-policy snapshot.
