| Newsletters and issues |
list_publications | List the newsletters (publications) this key can work on: id, name, slug, locale and timezone. | none |
list_issues | List recent issues, newest first. Optionally only one publication. | publication_id: string (optional) limit: integer (optional) |
list_templates | Saved issue templates for a publication (or the whole workspace with scope=workspace). Use get_template for ordered section details. | publication_id: string (optional) scope: publication | workspace (optional) |
get_template | Read one saved template's ordered sections: key, name, type, and writing instructions. | template_id: string |
get_selection_rules | Read the resolved content-selection rules for one publication: hard bans, city scope, home band, banned sources, quality priorities and exact section count ranges. This is the same data Full Generate and daily generation enforce. | publication_id: string |
create_issue | Create an empty issue for a date from the publication's template. Returns the issue id (or the existing one for that date). | publication_id: string date: string |
generate_issue | Have lightbreak's own AI write a whole issue for a date using the publication's sources and section instructions. Runs in the background; poll get_generation_status with the run id. | publication_id: string date: string (optional) |
get_generation_status | Check a generate_issue run. When finished it includes the issue id. | publication_id: string run_id: string |
get_issue | Read an issue outline including each section's visibility and template origin, plus templateSections showing expected sections as present, hidden, or missing. | issue_id: string |
get_issue_tree | Read the full raw block tree. Each section includes hidden, hiddenReason, and templateSectionKey; save_issue_tree preserves these issue-local fields. | issue_id: string |
delete_issue | Delete an issue. | issue_id: string |
| Finding content |
browse_content | Stories, events and other items lightbreak has already collected from a publication's sources, newest first. kind: news, events, pets, jobs, tools, youtube, business, restaurants. Returns photoCount (usable photos, the same count write_story_for_section will attach) and gifGenerated for each item, plus willMakeGif when 2 or more photos mean a GIF is made automatically. Event bounds are inclusive dates. | publication_id: string kind: string (optional) limit: integer (optional) events_from: string (optional) events_to: string (optional) events_before: string (optional) cursor: string (optional) |
browse_places | Local restaurants and businesses from the publication's directory (Google listing details, photos). Each item includes photoCount and gifGenerated. kind: restaurant or business. photoCount counts usable photos; willMakeGif is true when there are 2 or more. | publication_id: string kind: restaurant | business (optional) search: string (optional) city: string (optional) page: integer (optional) |
browse_listings | Cached real-estate listings for a publication, newest first: listing_id, address, price, beds/baths, price_band, url, photo_count (usable photos), eligible (price floor, editorial policy, freshness; ineligible_reasons says why not), passes_photo_gate (enough photos for a Featured Home) and rank (1 is what add_featured_home picks by default). Uses the same rules as full generation. Pass issue_date (YYYY-MM-DD) to judge freshness as of that issue. | publication_id: string limit: integer (optional) eligible_only: boolean (optional) issue_date: string (optional) |
browse_jobs | Jobs from the publication's connected jobs board, the same feed the builder's Jobs section uses, newest first: job_id, title, company, salary, job_type, city, url, apply_url, logo_url, posted_at, placement, description. Never silently empty: when the feed is off, unconfigured or down, feed_status is disabled or unavailable and reason says exactly what is off and how to turn it on. Add one with add_job and its job_id. | publication_id: string limit: integer (optional) search: string (optional) city: string (optional) |
read_link | Read any web page and have lightbreak write it up for a section, using that section's writing instructions. Returns the written headline and text (and event details for event sections). Does not add it; follow with add_story or add_event. | issue_id: string section_id: string url: string |
list_sources | The websites, RSS feeds and calendars lightbreak collects content from for a publication, including last fetch time, status, error, and item count. | publication_id: string |
add_source | Add a website, RSS feed or calendar for lightbreak to collect content from. bucket: news, events, pets, jobs... | publication_id: string url: string name: string (optional) bucket: string (optional) |
| Writing and editing |
set_section_visibility | Hide or show one section on one issue. Hiding requires a reason and never changes the saved template. | issue_id: string section_id: string hidden: boolean reason: string (optional) |
write_story_for_section | Have lightbreak write one story in a section's own voice from a title, summary and source link (for example an item from browse_content or browse_places), then add it to the section. When content_item_id is given the item's photos are attached automatically, as the builder does: a pet, restaurant or business with 2 or more usable photos gets a photo GIF (up to 5 frames; a section with photoGif off, or photoGifCount, changes that), one photo is used as is, and none is refused before anything is written. Other items get their single image unless the section turns source images off. News sections never get an image, and include_image false attaches none anywhere. image_url overrides all of this. The Read more link a reader sees is never a provider widget or a link carrying a key (a pet's Petango popup): the item's own public page is used, and with none the button is left out. Returns imageCount, gifGenerated, gifFrameCount and photosFound. mode keep adds it as written instead of rewriting. | issue_id: string section_id: string title: string source_url: string summary: string (optional) content_item_id: string (optional) image_url: string (optional) include_image: boolean (optional) mode: rewrite | keep (optional) |
add_story | Add a story you wrote to a section: headline, paragraphs (**bold** and *italic* work), optional photo and Read more link. Uses the same layout the builder uses. For Restaurant Radar or Business Brief, include the exact place name in a paragraph and pass business_name, or use its directory content_item_id; the first mention becomes bold. Pass content_item_id (from browse_content or browse_places) to attach that item's photo or photo GIF automatically, exactly as write_story_for_section does. An explicit image_url uses that image instead of making a GIF. | issue_id: string section_id: string headline: string paragraphs: string[] source_url: string (optional) button_label: string (optional) image_url: string (optional) image_alt: string (optional) content_item_id: string (optional) business_name: string (optional) include_image: boolean (optional) |
add_event | Add one of the publication's 6-8 event cards. The event link must resolve. Set featured=true on exactly one event; its featured card can be text-only when no image_url exists. Featuring a new one un-features the previous one. starts_at may be a date (2026-09-27, no time shown), a local time with no offset (2026-09-27T12:30, read as the publication's own time) or any instant with any offset (2026-09-27T17:30:00Z); ends_at is optional and must be later than starts_at. Dates are stored in the publication's timezone. Event sections re-sort by date and drop events outside the issue window. Returns imageCount for the added event. | issue_id: string section_id: string title: string starts_at: string venue: string url: string ends_at: string (optional) blurb: string (optional) time_label: string (optional) type: string (optional) city: string (optional) image_url: string (optional) featured: boolean (optional) |
add_job | Add a job listing to a section. Pass job_id from browse_jobs to fill title, company, salary, job_type, city, link, apply link and logo from the feed (anything you pass yourself wins); otherwise title, company and url are required. Set featured=true on exactly one of the publication's 4-6 jobs; featuring a new one un-features the previous one. | issue_id: string section_id: string job_id: string (optional) title: string (optional) company: string (optional) url: string (optional) salary: string (optional) job_type: string (optional) city: string (optional) apply_url: string (optional) logo_url: string (optional) featured: boolean (optional) |
update_event | Change fields of an event already in the issue (block id from get_issue). Only the fields you pass change; an empty string clears ends_at, blurb, time_label, type, city or image_url. starts_at and ends_at follow add_event's date rules. A moved start keeps the old end if it is still later; otherwise supply a new end or clear it. The featured flag is untouched (use set_featured), and an agent-created featured card updates with the event. update_block_text cannot edit events. | issue_id: string block_id: string title: string (optional) starts_at: string (optional) ends_at: string (optional) venue: string (optional) url: string (optional) blurb: string (optional) time_label: string (optional) type: string (optional) city: string (optional) image_url: string (optional) |
update_job | Change fields of a job already in the issue (block id from get_issue). Only the fields you pass change; an empty string clears salary, job_type, city, apply_url or logo_url. The featured flag is untouched (use set_featured). | issue_id: string block_id: string title: string (optional) company: string (optional) url: string (optional) salary: string (optional) job_type: string (optional) city: string (optional) apply_url: string (optional) logo_url: string (optional) |
add_featured_home | Fill the issue's Featured Home section exactly as full generation does: a photo-tour GIF plus a linked info panel for one listing, replacing whatever is in the section. With no listing_id it uses the best-ranked eligible listing in the publication's featured price band; listing_id (from browse_listings) picks another; zillow_url fetches and caches one first. Returns listing_id, address, price, imageCount (blocks added) and frameCount (GIF frames). Fails with a specific reason (no eligible listing, too few photos, media unavailable) and changes nothing. get_issue shows featuredHome status for the section. | issue_id: string section_id: string (optional) listing_id: string (optional) zillow_url: string (optional) |
set_featured | Feature (or un-feature) an event or job that is already in the issue, by block id from get_issue. Featuring clears any other featured item of the same kind in that section, so there is only ever one; the response lists what it cleared (cleared_featured_block_ids). A featured event can have a text-only card when it has no photo; image_url is optional. get_issue shows featured on every event and job. | issue_id: string block_id: string featured: boolean (optional) image_url: string (optional) |
list_meme_sets | The workspace's saved meme sets, by name (weekly sets are named like "memes 2026-W40"), with how many memes each holds. Optionally one name, or the set for an issue's send week (issue_id). | name: string (optional) issue_id: string (optional) |
add_meme_set | Put a saved meme set's memes into the issue's Meme section (replacing what was there from a set). With no name it uses the set named for the issue's send week ("memes <ISO week>", e.g. "memes 2026-W40"); you never choose individual memes. Pass name or set_id to use a different set. | issue_id: string name: string (optional) set_id: string (optional) |
update_block_text | Replace the words of one text block (headline, paragraph, list) by block id. Keeps the block's link, preserves Local Lowdown labels and an existing bold business name, and converts **bold** and *italic* in the new text into real formatting. | issue_id: string block_id: string text: string |
update_issue_details | Set the email subject line and/or preview text. | issue_id: string subject: string (optional) preview_text: string (optional) |
remove_blocks | Remove blocks from an issue by id (use get_issue for ids). | issue_id: string block_ids: string[] |
save_issue_tree | Save a full block tree. expected_updated_at must be the updatedAt you read; a newer save by someone else returns a conflict instead of overwriting it. | issue_id: string tree: object expected_updated_at: string |
upload_image_from_url | Copy an image from a public URL into lightbreak's storage and return a stable URL to use in stories. PNG, JPG, WEBP or GIF, under 8 MB. | image_url: string |
make_gif | Make a photo GIF from 2 to 5 public photo URLs (the builder's GIF Maker, same frames and timing) and add it to a section, at the end or after after_block_id. Returns gifFrameCount and gifUrl. Stories added with content_item_id get their GIF automatically; use this for photos you found yourself. | issue_id: string section_id: string image_urls: string[] alt: string (optional) link_url: string (optional) caption: string (optional) after_block_id: string (optional) |
suggest_subject_lines | Three subject line and preview text options written from the issue's content by lightbreak's inbox copywriter: one specific hook per option, grounded in the issue, fact-checked. Best first. | issue_id: string |
write_intro | Write the issue's intro paragraphs from its headlines, in the intro section's voice, and return them as paragraphs. Nothing is saved: add them with add_story or update_block_text. Works even when the intro section is set to keep as written, because it never overwrites that section. | issue_id: string section_id: string (optional) |
| Checking and finishing |
review_issue | Start the Review Issue agent on the saved issue: links, images, a fact check of every story against its source, and a copy read. Poll get_review. | issue_id: string |
get_review | The latest review of an issue: status, summary, and findings (severity wrong/fix/check/unverified, block id, message, the source's own words, a suggested fix). | issue_id: string |
export_issue_html | The finished email HTML. format: beehiiv (default, exactly what is pushed to Beehiiv), html (full designed email) or native. | issue_id: string format: beehiiv | html | native (optional) |
push_to_beehiiv | Put the finished issue into the publication's Beehiiv account as a DRAFT post. It is not sent or scheduled; a person does that in Beehiiv. | issue_id: string |
push_to_activecampaign | Put the finished issue into ActiveCampaign as a draft campaign. Not sent. | issue_id: string list_ids: string[] (optional) |
mark_issue_done | Mark an issue finished (or not) in lightbreak. | issue_id: string done: boolean (optional) |
| Notifications |
add_notification | Have lightbreak POST a signed JSON message to your https address when something happens. events: issue.generated, issue.generation_failed, review.completed, issue.pushed_to_esp, issue.marked_done. Returns a signing secret once: verify the Lightbreak-Signature header (t=<unix>,v1=<hex HMAC-SHA256 of "<t>.<raw body>">) with it. | url: string events: [issue.generated | issue.generation_failed | review.completed | issue.pushed_to_esp | issue.marked_done] description: string (optional) |
list_notifications | Notification addresses (webhooks) for this workspace and the events each one receives. | none |
test_notification | Send a sample message to one notification address and report what the receiver answered. | notification_id: string |
remove_notification | Stop sending notifications to an address. | notification_id: string |