---
title: "Convert chosen capsules into entries of an existing log Type, one entry each. dry_run previews; a write needs the preview_token and is all-or-nothing."
method: POST
path: "/api/preview/capsules/batch/convert-to-entries"
tags: ["capsule"]
---

# Convert chosen capsules into entries of an existing log Type, one entry each. dry_run previews; a write needs the preview_token and is all-or-nothing.

`POST /api/preview/capsules/batch/convert-to-entries`

## Request

- Base URL: `https://symbol.chat` (the document declares no server; this is the origin it was published from)
- URL: `https://symbol.chat/api/preview/capsules/batch/convert-to-entries`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `__Secure-next-auth.session-token`
  - OAuth 2
    - Authorization code: `https://mcp.symbol.chat/authorize`
    - Token URL: `https://mcp.symbol.chat/token`

## Request body

- object
  - `capsuleIds` string[], required: The capsules to convert, each into one entry.
  - `date_source` string, required: Which date each entry is filed under: `created_at`, `updated_at`, or `field:<name>` for a `date`/`datetime` field the capsules carry. A capsule whose field is empty is filed by its creation date.
  - `dry_run` boolean, required: `true` writes nothing and answers the preview. `false` converts, and needs the `preview_token` a dry run returned.
  - `field_map` object: Override the default mapping. Keys are source field names plus `@title`, `@body` and `@tags`; each maps to a field of the log's entry schema, or `null` to leave it out (it is then listed under `unplaced`).
  - `preview_token` string: The `preview_token` from a dry run of the same request. Required when `dry_run` is false; it proves the caller saw what will happen.
  - `targetTypeId` string, required: The log Type the entries go into.
  - `target_log_capsule_id` string: The log the entries go into, required for an owner-bound or `manual`-rollover log Type: a log capsule of that Type, or an owner capsule whose log is created on first use. Omit for a dated log, which files each entry by date.

## Response `200`

Successful response

- object: What a conversion does (a dry run), or did (a write).
  - `date_fallbacks` integer, required: Capsules whose chosen date field is empty, filed by their creation date.
  - `dry_run` boolean, required
  - `effects` object, required
    - `added_bytes` integer, required: Content storage the new entries add.
    - `attachments` integer, required: Attachments moved to the log capsule that holds the entry.
    - `body_renders_as_plain_text` boolean, required: The body lands in a paragraph field the log shows as plain text, so its Markdown is not rendered.
    - `collections` integer, required: Collection memberships dropped.
    - `grants` object[], required: People access the conversion removes.
      - `access` 'view' | 'edit', required
      - `capsule_id` string, required: UUID v4 string
      - `grant_id` string, required: UUID v4 string
    - `likes` integer, required: Likes kept on the retired capsules, which nothing shows any more.
    - `paragraph_rendering_change` object, nullable, required: Route A: the Type's paragraph fields render as Markdown from now on.
      - `from` 'plain' | 'markdown', required
      - `to` 'plain' | 'markdown', required
    - `projects` integer, required: Capsules whose project assignment is dropped.
    - `share_links` object[], required: Capsule share links the conversion withdraws.
      - `capsule_id` string, required: UUID v4 string
      - `expires_at` string, nullable, required
      - `link_id` string, required: UUID v4 string
      - `token_preview` string, nullable, required
    - `template_dropped` boolean, required: Route A: the Type's output template is removed.
    - `widened_audience` object[], required
      - `capsule_id` string, required: UUID v4 string
      - `reason` 'private_draft' | 'type_share_link' | 'bucket_share_link' | 'bucket_public' | 'bucket_grant', required: `private_draft`: a capsule its workspace's members cannot read (Private, or shared by link only) lands in a log they can. `type_share_link`: the log Type has an active share link that will serve it. `bucket_share_link`: the existing bucket it lands in has its own active share link. `bucket_public`: the existing bucket it lands in is public. `bucket_grant`: the existing bucket it lands in is shared with people by name, who will see it.
  - `field_map` object[], required
    - `kind_from` string, required: The source's kind: a field type, or `title`, `body` or `tags` for a pseudo-source.
    - `kind_to` 'text' | 'paragraph' | 'number' | 'datetime' | 'date' | 'boolean' | 'enum' | 'multi_enum' | 'reference' | 'multi_reference' | 'list' | 'table' | 'image' | 'file', nullable, required
    - `source` string, required
    - `target` string, nullable, required: The entry field it lands in, or null when dropped.
    - `target_is_new` boolean, required: True when the conversion adds this field to the log's schema.
  - `periods` object[], required: Entries per bucket, oldest period first.
    - `bucket` 'new' | 'existing', required
    - `entries` integer, required
    - `key` string, nullable, required: The bucket's period key (`2026-W03`), or null for an owner-bound or manual log.
    - `log_capsule_id` string, nullable, required: UUID v4 string
  - `preview_token` string, required: Pass back with `dry_run: false` to convert exactly what this preview shows.
  - `refusals` object[], required
    - `capsule_id` string: The capsule refused; absent when the whole request is.
    - `code` 'type_is_log' | 'type_encrypted' | 'type_freeform' | 'type_binds_log' | 'archived_capsules_present' | 'capsules_not_permitted' | 'too_many_capsules' | 'log_requires_field_schema' | 'field_count_exceeded' | 'log_requires_field_content' | 'timezone_invalid' | 'target_not_log' | 'target_log_required' | 'target_log_invalid' | 'date_source_invalid' | 'field_map_invalid' | 'not_found' | 'not_permitted' | 'archived' | 'encrypted' | 'log_capsule_source' | 'workspace_mismatch' | 'source_owns_log' | 'period_overlap' | 'bucket_archived' | 'bucket_not_permitted' | 'attachment_limit' | 'field_invalid' | 'field_content_too_long' | 'entry_empty', required
    - `field` string: The entry field the refusal is about, when there is one.
    - `message` string, required: The rule that refuses it, in a sentence.
  - `result` object: Present after a write: the entries created, per source capsule.
    - `entries` object[], required
      - `capsule_id` string, required: UUID v4 string
      - `entry_id` string, required: UUID v4 string
      - `entry_number` integer, required
      - `log_capsule_id` string, required: UUID v4 string
    - `log_capsule_ids` string[], required
  - `summary` object, required
    - `capsules` integer, required: Capsules in the request.
    - `entries` integer, required: Entries the conversion creates.
    - `existing_buckets` integer, required
    - `new_buckets` integer, required
  - `type_changes` object: Route A: how the Type itself changes.
    - `fields_added` object[], required
      - `name` string, required
      - `type` 'text' | 'paragraph' | 'number' | 'datetime' | 'date' | 'boolean' | 'enum' | 'multi_enum' | 'reference' | 'multi_reference' | 'list' | 'table' | 'image' | 'file', required
    - `log_timezone` string, required
    - `rollover` 'daily' | 'weekly' | 'monthly', required
    - `settings_reset` string[], required: Type settings a log cannot keep, reset by the conversion.
    - `structure` 'log', required
  - `unplaced` object[], required
    - `capsules_with_value` integer, required: How many converted capsules carry a value that will not be kept.
    - `source` string, required

## Changes

- **2026-10-19** `5778844d1f9e`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/symbol/apis/symbol-api/changes/api/preview/capsules/batch/convert-to-entries/post.md)

---

[API](https://skmtc.dev/symbol/apis/symbol-api.md) - [All operations](https://skmtc.dev/symbol/apis/symbol-api/llms.txt) - [OpenAPI document](https://skmtc.dev/symbol/apis/symbol-api/revisions/3a2c4ebeab51?raw)
