Skip to content

Nuelink API/MCP Changelog

Post updates and deletion, the weekly schedule, and published results.

The API contract is now version 1.2.0, published at /openapi-v1.2.0.yaml. Six new operations bring it to 17, and the MCP server, CLI, and Agent Skills cover every one of them. The previous contract stays available at /openapi-v1.0.1.yaml.

API: six new endpoints

  • GET /auth - validate a token. Same response as /me.
  • GET /brands/{brand_id}/schedule - every weekly queue slot in the brand, grouped by day, in the brand’s timezone.
  • GET /brands/{brand_id}/posts - posts across every collection in a brand.
  • PATCH /brands/{brand_id}/posts/{post_id} - reschedule, re-queue, or draft a post, or move it to the front or back of its queue. Content isn’t editable.
  • DELETE /brands/{brand_id}/posts/{post_id} - permanently delete a post. A sensitive action, refused unless the account owner enables it in Settings → API.
  • GET /brands/{brand_id}/published-posts - what went out to each channel: delivery status, the platform link, and likes, comments, and shares.

API: other changes

  • Post lists filter on the server: view, status, post_type, posting_type, created_from, created_to, sort_by, and sort_order. Results are newest first, in a deterministic order.
  • Collections return their queue: status, evergreen, maxRepublish, timezone, and queues with each slot’s day and time. The list adds postsCount.
  • Brands return queueStatus, ACTIVE or PAUSED.
  • New post option autoThreadText, and a caption split by triple newlines becomes a thread of up to 10 segments.
  • Automation defaults are now documented: title is {{title}}, loadOldPosts and addPostsAsDraft are false, and refreshRate is 24.
  • Rate limits are documented as two layers: 60 requests per minute per client IP on every route, and 30 per minute on resource endpoints. /auth and /me count only against the first. See Rate Limits.
  • The API accepts the key as an api_key query parameter, for compatibility. The Authorization header remains the way to send it. See Authentication.

API: corrections to previously documented behavior

If you built against the older pages, check these:

  • postDate is UTC, formatted Y-m-d H:i:s. It’s not ISO 8601, and it’s not the brand-local time you send in scheduledAt. See Dates and timezones.
  • A post created with IMMEDIATE reads back with postingType: NOW.
  • A 422 can carry status: "error". Business-rule failures, such as a scheduledAt under 10 minutes away, return 422 with string-valued errors. That case was documented as 400. See Errors.
  • Creating or updating a post in a brand you’re not a member of returns 403, not 404.
  • maxRepublish is the evergreen interval: 0 turns evergreen off, and N re-adds published posts after N weeks. It was documented as a recycle count.
  • Queue slots: verified users can create up to 10 per collection per day, unverified users up to 5. Duplicate slots aren’t rejected.
  • The X channel type is X, not X/Twitter. Social Media is also a channel type.
  • On GET /channels, pagination.total is counted before channels in other states are filtered out, so a page can be short or empty.
  • comment needs both delay and comment, on every surface.

Breaking changes and migrations

  • Automation fields are renamed, in requests and responses:

    1.2.0-alpha1.3.0-alpha
    title (the automation’s name)name
    type: "FEED" and subTypetype, which now holds the feed source
    dynamicTitletitle
    dynamicBodycaption
    descriptionRemoved

    title keeps its name but changes meaning: it’s now the title template. Template placeholders use double braces, such as {{title}} and {{link}}.

  • webp uploads are no longer accepted. POST /media takes JPEG, PNG, BMP, MP4, MOV, and PDF, up to 100 MiB.

  • CLI 1.4.5 renames the automations:create flags to match: --title is now --name, --sub-type is now --type, --dynamic-title and --dynamic-body are now --title and --caption, and --description is gone. Scripts written for CLI 1.4.1 need updating.

  • nuelink_create_automation takes the new field names: name, type, title, caption.

  • Code that matches 400 for a too-soon scheduledAt should match 422.

MCP: six new tools, 17 in total:

  • nuelink_validate_token → GET /auth
  • nuelink_get_schedule → GET /brands/{id}/schedule
  • nuelink_list_brand_posts → GET /brands/{id}/posts
  • nuelink_update_post → PATCH /brands/{id}/posts/{id}
  • nuelink_delete_post → DELETE /brands/{id}/posts/{id}
  • nuelink_list_published_posts → GET /brands/{id}/published-posts

nuelink_list_posts takes the new post filters, and nuelink_create_post takes autoThreadText.

CLI 1.4.5

  • Six new commands: auth:validate, schedule, brand-posts, posts:update, posts:delete, and published-posts. posts:update and posts:delete support --dry-run, like every other API mutation.
  • posts takes the new filter flags, and posts:create takes --auto-thread-text.
  • Upload validation now matches the API: jpg, jpeg, png, bmp, mp4, mov, and pdf. CLI 1.4.1 accepted gif and webp and rejected bmp and pdf.

→ CLI commands

Agent Skills

  • nuelink-cli-publish covers post updates, deletion, and published results, and asks for a separate confirmation immediately before any posts:delete.
  • nuelink-cli-setup checks the key with auth:validate.
  • The contract tests run seven network-blocked mutation dry-runs, adding posts:update and posts:delete.

→ Agent Skills documentation

Docs

  • Endpoints reorganized by resource, with every request example in cURL, JavaScript, and PHP, and a table of the API’s date formats and timezones.
  • Rate Limits and Errors rewritten for the two rate limits and four error shapes.
  • Available Tools expanded to seventeen tools, and Example Prompts gained prompts for changing posts and reviewing results.

OAuth for MCP, five new endpoints, an official CLI, and an Agent Skills pack.

This is the largest release since the alpha opened. The API surface grew from 6 endpoints to 11, the MCP server from 6 tools to 11, and there are now two new ways to reach Nuelink: a command-line tool and a skills pack for coding agents.

MCP server v1.1.0

Streamable HTTP transport, protocol version 2025-06-18.

MCP: OAuth

OAuth is the recommended path for new MCP connections. Configure https://mcp.nuelink.com/mcp without an API key in the URL; discovery, dynamic registration, and the S256 PKCE handoff are operational.

  • Authorization code flow with PKCE (S256). Discovery metadata also advertises the refresh_token grant; end-to-end token issuance and refresh remain awaiting final acceptance certification.
  • Dynamic client registration (RFC 7591) at https://mcp.nuelink.com/register. No app to create, no client ID to manage.
  • Standard discovery documents at /.well-known/oauth-authorization-server and /.well-known/oauth-protected-resource.
  • The api_key query parameter is deprecated. It remains temporarily available so existing connections keep working, but it must not appear in new integrations. No removal date is set; we’ll announce one with notice. See MCP Authentication for the migration steps.
  • Errors now surface properly. Validation failures and downstream API failures come back with isError: true, alongside the underlying status, message, and errors.

Known MCP limitations in this release

  • The OAuth lifecycle is not fully certified. Discovery, dynamic registration, and the S256 PKCE authorization handoff are operational and verified as of 2026-08-19. The complete logged-in consent, code-exchange, access-token, refresh, and revocation lifecycle still needs final acceptance certification.
  • Session termination can return HTTP 500 with Cloudflare Worker Error 1101, after an otherwise successful session.

MCP: five new tools, 11 in total:

  • nuelink_create_collection → POST /brands/{id}/collections
  • nuelink_list_automations → GET /brands/{id}/automations
  • nuelink_create_automation → POST /brands/{id}/automations
  • nuelink_list_media → GET /brands/{id}/media
  • nuelink_list_posts → GET /brands/{id}/collections/{id}/posts

MCP: platform option parity

platforms.tiktok.autoAddMusic and platforms.googlemybusiness.uploadToPhotosSection are now exposed through the MCP tool schema, so all three surfaces accept the same platform options.

API: five new endpoints

  • POST /brands/{brand_id}/collections - create a collection with its channels and weekly queue.
  • GET /brands/{brand_id}/automations - list feed automations.
  • POST /brands/{brand_id}/automations - create a feed automation across 27 source types.
  • GET /brands/{brand_id}/media - list a brand’s media library, with an optional type filter.
  • GET /brands/{brand_id}/collections/{collection_id}/posts - list posts in a collection.

API: other changes

  • Base URL is now https://app.nuelink.com/api/public/v1. nuelink.com still works, so nothing breaks, but new integrations should use app.nuelink.com.
  • Rate-limit headers (X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset) are documented on successful and 429 responses.
  • New post option: platforms.googlemybusiness.uploadToPhotosSection. platforms.instagram.trialReel, platforms.instagram.shareToFeed, platforms.youtube.playlists, and the poll quiz fields (correctOptionIndex, explanation) already existed; this release documents them more fully.
  • Documented limits: 15,000 posts per brand, 10 posts per collection per day, scheduledAt at least 10 minutes ahead.

API: corrections to previously documented behavior

These bring the docs in line with the 1.0.1 OpenAPI contract. If you built against the older pages, check these:

  • Default per_page is 25, not 10. Pass per_page explicitly if your code assumed the old default.
  • 422 and 429 bodies have no status field. Only business-rule errors (400, 401, 403, 404, 500) carry status: "error". A parser that keys off status will miss validation and rate-limit failures. See Errors.
  • Collections do not return a status field, and channels embedded in a collection return id, name, status, and type without timestamps. The standalone GET /channels still returns createdAt and updatedAt.

Media: expanded upload formats

POST /brands/{brand_id}/media accepts jpg, jpeg, png, bmp, webp, mp4, mov, and pdf, up to 100 MB. PDF publishes to LinkedIn as a document post; other platforms in the collection skip it.

The CLI validates uploads against its own list before sending, which is not the same set: CLI 1.4.1 rejects bmp and pdf locally and accepts gif. See CLI commands for that guard, and use the REST API or MCP for formats the CLI blocks.

New: Nuelink CLI

@nuelink/nuelink-cli on npm, MIT licensed, Node 18.17+.

  • Full command coverage for profile, brands, channels, collections, automations, media, and posts.
  • --dry-run on every API mutation, --json for machine-readable output, and --quiet for API-request scripts.
  • Auth via --api-key flag, NUELINK_API_KEY, or an encrypted local config, resolved in that order.
  • Strict local validation for required strings, booleans, URLs, dates, enums, pagination bounds, and raw JSON payloads.
  • One structured JSON value on stdout for both successes and failures in --json mode.
  • Retries GET only, on 429 and 5xx, honoring Retry-After and backing off with jitter. Mutations are never retried.
  • Ships and passes its packaged test suite.

→ CLI documentation

New: Agent Skills

Nuelink/nuelink-agent, installed with npx skills add Nuelink/nuelink-agent.

  • Three canonical skills: nuelink-cli-setup, nuelink-cli-manage, nuelink-cli-publish.
  • Native plugin manifests for Claude Code and Codex, plus bundled remote MCP config.
  • Nine compatibility aliases kept as opt-in migration paths, excluded from default installer discovery.
  • Safety-first defaults: discover before mutating, preview with --dry-run, default to DRAFT.
  • CI covers skill structure, the Agent Skills reference validator, behavior fixtures, network-blocked contract tests, installer discovery, and markdown lint.

→ Agent Skills documentation

Docs

Breaking changes and migrations

One genuine break, and three things worth updating:

  • Breaking: a REST API key in the MCP Authorization header is now rejected. 1.1.0 documented this as a supported option; it now returns 401. Move those connections to OAuth, or to the deprecated ?api_key= query parameter as a stopgap.

  • MCP clients using "type": "sse" should switch to "type": "http". The server uses streamable HTTP.

  • MCP connections using ?api_key= should migrate to OAuth. They still work for now.

  • Move new integrations to app.nuelink.com.


Introducing the Nuelink MCP Server.

You can now connect Nuelink to Claude, ChatGPT, Cursor, Manus, Codex, Cline, and any other MCP-compatible AI assistant. Instead of writing code against the REST API, describe what you want in plain English and the assistant calls the right tools for you:

“Queue this product photo to my Product Launches collection, with the caption I just wrote.”

What shipped

  • MCP server endpoint: https://mcp.nuelink.com/mcp
  • At launch, two API-key methods were documented: ?api_key=YOUR_API_KEY and a REST API key in the Authorization header. As of 1.2.0-alpha, only the query-key method remains as a deprecated compatibility path; the MCP endpoint rejects a REST API key supplied as a bearer token. See the current authentication section above.
  • Six tools, each mapping 1:1 to an existing API endpoint:
    • nuelink_get_me → GET /me
    • nuelink_list_brands → GET /brands
    • nuelink_list_collections → GET /brands/{id}/collections
    • nuelink_list_channels → GET /brands/{id}/channels
    • nuelink_create_post → POST /brands/{id}/collections/{id}/posts
    • nuelink_upload_file → POST /brands/{id}/media
  • Direct-URL media support: in addition to uploaded files, you can pass a stable HTTPS URL that returns media bytes without login, cookies, an HTML viewer, or short-lived authorization.

Docs

  • New MCP Server section with Overview, Quick Start, Authentication, Available Tools, and Example Prompts.
  • Rewritten Introduction with two-surface framing (API + MCP).

Underlying API

No breaking changes to the REST API. The MCP server is a thin wrapper over the same public endpoints, anything you can do via MCP, you can also do via the API, and vice versa.


  • Initial alpha release.
  • Endpoints included:
    • GET /me
    • GET /brands
    • GET /brands/{id}/collections
    • GET /brands/{id}/channels
    • POST /brands/{id}/media
    • POST /brands/{id}/collections/{id}/posts

Resolved in 1.3.0-alpha

  • Updating or deleting posts → PATCH /brands/{id}/posts/{id} reschedules, re-queues, or drafts a post; DELETE removes it, as a sensitive action
  • Retrieving post performance → GET /brands/{id}/published-posts returns likes, comments, and shares per channel
  • Per-channel publishing status → GET /brands/{id}/published-posts returns each channel’s delivery status and platform link, one status per request
  • Filtering posts on the server → post lists take view, status, type, and date filters

Resolved in 1.2.0-alpha

  • Listing posts → GET /brands/{id}/collections/{id}/posts
  • Listing previously uploaded media → GET /brands/{id}/media
  • No way to create collections or automations programmatically → both now available

Still not available

  • Editing a post’s content. PATCH changes when or whether a post publishes, not its caption, media, or options. Edit content in the Nuelink dashboard.
  • Updating or deleting collections, automations, or media. They’re create-and-read only. Change and remove them in the dashboard.
  • Analytics beyond per-post likes, comments, and shares.
  • Webhooks for publish success / failure events. Poll GET /published-posts instead.
  • Targeting a subset of channels within a collection. Posts go to every channel in the collection.
  • Per-platform caption or comment customization. Caption and auto-comment are global; non-content options like Instagram collabs and YouTube tags can be set per platform.
  • Idempotency keys on creation endpoints. Don’t auto-retry a timed-out mutation.

MCP-specific limitations

The MCP server has its own open items, including OAuth lifecycle certification and defective session termination. They’re listed once, in MCP Overview → Current limitations, so the two lists can’t drift apart.

If any of these are blockers for your integration, let us know and we’ll prioritize accordingly.