Skip to content

Send a product updates digest

The product_updates.send operation: POST /api/v1/product_updates in the REST API and the product_updates_send tool in the MCP server.

POST/api/v1/product_updates

Emails a product updates digest (a summary of the changelog) to every user who opted in to product updates, once per issue. Users who didn't opt in get nothing: product updates are marketing emails (spec §46.5). Each email has the reader's link to turn product updates off.

Only in Ownrecord's platform organization, by its owners. A dry run tells how many people would get it.

At a glance

  • REST: POST /api/v1/product_updates
  • MCP tool: product_updates_send
  • Operation ID: product_updates.send
  • Scope: Organization
  • Permission: org:admin
  • Risk tier: write
  • Dry run: Supported (send Ownrecord-Dry-Run: true)
  • Idempotency: Idempotency-Key required
  • Modes: Test and live
  • Authentication: API key with the org:admin scope
  • Since: M12

Request

Body

A JSON object (Content-Type: application/json):

FieldTypeRequiredDescription
issuestringYes
subjectstringYes
introstringYes
itemsarray of objectYes
items[].titlestringYes
items[].summarystringYes
items[].urlstringNo

Response

200 OK with a JSON object:

FieldTypeDescription
object"product_update"
issuestring
recipientsinteger (at least 0)

Examples

November's digest

HTTP
POST /api/v1/product_updates
Authorization: Bearer or_test_…
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "issue": "2026-11",
  "subject": "What's new in Ownrecord: November 2026",
  "intro": "Two changes this month.",
  "items": [
    {
      "title": "Mollie",
      "summary": "Connect Mollie as your processor.",
      "url": "https://ownrecord.io/changelog"
    }
  ]
}

Response (200):

JSON
{
  "object": "product_update",
  "issue": "2026-11",
  "recipients": 42
}

Errors

CodeHTTP statusWhenWhat to do
permission_denied403This isn't the platform organization, or you aren't its owner.Ask an organization owner or admin for a role or scope that allows this action.
already_exists409This issue was sent already.Use a different value, or fetch the existing object and update it.
validation_failed400A field is missing or malformed, or too many people opted in for one call.Fix the fields listed in details.issues and send the request again.

It can also return these common errors: api_version_unsupported, invalid_json, unsupported_media_type, authentication_required, api_key_invalid, resource_not_found, idempotency_key_required, idempotency_key_reused, idempotency_in_progress, approval_required, approval_rejected, approval_expired, stale_approval, approval_policy_denied, rate_limited, internal_error.