Markdown import

This workflow stages one Markdown document, lets the caller inspect the parsed result, then creates a post only after explicit confirmation. It does not upload archives or read a client filesystem path.

Authentication

All routes require a bearer token, a publication selector or staged import_id, and the listed capability. The importing principal must be permitted to create posts in the publication.

Routes

Route Method Capability Required input Optional input and behavior Success result
/import/start POST import.start Publication selector, content source_name, allow_create_tags Staged import.
/import/status POST import.status import_id Matching publication selector Staged import.
/import/apply POST import.apply import_id publish_import Applied import and post.
/import/cancel POST import.cancel import_id Matching publication selector Cancelled import.
/import/production POST Machine-client production access bundle apply, sync_mode Production synchronization result.

Start an import

Field Required Type Description
publication_id / publication_slug Yes UUID / String Selects the publication.
content Yes String One Markdown document, up to 1 MiB.
source_name No String Display-only source name.
allow_create_tags No Boolean When true, missing tags are staged for creation during apply. Defaults to false.
curl -sS https://api.blog.service.m7.org/v1/import/start \
  -H 'Authorization: Bearer ACCESS_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "publication_slug":"engineering-notes",
    "source_name":"release-notes.md",
    "content":"---\\ntitle: \\\"Release notes\\\"\\ntags: [\\\"m7\\\"]\\n---\\n\\n# Release notes"
  }'

The document must begin with a --- front-matter delimiter followed by Markdown body text. title and body are required. The optional front-matter fields are slug, date (YYYY-MM-DD), author, authors, category, tags, excerpt, body_format (markdown or html), and visibility (public, unlisted, or private). Use author or authors, not both.

The source author, category, and tags must already exist in the selected publication. With allow_create_tags: true, unknown tags are reported in preview.tag_names_to_create and are created only when the import is applied. Unknown authors and categories make the stage invalid.

Review and apply

An import returns state as ready, invalid, applied, or cancelled. A ready preview contains the normalized title, slug, source body, body format, visibility, resolved author, category, tag references, and field-level errors where applicable.

{ "import_id": "IMPORT_UUID", "publish_import": true }

/import/apply normally creates a draft post. Set publish_import: true only when the source includes a valid date; that date becomes the post's published_at. Applying an already applied import is idempotent. /import/cancel can cancel only ready or invalid imports and never deletes a post created by a prior apply.

Production synchronization

/import/production is a separate machine-client integration for synchronizing a complete publication bundle. Its authentication and bundle contract are documented in Production synchronization.