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

# Trust Center Updates API: Manage Notifications

> Programmatically create, edit, schedule, archive, and notify subscribers for trust center updates: automate the comms loop after audits or new certifications.

## Overview

Manage the full lifecycle of trust center updates: create new updates, edit existing ones, schedule notifications, archive/unarchive, manage subscribers, and organize updates with categories.

Automate your trust center communication workflow, for example, posting security updates after compliance audits or notifying subscribers about new certifications.

All endpoints require Admin role authentication.

## Create an update

**URL:** `POST https://api.wolfia.com/v1/trustportal/updates`

**Authentication:** API key required, Admin role (see [API overview](/how-to/api-overview))

### Request

```bash theme={null}
curl -X POST https://api.wolfia.com/v1/trustportal/updates \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "SOC 2 Type II Audit Complete",
    "description": "We have successfully completed our annual SOC 2 Type II audit with no exceptions noted.",
    "update_date": "2025-02-01T00:00:00Z",
    "link": "https://trust.yourcompany.com/soc2-report",
    "link_text": "View the report",
    "send_immediately": true,
    "timezone": "America/New_York",
    "category_ids": ["category-uuid-1"]
  }'
```

### Request body

| Parameter           | Type              | Required | Description                                                                                      |
| ------------------- | ----------------- | -------- | ------------------------------------------------------------------------------------------------ |
| `title`             | string            | Yes      | Title of the update                                                                              |
| `description`       | string            | Yes      | Update content (supports markdown)                                                               |
| `update_date`       | string or integer | Yes      | Date for the update (ISO 8601 string like `"2025-02-01T00:00:00Z"` or Unix timestamp in seconds) |
| `link`              | string            | No       | URL to link in the update                                                                        |
| `link_text`         | string            | No       | Display text for the link                                                                        |
| `scheduled_at`      | string or integer | No       | When to send notification (ISO 8601 string or Unix timestamp in seconds)                         |
| `timezone`          | string            | No       | Timezone for scheduling (e.g., `America/New_York`)                                               |
| `schedule_disabled` | boolean           | No       | Set `true` to create without scheduling                                                          |
| `send_immediately`  | boolean           | No       | Set `true` to send notification right away                                                       |
| `category_ids`      | array of strings  | No       | Category IDs to tag the update with                                                              |

<Note>
  **Scheduling options:**

  * `send_immediately: true`, sends notification right away
  * `scheduled_at` with future timestamp, schedules for later
  * `schedule_disabled: true`, creates update without notification
</Note>

### Response (200 OK)

```json theme={null}
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "title": "SOC 2 Type II Audit Complete",
  "description": "We have successfully completed our annual SOC 2 Type II audit with no exceptions noted.",
  "link": "https://trust.yourcompany.com/soc2-report",
  "link_text": "View the report",
  "update_date": 1738368000000000,
  "status": "ACTIVE",
  "created_at": 1738368000000000,
  "updated_at": 1738368000000000,
  "scheduled_at": 1738368000000000,
  "timezone": "America/New_York",
  "schedule_disabled": false,
  "categories": [
    {
      "id": "category-uuid-1",
      "name": "Compliance"
    }
  ]
}
```

## Edit an update

**URL:** `PATCH https://api.wolfia.com/v1/trustportal/updates/{update_id}`

**Authentication:** API key required, Admin role

All fields are optional: only include what you want to change.

### Request

```bash theme={null}
curl -X PATCH https://api.wolfia.com/v1/trustportal/updates/UPDATE_UUID_HERE \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "SOC 2 Type II Audit Complete - Updated",
    "description": "Updated description with additional details."
  }'
```

### Request body

| Parameter           | Type              | Required | Description                                                                     |
| ------------------- | ----------------- | -------- | ------------------------------------------------------------------------------- |
| `title`             | string            | No       | New title                                                                       |
| `description`       | string            | No       | New description                                                                 |
| `link`              | string            | No       | New link URL                                                                    |
| `link_text`         | string            | No       | New link text                                                                   |
| `update_date`       | string or integer | No       | New update date (ISO 8601 string or Unix timestamp in seconds)                  |
| `scheduled_at`      | string or integer | No       | Reschedule notification delivery (ISO 8601 string or Unix timestamp in seconds) |
| `timezone`          | string            | No       | New timezone                                                                    |
| `schedule_disabled` | boolean           | No       | Disable scheduled delivery                                                      |
| `send_immediately`  | boolean           | No       | Send notification immediately                                                   |
| `category_ids`      | array of strings  | No       | Replace category assignments                                                    |

## Archive an update

**URL:** `POST https://api.wolfia.com/v1/trustportal/updates/{update_id}/archive`

**Authentication:** API key required, Admin role

Archives an update and cancels any scheduled notification.

```bash theme={null}
curl -X POST https://api.wolfia.com/v1/trustportal/updates/UPDATE_UUID_HERE/archive \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"
```

### Response (200 OK)

```json theme={null}
{
  "message": "Update archived successfully"
}
```

## Unarchive an update

**URL:** `POST https://api.wolfia.com/v1/trustportal/updates/{update_id}/unarchive`

**Authentication:** API key required, Admin role

Restores a previously archived update.

```bash theme={null}
curl -X POST https://api.wolfia.com/v1/trustportal/updates/UPDATE_UUID_HERE/unarchive \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"
```

## List updates

**URL:** `GET https://api.wolfia.com/v1/trustportal/updates`

**Authentication:** API key required, Admin role

Returns a list of trust portal updates with optional filtering.

### Request

```bash theme={null}
curl -X GET 'https://api.wolfia.com/v1/trustportal/updates?limit=10&include_archived=false' \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"
```

### Query parameters

| Parameter          | Type    | Required | Default | Description                               |
| ------------------ | ------- | -------- | ------- | ----------------------------------------- |
| `skip`             | integer | No       | 0       | Number of items to skip                   |
| `limit`            | integer | No       | all     | Max items to return (1-1000)              |
| `include_archived` | boolean | No       | false   | Include archived updates                  |
| `category_ids`     | string  | No       | -       | Comma-separated category IDs to filter by |

### Response (200 OK)

```json theme={null}
[
  {
    "id": "update-uuid-1",
    "title": "SOC 2 Type II Audit Complete",
    "description": "We have successfully completed our annual audit...",
    "update_date": 1738368000000000,
    "status": "ACTIVE",
    "created_at": 1738368000000000,
    "updated_at": 1738368000000000,
    "scheduled_at": 1738368000000000,
    "timezone": "UTC",
    "schedule_disabled": false,
    "categories": [{"id": "cat-uuid", "name": "Compliance"}]
  },
  {
    "id": "update-uuid-2",
    "title": "New ISO 27001 Certification",
    "description": "We are proud to announce...",
    "update_date": 1738281600000000,
    "status": "ARCHIVED",
    "created_at": 1738281600000000,
    "updated_at": 1738281600000000,
    "scheduled_at": null,
    "timezone": "UTC",
    "schedule_disabled": true,
    "categories": []
  }
]
```

## List subscribers

**URL:** `GET https://api.wolfia.com/v1/trustportal/updates/subscribers`

**Authentication:** API key required, Admin role

Returns a paginated list of trust portal update subscribers.

### Request

```bash theme={null}
curl -X GET 'https://api.wolfia.com/v1/trustportal/updates/subscribers?page=1&page_size=20' \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"
```

### Query parameters

| Parameter   | Type    | Required | Default | Description                |
| ----------- | ------- | -------- | ------- | -------------------------- |
| `page`      | integer | No       | 1       | Page number                |
| `page_size` | integer | No       | 10      | Items per page (1-100)     |
| `search`    | string  | No       | -       | Search by subscriber email |

### Response (200 OK)

```json theme={null}
{
  "subscribers": [
    {
      "id": "sub-uuid-1",
      "email": "reviewer@company.com",
      "first_name": "Jane",
      "last_name": "Smith",
      "company_name": "Enterprise Corp",
      "consent_type": "ACCESS_REQUEST",
      "is_active": true,
      "subscribed_at": 1735689600000000,
      "unsubscribed_at": null
    }
  ],
  "total": 42,
  "page": 1,
  "page_size": 20,
  "total_pages": 3
}
```

## Unsubscribe a user

**URL:** `POST https://api.wolfia.com/v1/trustportal/updates/subscribers/{subscription_id}/unsubscribe`

**Authentication:** API key required, Admin role

Unsubscribe a user from trust portal updates.

### Request

```bash theme={null}
curl -X POST https://api.wolfia.com/v1/trustportal/updates/subscribers/SUB_UUID_HERE/unsubscribe \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"
```

### Response (200 OK)

```json theme={null}
{
  "message": "Successfully unsubscribed",
  "already_unsubscribed": false
}
```

## Manage categories

Categories let you organize trust portal updates by topic (e.g., "Compliance", "Security", "Product"). Create categories first, then reference their IDs when creating or editing updates via the `category_ids` field.

### List categories

**URL:** `GET https://api.wolfia.com/v1/trustportal/update-categories`

**Authentication:** API key required, Admin role

Returns all update categories for your trust portal.

```bash theme={null}
curl -X GET 'https://api.wolfia.com/v1/trustportal/update-categories?limit=100&offset=0' \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"
```

#### Query parameters

| Parameter | Type    | Required | Default | Description             |
| --------- | ------- | -------- | ------- | ----------------------- |
| `limit`   | integer | No       | all     | Max items to return     |
| `offset`  | integer | No       | 0       | Number of items to skip |

#### Response (200 OK)

```json theme={null}
{
  "categories": [
    {
      "id": "category-uuid-1",
      "name": "Compliance",
      "created_at": 1738368000000000,
      "updated_at": 1738368000000000,
      "update_count": 5
    },
    {
      "id": "category-uuid-2",
      "name": "Security",
      "created_at": 1738281600000000,
      "updated_at": 1738281600000000,
      "update_count": 3
    }
  ],
  "total_count": 2,
  "limit": 100,
  "offset": 0
}
```

### Create a category

**URL:** `POST https://api.wolfia.com/v1/trustportal/update-categories`

**Authentication:** API key required, Admin role

```bash theme={null}
curl -X POST https://api.wolfia.com/v1/trustportal/update-categories \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Compliance"
  }'
```

#### Request body

| Parameter | Type   | Required | Description                    |
| --------- | ------ | -------- | ------------------------------ |
| `name`    | string | Yes      | Category name (must be unique) |

#### Response (200 OK)

```json theme={null}
{
  "id": "category-uuid-1",
  "name": "Compliance",
  "created_at": 1738368000000000,
  "updated_at": 1738368000000000,
  "update_count": 0
}
```

Returns `409` if a category with the same name already exists.

### Rename a category

**URL:** `PATCH https://api.wolfia.com/v1/trustportal/update-categories/{category_id}`

**Authentication:** API key required, Admin role

```bash theme={null}
curl -X PATCH https://api.wolfia.com/v1/trustportal/update-categories/CATEGORY_UUID_HERE \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Compliance & Audit"
  }'
```

#### Request body

| Parameter | Type   | Required | Description                        |
| --------- | ------ | -------- | ---------------------------------- |
| `name`    | string | Yes      | New category name (must be unique) |

#### Response (200 OK)

```json theme={null}
{
  "id": "category-uuid-1",
  "name": "Compliance & Audit",
  "created_at": 1738368000000000,
  "updated_at": 1738454400000000,
  "update_count": 5
}
```

### Delete a category

**URL:** `DELETE https://api.wolfia.com/v1/trustportal/update-categories/{category_id}`

**Authentication:** API key required, Admin role

Removes a category. Updates that were tagged with this category will no longer have it.

```bash theme={null}
curl -X DELETE https://api.wolfia.com/v1/trustportal/update-categories/CATEGORY_UUID_HERE \
  -H "X-API-Key: wolfia-api-YOUR_KEY_HERE"
```

#### Response (200 OK)

```json theme={null}
{
  "message": "Category deleted successfully"
}
```

## Integration example

```python theme={null}
import os
from datetime import datetime

import requests

API_KEY = os.environ['WOLFIA_API_KEY']
BASE_URL = 'https://api.wolfia.com/v1'


def post_compliance_update(title, description, link=None, send_immediately=True):
    """Post a new trust center update."""
    headers = {
        'X-API-Key': API_KEY,
        'Content-Type': 'application/json',
    }

    payload = {
        'title': title,
        'description': description,
        'update_date': datetime.now().strftime('%Y-%m-%dT%H:%M:%SZ'),
        'send_immediately': send_immediately,
        'timezone': 'America/New_York',
    }

    if link:
        payload['link'] = link
        payload['link_text'] = 'Learn more'

    response = requests.post(
        f'{BASE_URL}/trustportal/updates',
        headers=headers,
        json=payload,
        timeout=30,
    )
    response.raise_for_status()

    update = response.json()
    print(f"Published: {update['id']} - {update['title']}")
    return update


def list_recent_updates(limit=5):
    """List recent trust portal updates."""
    headers = {'X-API-Key': API_KEY}

    response = requests.get(
        f'{BASE_URL}/trustportal/updates',
        headers=headers,
        params={'limit': limit},
        timeout=30,
    )
    response.raise_for_status()

    updates = response.json()
    for update in updates:
        created = datetime.fromtimestamp(update['created_at'] / 1_000_000)
        print(f"[{update['status']}] {update['title']} ({created.strftime('%Y-%m-%d')})")

    return updates


if __name__ == '__main__':
    post_compliance_update(
        title="Quarterly Penetration Test Complete",
        description=(
            "Our Q1 2025 penetration test has been completed by an independent third-party firm. "
            "No critical or high-severity findings were identified."
        ),
        link="https://trust.yourcompany.com",
    )

    print("\nRecent updates:")
    list_recent_updates()
```

## Error responses

| Status | Meaning                  | Solution                                                                     |
| ------ | ------------------------ | ---------------------------------------------------------------------------- |
| 401    | Invalid API key          | Verify your API key is correct                                               |
| 403    | Insufficient permissions | Ensure API key owner has Admin role                                          |
| 404    | Resource not found       | Verify the resource ID exists                                                |
| 409    | Duplicate category name  | Use a unique name for each category                                          |
| 422    | Invalid request          | Check required fields (`title`, `description`, `update_date`) and ID formats |
| 500    | Server error             | Retry with exponential backoff                                               |

## Next steps

<CardGroup cols={2}>
  <Card title="Trust portal analytics" icon="chart-mixed" href="/how-to/api-trust-portal-analytics">
    Access engagement metrics and revenue data
  </Card>

  <Card title="API overview" icon="code" href="/how-to/api-overview">
    Learn about API authentication and best practices
  </Card>
</CardGroup>
