notiflowsDocs
Feed

Batch update feed entries

Update multiple feed entries' state in a single request. Useful for "mark all as read" functionality.

Idempotent Semantics:

Same as single entry update - timestamps are only set if currently null:

  • seen: true → Sets seen_at if null
  • read: true → Sets read_at if null
  • clicked: true → Sets clicked_at if null
  • archived: true → Sets archived_at if null
  • archived: false → Clears archived_at

Invalid Operations:

Returns 409 Conflict for:

  • seen: false, read: false, clicked: false

Partial Success:

All entries in the request are updated atomically. If any entry fails validation, the entire request fails and no entries are updated.

PATCH
/channels/{channel_id}/feed/entries

Authorization

ApiKeyAuth UserKeyAuth
x-notiflows-api-key<token>

Your project's public API key. Safe to include in client-side code. Starts with pk_.

In: header

x-notiflows-user-key<token>

JWT token identifying the current user. Must be signed with your Application Signing Key (RS256).

Required claims:

  • sub: User's external_id (required)
  • exp: Expiration timestamp (recommended)
  • iat: Issued at timestamp (recommended)

Development Mode: Use x-notiflows-user-id header with the user's external_id instead (insecure, testing only).

In: header

Path Parameters

channel_id*string

Channel ID (UUID)

Request Body

application/json

Batch update request with entry IDs and state changes

entry_ids*array<>

List of entry IDs to update

Items1 <= items
set*

State changes to apply to all specified entries

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PATCH "https://api.notiflows.com/user/channels/01HQXYZ123456789ABCDEFGHIJ/feed/entries" \  -H "Content-Type: application/json" \  -d '{    "entry_ids": [      "01HQXYZ123456789ABCDEFGHIJ",      "01HQABC987654321ZYXWVUTSRQ"    ],    "set": {      "read": true    }  }'
[
  {
    "actor": {
      "avatar": "https://example.com/avatars/admin.jpg",
      "external_id": "admin_001",
      "first_name": "Admin",
      "id": "01HQABC987654321ZYXWVUTSRQ"
    },
    "archived_at": null,
    "clicked_at": null,
    "created_at": "2024-01-15T10:30:00Z",
    "data": {
      "action_url": "https://example.com/orders/12345",
      "body": "Your order #12345 has shipped!",
      "title": "Order Shipped"
    },
    "id": "01HQXYZ123456789ABCDEFGHIJ",
    "read_at": null,
    "seen_at": null,
    "sent_at": "2024-01-15T10:30:00Z",
    "status": "unseen",
    "topic": "order-updates"
  }
]
{
  "error": {
    "code": "not_found",
    "details": {
      "allowed_statuses": [
        "string"
      ],
      "allowed_transitions": [
        "string"
      ],
      "auth": "api_key",
      "current_status": "string",
      "fields": [
        {
          "field": "email",
          "message": "can't be blank",
          "reason": "required"
        }
      ],
      "id": "string",
      "idempotency_key": "string",
      "limit": 0,
      "param": "string",
      "reason": "string",
      "required_scope": "string",
      "resource": "string",
      "retry_after": 0,
      "window": "string"
    },
    "message": "User not found",
    "request_id": "req_abc123",
    "status": 404,
    "type": "https://docs.notiflows.com/errors/not_found"
  }
}
{
  "error": {
    "code": "not_found",
    "details": {
      "allowed_statuses": [
        "string"
      ],
      "allowed_transitions": [
        "string"
      ],
      "auth": "api_key",
      "current_status": "string",
      "fields": [
        {
          "field": "email",
          "message": "can't be blank",
          "reason": "required"
        }
      ],
      "id": "string",
      "idempotency_key": "string",
      "limit": 0,
      "param": "string",
      "reason": "string",
      "required_scope": "string",
      "resource": "string",
      "retry_after": 0,
      "window": "string"
    },
    "message": "User not found",
    "request_id": "req_abc123",
    "status": 404,
    "type": "https://docs.notiflows.com/errors/not_found"
  }
}
{
  "error": {
    "code": "not_found",
    "details": {
      "allowed_statuses": [
        "string"
      ],
      "allowed_transitions": [
        "string"
      ],
      "auth": "api_key",
      "current_status": "string",
      "fields": [
        {
          "field": "email",
          "message": "can't be blank",
          "reason": "required"
        }
      ],
      "id": "string",
      "idempotency_key": "string",
      "limit": 0,
      "param": "string",
      "reason": "string",
      "required_scope": "string",
      "resource": "string",
      "retry_after": 0,
      "window": "string"
    },
    "message": "User not found",
    "request_id": "req_abc123",
    "status": 404,
    "type": "https://docs.notiflows.com/errors/not_found"
  }
}
{
  "error": {
    "code": "not_found",
    "details": {
      "allowed_statuses": [
        "string"
      ],
      "allowed_transitions": [
        "string"
      ],
      "auth": "api_key",
      "current_status": "string",
      "fields": [
        {
          "field": "email",
          "message": "can't be blank",
          "reason": "required"
        }
      ],
      "id": "string",
      "idempotency_key": "string",
      "limit": 0,
      "param": "string",
      "reason": "string",
      "required_scope": "string",
      "resource": "string",
      "retry_after": 0,
      "window": "string"
    },
    "message": "User not found",
    "request_id": "req_abc123",
    "status": 404,
    "type": "https://docs.notiflows.com/errors/not_found"
  }
}
{
  "error": {
    "code": "not_found",
    "details": {
      "allowed_statuses": [
        "string"
      ],
      "allowed_transitions": [
        "string"
      ],
      "auth": "api_key",
      "current_status": "string",
      "fields": [
        {
          "field": "email",
          "message": "can't be blank",
          "reason": "required"
        }
      ],
      "id": "string",
      "idempotency_key": "string",
      "limit": 0,
      "param": "string",
      "reason": "string",
      "required_scope": "string",
      "resource": "string",
      "retry_after": 0,
      "window": "string"
    },
    "message": "User not found",
    "request_id": "req_abc123",
    "status": 404,
    "type": "https://docs.notiflows.com/errors/not_found"
  }
}
{
  "error": {
    "code": "not_found",
    "details": {
      "allowed_statuses": [
        "string"
      ],
      "allowed_transitions": [
        "string"
      ],
      "auth": "api_key",
      "current_status": "string",
      "fields": [
        {
          "field": "email",
          "message": "can't be blank",
          "reason": "required"
        }
      ],
      "id": "string",
      "idempotency_key": "string",
      "limit": 0,
      "param": "string",
      "reason": "string",
      "required_scope": "string",
      "resource": "string",
      "retry_after": 0,
      "window": "string"
    },
    "message": "User not found",
    "request_id": "req_abc123",
    "status": 404,
    "type": "https://docs.notiflows.com/errors/not_found"
  }
}
{
  "error": {
    "code": "not_found",
    "details": {
      "allowed_statuses": [
        "string"
      ],
      "allowed_transitions": [
        "string"
      ],
      "auth": "api_key",
      "current_status": "string",
      "fields": [
        {
          "field": "email",
          "message": "can't be blank",
          "reason": "required"
        }
      ],
      "id": "string",
      "idempotency_key": "string",
      "limit": 0,
      "param": "string",
      "reason": "string",
      "required_scope": "string",
      "resource": "string",
      "retry_after": 0,
      "window": "string"
    },
    "message": "User not found",
    "request_id": "req_abc123",
    "status": 404,
    "type": "https://docs.notiflows.com/errors/not_found"
  }
}