Notion 2,000-character text limit: write Sume results back in chunks

Notion caps one text value at 2,000 characters and a request at 1,000 blocks or 500KB. Split Sume's structured output into blocks instead of one property.

5 min readSume
All posts

Notion limits a single text value to 2,000 characters and a whole request to 1,000 block elements and 500KB. A Sume run that returns a script, captions or structured JSON can exceed 2,000 characters, so write the long text as page blocks split into chunks of at most 2,000 characters, and keep the Notion property for short fields such as the media URL and a status.

Which Notion limits does a Sume write-back hit?

Notion's request-limits page lists size limits on what one API request may carry. They are limits per request, not caps on what a property can hold in total; a relation can hold far more than the 100 pages one request may set.

Notion request size limits (read 2026-10-02)
ItemLimit per request
Text content2,000 characters
URL2,000 characters
Email or phone number200 characters
Rich text array100 elements
Multi-select options100
Whole payload1,000 block elements and 500KB

What does a finished Sume run give me to write?

A completed Format run delivers a receipt with primary_output_url pointing at media.sume.com, an artifacts[] list and an output object. When you supplied an output_schema, output carries structured fields; see the structured output page. The media URL is short and fits a URL property comfortably.

The long parts are the text fields: a narration script, per-scene prompts, a caption file. Those can pass 2,000 characters, and a single over-long value makes the whole update fail validation rather than truncating.

How do I split text safely?

Cut on paragraph boundaries first, then on sentence boundaries, and hard-split only as a last resort. Each piece becomes one paragraph block. Keep a running count so a very long result stays under 1,000 elements per request, and send further blocks in follow-up calls if needed.

The helper below is pure code and runs as written. It returns pieces of at most 2,000 characters.

export function chunkText(text: string, max = 2000): string[] {
  const out: string[] = [];
  for (const para of text.split(/\n{2,}/)) {
    let rest = para.trim();
    while (rest.length > max) {
      let cut = rest.lastIndexOf(". ", max - 1);
      if (cut < max / 2) cut = max - 1; // no good sentence break: hard split
      out.push(rest.slice(0, cut + 1).trim());
      rest = rest.slice(cut + 1).trim();
    }
    if (rest) out.push(rest);
  }
  return out;
}

console.log(chunkText("A. ".repeat(2000)).every((c) => c.length <= 2000));

What should I do when the Sume webhook arrives?

Verify the signature first, record the event by request_id, and answer 2xx within 10 seconds. Do the Notion writes afterward, since writes to several blocks can be slow and a slow endpoint burns Sume's attempt budget and is retried. The run webhooks page is explicit that delivery should follow durable storage.

If the receipt is over 1 MiB, the webhook arrives with payload: null and an error pointing at result_url. Fetch the receipt from there and chunk as usual. Check outcome too: degraded means real artifacts but no structured output, so write the media and flag the page for review.

What does Sume not do?

Sume does not write to Notion and has no Notion integration in these docs. It also does not shorten results to fit a destination. Pacing writes against Notion's per-connection request rate is a separate question, covered in the 600 requests a minute post.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume