Medium logo

Medium automation · runs weekly

Cross-post blog articles to Medium with a canonical link

Your blog is the original and Medium is the second home. After every new post you open Stories, paste the URL into Import a story, look over what the importer kept, and then remember which posts you already moved.

Cotlet does it in your own Medium account with list_stories, import_story, get_story, create_draft and schedule_story, called by your AI agent, an n8n workflow or a script.

Hosted · nothing to install or maintain

Official options

Can Medium do this on its own?

Medium has no supported API for this job (checked 12 Oct 2026). The old API accepted a canonicalUrl when creating a post, but Medium no longer allows new integrations and old tokens cannot import, schedule or check what is already on the account. In the app, Import a story covers one URL at a time and only when the importer can read the page; the canonical link field under More settings covers the rest by hand.

By hand

How you do it in Medium today

  1. On the Medium homepage, click Stories in the left rail menu, then Import a story in the top-right corner, paste the post URL and click Import.
  2. Click See your story and check the draft: Medium runs the import through a third-party service, so a page it cannot read comes back blank or with an error.
  3. When the Medium importer fails, click Write, paste the post by hand, re-add images and embeds, then open the three-dot menu > More settings > Advanced Settings, select "This story was originally published elsewhere" and click Save canonical link.
  4. Click Publish, add topics, and choose Publish now or Schedule for later.
  5. Repeat for every new post. Nothing in Medium tells you which blog posts are already on your account, and a second copy of the same story breaks Medium's No Duplicate Content rule.

With an agent

How to cross-post blog articles to Medium with a canonical link

Prompt

Every Monday, check yourname.dev/blog for posts that are not on Medium yet, import each one with a canonical link back to my blog, and schedule them for Thursday 9:00 my time.
  1. 01

    Find what is new on the blog

    The agent reads your blog feed or the URLs you list and keeps only posts newer than the last run. It never picks a post you marked as blog-only, such as an announcement or a sponsor post.

  2. 02

    Check Medium for a copy first

    Before importing, the agent pulls your published, draft and scheduled stories with list_stories and compares titles. A close match gets opened with get_story to compare its canonical_url with the blog URL. A match means the post is already on Medium, so it is skipped and named in the report.

  3. 03

    Import, then inspect the draft

    import_story runs Medium's importer on the URL. The agent then reads the draft back and checks three things: the canonical_url points to your blog, every image from the original is there, and code samples did not turn into plain paragraphs.

  4. 04

    Fall back when the importer gives up

    A blank or failed import is rebuilt with create_draft from the post's own Markdown, with canonical_url set to the blog address. The agent tells you which posts took this path, because those drafts carry today's date instead of the original one.

  5. 05

    Schedule into your slot

    Clean drafts go to schedule_story at the day and hour you named, one story per slot so two posts never go out together. Drafts with missing images stay unscheduled and wait for you to look.

What you get back

Example data

Blog checked: 3 new posts since 5 Oct.
"Shipping small": imported, canonical link OK, 4 of 4 images. Scheduled Thu 15 Oct 9:00.
"Why we dropped GraphQL": already on Medium (published 9 Oct), skipped.
"Postgres indexes, part 2": importer returned a blank page. Rebuilt from Markdown with the canonical link; dated today, not 7 Oct.
"Postgres indexes, part 2" waits unscheduled: 2 diagrams are missing.

Other ways to ask

  • Import yourname.dev/blog/shipping-small into Medium as a draft only, keep its canonical link, and do not schedule it.
  • Go through my last 20 blog posts and tell me which ones are missing on Medium, without importing anything.
  • Cross-post my newest blog post now and publish it right away after I approve the draft.

Before you automate it

What Medium allows, and what to know first

  • Medium's Import a story backdates the draft to the original publish date and adds a canonical link to the source automatically.
  • Medium hands imports to a third-party service; when that service cannot interpret a page, the import shows a blank page or an error and Medium's advice is to move the post by hand.
  • Only the author of a Medium story can set its canonical link, and Medium suggests checking it with View page source and a search for "canonical".
  • Medium's No Duplicate Content rule forbids republishing a story that already exists on Medium, including the same story in a second publication, and violations suspend the account.
  • Medium lets you import only content you have the rights to republish.

schedule_story asks for your OK by default. To run it weekly without you, switch confirmation off for that tool in your dashboard.

Sources: Medium Help: Importing a post to Medium · Medium Help: Trouble importing content using the import tool · Medium Help: Set a canonical link · Medium Help: About the No Duplicate Content rule

REST

Call import_story from a script

curl

curl https://cotlet.dev/api/v1/medium/import_story \
  -H "Authorization: Bearer $COTLET_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"url":"https://yourname.dev/blog/shipping-small"}'

Example response

{
  "story_id": "3f9a1c27b84e",
  "status": "draft",
  "canonical_url": "https://yourname.dev/blog/shipping-small"
}

MCP: add https://cotlet.dev/mcp/v1 with the same key; the tool is medium_import_story. Example data.

Schedule it in n8n, Make, Zapier or cron

Tools

Medium tools this automation uses

Cotlet Medium tools used to cross-post blog articles to Medium with a canonical link
Tool Parameters
list_stories status, limit, cursor
import_story url
get_story story_id
create_draft title, body_markdown, subtitle, tags, canonical_url, paywalled
schedule_story story_id, publish_at
All 13 Medium tools with descriptions

Frequently asked questions

Does an imported story keep the date from my blog?

Yes, when Medium's importer handles it: Medium backdates the imported post to the original date. A story rebuilt by hand or from Markdown after a failed import is dated when it is published.

Give your agent access to Medium.

Free 7-day trial with 5,000 credits, no card needed. Cotlet is independent and not affiliated with Medium.