In brief
The SDK Azure API Management for Python manages APIM services, API, products, subscriptions and strategies through ApiManagementClient. The skills chain typical operations: creating the service, importing an API from OpenAPI or from an URL, listing API, creating a product, attaching an API, creating a subscription, setting up a strategy. This is not the passage of a business call through the bridge: it is the administration of the bridge. The authentication follows DefaultAzureCredential locally and a production credential in Azure, without sync/aio mixture.
What it does
- Service cover, import of the API, products, subscriptions and policies, as the SKILL.md illustrates.
- Remains in the management plan; The execution of API traffic is not its object.
- Preferred Enter ID to an administration key stored in the repository.
- Allows you to import an OpenAPI specification or an API from an URL and then offer it in a product.
Who it is for, and an example
Platform teams that industrialize the configuration of the Python Management d
Example request: We import an OpenAPI specification, we create a product, we attach the
When you mention azure-mgmt-apimanagement, ApiManagementClient, APIM, an API gateway or API Management in Python. Example written by iadujour.fr from the SKILL.md, not tested.
Install
npx skills add microsoft/skills (selection of the skill in the assistant, README).
npx skills add microsoft/skillsWorks with
- GitHub Copilot
- Copilot CLI
Source: README: examples of Copilot CLI and GitHub Copilot in VS Code; installation `npx skills add` sends files to the chosen agent directory, without an exhaustive list.
Level: Advanced
Suppose a publisher's project, an SDK and often administrative rights.
Good to know
SKILL.md excerpt
The original description, which the agent reads to decide whether to load the skill (in English):
Azure API Management SDK for Python. Use for managing APIM services, APIs, products, subscriptions, and policies.
Triggers: "azure-mgmt-apimanagement", "ApiManagementClient", "APIM", "API gateway", "API Management".
Quoted from SKILL.md at commit 4a2873f . The folder also contains 2 extra files (references/).
The SKILL.md has 293 lines and 17 main sections:
- Installation
- Environment Variables
- Authentication & Lifecycle
- Create APIM Service
- Import API from OpenAPI
- Import API from URL
- List APIs
- Create Product
- Add API to Product
- Create Subscription
- Set API Policy
- Create Named Value (Secret)
- Create Backend
- Create User
- Operation Groups
- Best Practices
- Reference Files
Licence: MIT
Checked on 10 November 2026 : repository LICENSE file . Licence declared in the frontmatter: “MIT”. Rights holder: Copyright (c) Microsoft Corporation..
The licence allows reuse: the full SKILL.md text is reproduced below, unmodified, with its licence notice.
Full SKILL.md text
Reproduced unmodified from microsoft/skills (commit 4a2873f) , © Microsoft, under licence MIT (original licence file ).
Show the original SKILL.md (293 lines, in English)
---
name: azure-mgmt-apimanagement-py
description: |
Azure API Management SDK for Python. Use for managing APIM services, APIs, products, subscriptions, and policies.
Triggers: "azure-mgmt-apimanagement", "ApiManagementClient", "APIM", "API gateway", "API Management".
license: MIT
metadata:
author: Microsoft
version: "1.0.0"
package: azure-mgmt-apimanagement
---
# Azure API Management SDK for Python
Manage Azure API Management services, APIs, products, and policies.
## Installation
```bash
pip install azure-mgmt-apimanagement
pip install azure-identity
```
## Environment Variables
```bash
AZURE_SUBSCRIPTION_ID=your-subscription-id # Required for all auth methods
AZURE_TOKEN_CREDENTIALS=prod # Required only if DefaultAzureCredential is used in production
```
## Authentication & Lifecycle
> **🔑 Two rules apply to every code sample below:**
>
> 1. **Prefer `DefaultAzureCredential`.** It works locally (Azure CLI / VS Code / Developer CLI) and in Azure (managed identity, workload identity) with no code change. Avoid connection strings, account/API keys — they bypass Entra audit and rotation.
> - Local dev: `DefaultAzureCredential` works as-is.
> - Production: set `AZURE_TOKEN_CREDENTIALS=prod` (or `AZURE_TOKEN_CREDENTIALS=<specific_credential>`) to constrain the credential chain to production-safe credentials.
> 2. **Wrap every client in a context manager** so HTTP transports, sockets, and token caches are released deterministically:
> - Sync: `with <Client>(...) as client:`
> - Async: `async with <Client>(...) as client:` **and** `async with DefaultAzureCredential() as credential:` (from `azure.identity.aio`)
>
> Snippets may abbreviate this setup, but production code should always follow both rules.
```python
from azure.identity import DefaultAzureCredential
from azure.mgmt.apimanagement import ApiManagementClient
import os
with ApiManagementClient(
credential=DefaultAzureCredential(),
subscription_id=os.environ["AZURE_SUBSCRIPTION_ID"]
) as client:
# Use `client` for all subsequent operations (see examples below)
...
```
## Create APIM Service
```python
from azure.mgmt.apimanagement.models import (
ApiManagementServiceResource,
ApiManagementServiceSkuProperties,
SkuType
)
service = client.api_management_service.begin_create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
parameters=ApiManagementServiceResource(
location="eastus",
publisher_email="admin@example.com",
publisher_name="My Organization",
sku=ApiManagementServiceSkuProperties(
name=SkuType.DEVELOPER,
capacity=1
)
)
).result()
print(f"Created APIM: {service.name}")
```
## Import API from OpenAPI
```python
from azure.mgmt.apimanagement.models import (
ApiCreateOrUpdateParameter,
ContentFormat,
Protocol
)
api = client.api.begin_create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
api_id="my-api",
parameters=ApiCreateOrUpdateParameter(
display_name="My API",
path="myapi",
protocols=[Protocol.HTTPS],
format=ContentFormat.OPENAPI_JSON,
value='{"openapi": "3.0.0", "info": {"title": "My API", "version": "1.0"}, "paths": {"/health": {"get": {"responses": {"200": {"description": "OK"}}}}}}'
)
).result()
print(f"Imported API: {api.display_name}")
```
## Import API from URL
```python
api = client.api.begin_create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
api_id="petstore",
parameters=ApiCreateOrUpdateParameter(
display_name="Petstore API",
path="petstore",
protocols=[Protocol.HTTPS],
format=ContentFormat.OPENAPI_LINK,
value="https://petstore.swagger.io/v2/swagger.json"
)
).result()
```
## List APIs
```python
apis = client.api.list_by_service(
resource_group_name="my-resource-group",
service_name="my-apim"
)
for api in apis:
print(f"{api.name}: {api.display_name} - {api.path}")
```
## Create Product
```python
from azure.mgmt.apimanagement.models import ProductContract
product = client.product.create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
product_id="premium",
parameters=ProductContract(
display_name="Premium",
description="Premium tier with unlimited access",
subscription_required=True,
approval_required=False,
state="published"
)
)
print(f"Created product: {product.display_name}")
```
## Add API to Product
```python
client.product_api.create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
product_id="premium",
api_id="my-api"
)
```
## Create Subscription
```python
from azure.mgmt.apimanagement.models import SubscriptionCreateParameters
subscription = client.subscription.create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
sid="my-subscription",
parameters=SubscriptionCreateParameters(
display_name="My Subscription",
scope=f"/products/premium",
state="active"
)
)
print(f"Subscription key: {subscription.primary_key}")
```
## Set API Policy
```python
from azure.mgmt.apimanagement.models import PolicyContract
policy_xml = """
<policies>
<inbound>
<rate-limit calls="100" renewal-period="60" />
<set-header name="X-Custom-Header" exists-action="override">
<value>CustomValue</value>
</set-header>
</inbound>
<backend>
<forward-request />
</backend>
<outbound />
<on-error />
</policies>
"""
client.api_policy.create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
api_id="my-api",
policy_id="policy",
parameters=PolicyContract(
value=policy_xml,
format="xml"
)
)
```
## Create Named Value (Secret)
```python
from azure.mgmt.apimanagement.models import NamedValueCreateContract
named_value = client.named_value.begin_create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
named_value_id="backend-api-key",
parameters=NamedValueCreateContract(
display_name="Backend API Key",
value="secret-key-value",
secret=True
)
).result()
```
## Create Backend
```python
from azure.mgmt.apimanagement.models import BackendContract
backend = client.backend.create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
backend_id="my-backend",
parameters=BackendContract(
url="https://api.backend.example.com",
protocol="http",
description="My backend service"
)
)
```
## Create User
```python
from azure.mgmt.apimanagement.models import UserCreateParameters
user = client.user.create_or_update(
resource_group_name="my-resource-group",
service_name="my-apim",
user_id="newuser",
parameters=UserCreateParameters(
email="user@example.com",
first_name="John",
last_name="Doe"
)
)
```
## Operation Groups
| Group | Purpose |
|-------|---------|
| `api_management_service` | APIM instance management |
| `api` | API operations |
| `api_operation` | API operation details |
| `api_policy` | API-level policies |
| `product` | Product management |
| `product_api` | Product-API associations |
| `subscription` | Subscription management |
| `user` | User management |
| `named_value` | Named values/secrets |
| `backend` | Backend services |
| `certificate` | Certificates |
| `gateway` | Self-hosted gateways |
## Best Practices
1. **Pick sync OR async and stay consistent.** Do not mix `azure.xxx` sync clients with `azure.xxx.aio` async clients in the same call path. Choose one mode per module.
2. **Always use context managers for clients and async credentials.** Wrap every client in `with Client(...) as client:` (sync) or `async with Client(...) as client:` (async). For async `DefaultAzureCredential` from `azure.identity.aio`, also use `async with credential:` so tokens and transports are cleaned up.
3. **Use named values** for secrets and configuration
4. **Apply policies** at appropriate scopes (global, product, API, operation)
5. **Use products** to bundle APIs and manage access
6. **Enable Application Insights** for monitoring
7. **Use backends** to abstract backend services
8. **Version your APIs** using APIM's versioning features
## Reference Files
| File | Contents |
|------|----------|
| [references/capabilities.md](references/capabilities.md) | Additional non-hero capabilities, operation-group coverage, and production checklists. |
| [references/non-hero-scenarios.md](references/non-hero-scenarios.md) | Dedicated non-hero examples for secondary/advanced scenarios. |
Comments.
A field note, a question, a precision on this skill? Comments are reviewed before publication.
Published comments
Loading comments…
Leave a comment
Moderation charter. Every comment is reviewed before publication. We refuse hate speech, insulting or discriminatory language, advertising, spam and promotional links, off-topic posts and other people’s personal data.