Skip to main content

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)

Request

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

ParameterTypeRequiredDescription
titlestringYesTitle of the update
descriptionstringYesUpdate content (supports markdown)
update_datestring or integerYesDate for the update (ISO 8601 string like "2025-02-01T00:00:00Z" or Unix timestamp in seconds)
linkstringNoURL to link in the update
link_textstringNoDisplay text for the link
scheduled_atstring or integerNoWhen to send notification (ISO 8601 string or Unix timestamp in seconds)
timezonestringNoTimezone for scheduling (e.g., America/New_York)
schedule_disabledbooleanNoSet true to create without scheduling
send_immediatelybooleanNoSet true to send notification right away
category_idsarray of stringsNoCategory IDs to tag the update with
Scheduling options:
  • send_immediately: true, sends notification right away
  • scheduled_at with future timestamp, schedules for later
  • schedule_disabled: true, creates update without notification

Response (200 OK)

{
  "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

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

ParameterTypeRequiredDescription
titlestringNoNew title
descriptionstringNoNew description
linkstringNoNew link URL
link_textstringNoNew link text
update_datestring or integerNoNew update date (ISO 8601 string or Unix timestamp in seconds)
scheduled_atstring or integerNoReschedule notification delivery (ISO 8601 string or Unix timestamp in seconds)
timezonestringNoNew timezone
schedule_disabledbooleanNoDisable scheduled delivery
send_immediatelybooleanNoSend notification immediately
category_idsarray of stringsNoReplace 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.
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)

{
  "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.
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

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

ParameterTypeRequiredDefaultDescription
skipintegerNo0Number of items to skip
limitintegerNoallMax items to return (1-1000)
include_archivedbooleanNofalseInclude archived updates
category_idsstringNo-Comma-separated category IDs to filter by

Response (200 OK)

[
  {
    "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

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

ParameterTypeRequiredDefaultDescription
pageintegerNo1Page number
page_sizeintegerNo10Items per page (1-100)
searchstringNo-Search by subscriber email

Response (200 OK)

{
  "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

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)

{
  "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.
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

ParameterTypeRequiredDefaultDescription
limitintegerNoallMax items to return
offsetintegerNo0Number of items to skip

Response (200 OK)

{
  "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
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

ParameterTypeRequiredDescription
namestringYesCategory name (must be unique)

Response (200 OK)

{
  "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
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

ParameterTypeRequiredDescription
namestringYesNew category name (must be unique)

Response (200 OK)

{
  "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.
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)

{
  "message": "Category deleted successfully"
}

Integration example

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

StatusMeaningSolution
401Invalid API keyVerify your API key is correct
403Insufficient permissionsEnsure API key owner has Admin role
404Resource not foundVerify the resource ID exists
409Duplicate category nameUse a unique name for each category
422Invalid requestCheck required fields (title, description, update_date) and ID formats
500Server errorRetry with exponential backoff

Next steps

Trust portal analytics

Access engagement metrics and revenue data

API overview

Learn about API authentication and best practices