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": "[email protected]",
      "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