Sherweb API Patterns — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Sherweb API Patterns (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The Sherweb Partner API provides programmatic access to distributor-level operations including customer management, subscription lifecycle, and billing data. The API uses OAuth 2.0 client credentials flow for authentication, requires a subscription key header for API management, and exposes two main scopes: distributor and service-provider. This skill covers authentication, endpoints, MCP tool usage, error handling, and best practices.
with a single hosted-MCP token, names tools with hyphens, and paginates from page 0, against Sherweb's OAuth client-credentials plus subscription-key header, underscored tool names, and 1-based paging. Use pax8-api-patterns. Copying a paging pattern between the two silently changes which records you get.
call succeeds** — that is a gateway-connection problem; use shared-skills-wyre-gateway-troubleshooting.
disclosure, so domain tools are only visible after sherweb_navigate or sherweb_list_categories. Check discovery before concluding a capability is missing. Two capabilities really are absent, and no amount of discovery will surface them: billing-period enumeration and invoice retrieval. See the billing tool table below.
Sherweb uses the OAuth 2.0 client credentials grant for machine-to-machine authentication. No user interaction is required.
Token Endpoint:
POST https://api.sherweb.com/auth/oidc/connect/tokenRequest Parameters:
| Parameter | Value |
|---|---|
grant_type | client_credentials |
client_id | Your Sherweb Client ID |
client_secret | Your Sherweb Client Secret |
scope | distributor or service-provider (see Scopes section) |
Token Response:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6...",
"expires_in": 3600,
"token_type": "Bearer"
}Key details:
Authorization headerIn addition to the Bearer token, every API request must include the API management subscription key:
| Header | Value | Description |
|---|---|---|
Ocp-Apim-Subscription-Key | Your subscription key | API management gateway key |
This key is obtained from the Sherweb Partner Portal (cumulus.sherweb.com) under Security > APIs.
Every API request must include:
| Header | Value |
|---|---|
Authorization | Bearer <access_token> |
Ocp-Apim-Subscription-Key | <subscription_key> |
Content-Type | application/json |
Accept | application/json |
export SHERWEB_CLIENT_ID="your-client-id"
export SHERWEB_CLIENT_SECRET="your-client-secret"
export SHERWEB_SUBSCRIPTION_KEY="your-subscription-key"
export SHERWEB_MCP_URL="https://your-sherweb-mcp-url"Sherweb supports two API scopes that control the level of access:
| Scope | Description | Base URL |
|---|---|---|
distributor | Full distributor-level access to all service providers and their customers | https://api.sherweb.com/distributor/v1 |
service-provider | Scoped to a single service provider (MSP) and their customers | https://api.sherweb.com/service-provider/v1 |
| Scope | Base URL |
|---|---|
| Distributor | https://api.sherweb.com/distributor/v1 |
| Service Provider | https://api.sherweb.com/service-provider/v1 |
| Endpoint | Method | Description |
|---|---|---|
/customers | GET | List customers |
/customers/{customerId} | GET | Get customer details |
/customers/{customerId}/accounts-receivable | GET | Customer AR data |
/customers/{customerId}/subscriptions | GET | List a customer's subscriptions |
/customers/{customerId}/subscriptions/{subscriptionId} | GET | Get subscription details |
/customers/{customerId}/subscriptions/{subscriptionId}/change-quantity | POST | Change subscription quantity |
/catalog/products | GET | List catalog products |
/payable-charges | GET | Get payable charges for a date range (distributor scope) |
/payable-charges/{chargeId} | GET | Get one charge's breakdown (distributor scope) |
There is no billing-period endpoint and no invoice endpoint behind this connector. See the billing tool table below.
| Tool | Description | Parameters |
|---|---|---|
sherweb_customers_list | List and search customers | search, page, pageSize |
sherweb_customers_get | Get a single customer | customerId (required) |
sherweb_customers_accounts_receivable | Get customer AR data | customerId (required) |
Every subscription tool is scoped by customer — customerId is required on all three, because the underlying routes are nested under /customers/{id}.
| Tool | Description | Parameters |
|---|---|---|
sherweb_subscriptions_list | List a customer's subscriptions | customerId (required), page, pageSize |
sherweb_subscriptions_get | Get a single subscription | customerId (required), subscriptionId (required) |
sherweb_subscriptions_change_quantity | Set seat count (absolute, not a delta) | customerId (required), subscriptionId (required), quantity (required) |
| Tool | Description | Parameters |
|---|---|---|
sherweb_catalog_list_products | Browse the Sherweb product catalog | search, page, pageSize |
| Tool | Description | Parameters | ||
|---|---|---|---|---|
sherweb_billing_payable_charges | Get charges for an explicit date range | billingCycleType (OneTime\ | Monthly\ | Yearly), periodFrom, periodTo, page, pageSize |
sherweb_billing_charge_details | Get charge breakdown | chargeId (required) |
Billing capabilities this connector does not have. There is no tool that enumerates billing periods, and no tool that lists or fetches invoices. sherweb_billing_payable_charges takes the window you give it as periodFrom/periodTo; you cannot ask which periods exist. For invoices, the closest surfaces are sherweb_billing_charge_details (line items of one charge) and sherweb_customers_accounts_receivable (a customer's outstanding balance) — neither is an invoice, and neither should be presented as one. See sherweb-billing for the full statement.
| Tool | Description | Parameters |
|---|---|---|
sherweb_status | Show credentials status and available domains | — |
sherweb_navigate | Discover tools by domain | domain (required) |
sherweb_list_categories | List tool categories with counts | — |
sherweb_list_category_tools | List a category's tools with full schemas | category (required) |
sherweb_router | Suggest tools for a plain-language intent | intent (required) |
sherweb_execute_tool | Dispatch any Sherweb tool by name | toolName (required) |
All list endpoints use 1-based page pagination:
| Parameter | Description | Default | Max |
|---|---|---|---|
page | Page number (1-based) | 1 | - |
pageSize | Results per page | 25 | 100 |
Pagination Response Metadata:
| Field | Description |
|---|---|
page | Current page number |
pageSize | Number of results per page |
totalCount | Total number of records |
totalPages | Total number of pages |
To iterate: call with page=1 and pageSize=100, read totalPages, then increment page until page >= totalPages, collecting each response.
The Sherweb API supports localized responses via the Accept-Language header:
| Header | Values | Description |
|---|---|---|
Accept-Language | en, fr | Response language (English or French) |
This is particularly useful since Sherweb is a Canadian company with bilingual support. Product names, descriptions, and error messages can be returned in either language.
Caching strategy:
current_time + expires_in)| Metric | Limit |
|---|---|
| Requests per second | Varies by endpoint |
| Requests per minute | Varies by subscription tier |
When rate limited, the API returns a 429 Too Many Requests response with:
| Header | Description |
|---|---|
Retry-After | Seconds to wait before retrying |
Rate limit strategy:
Retry-After header when presentpageSize=100 to minimize pagination requests| Code | Description | Action |
|---|---|---|
| 200 | Success | Process response |
| 400 | Bad Request | Check request parameters |
| 401 | Unauthorized | Token expired or invalid; re-authenticate |
| 403 | Forbidden | Insufficient scope or permissions |
| 404 | Not Found | Resource does not exist |
| 409 | Conflict | Conflicting operation (e.g., pending change) |
| 429 | Too Many Requests | Rate limited; wait and retry |
| 500 | Internal Server Error | Sherweb server issue; retry with backoff |
| 503 | Service Unavailable | Temporary outage; retry later |
Authentication Error (401):
{
"error": "invalid_token",
"error_description": "The access token has expired"
}Validation Error (400):
{
"errors": [
{
"field": "quantity",
"message": "Quantity must be greater than 0"
}
]
}Rate Limit (429):
{
"statusCode": 429,
"message": "Rate limit exceeded. Retry after 30 seconds."
}Ocp-Apim-Subscription-Key header is setGET /customers?pageSize=1 to verify authentication worksAccept-Language: en (or fr) for consistent response language~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.