Publish to permanent links from anywhere

Every Pin is a permanent URL that always serves the latest file. The integrations API and MCP server let scripts, pipelines, and AI assistants push new versions to those links — upload, stage, publish — without anyone touching the URL.

Watch the 2-minute walkthrough

Video coming soon — see the quickstart below in the meantime.

Quickstart — publish a file in two calls

  1. Create an API key on your Integrations page (Pro plan). Keys look like pin_live_… and are shown once.
  2. Upload a file to a Pin — it stages as a new version:

    curl -X POST https://manage.nowpinned.com/api/v1/uploads/direct \
      -H "Authorization: Bearer pin_live_YOUR_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{
        "pin_id": "YOUR_PIN_ID",
        "filename": "june-pricing.pdf",
        "mime_type": "application/pdf",
        "base64_content": "'"$(base64 -i june-pricing.pdf)"'",
        "internal_label": "June pricing — draft"
      }'

    The response includes the staged version.id, a staged_preview_url(a draft preview for your team — not the public link), and the Pin's permanent_link. internal_label is an optional private note; change_label sets the optional public label (shown to viewers) — omit it to stage with no public label. Find Pin ids via GET /api/v1/pins.

  3. Publish it — the permanent link updates instantly:

    curl -X POST https://manage.nowpinned.com/api/v1/versions/VERSION_ID/publish \
      -H "Authorization: Bearer pin_live_YOUR_KEY" \
      -H "Idempotency-Key: $(uuidgen)" \
      -H "Content-Type: application/json" \
      -d '{}'

    Publishing adds no label by default. Optionally set internal_label (a private team note, never shown to viewers) and/or change_label (the public label). Add "announce": true with a change_label to show the change badge and notify subscribers. Relabel later with PATCH /api/v1/versions/{id}/label.

Connect Claude (MCP)

NowPinned ships a remote MCP server (pinned_list_pins, pinned_upload_file, pinned_publish_version, pinned_list_versions, pinned_get_file_content, pinned_restore_version, …). Once connected, you can say “publish this PDF to my pricing Pin” and Claude does the rest. On connect, Claude reads a short README (the Pin/version model and publish workflow) so it knows how NowPinned works — or call pinned_get_readme any time.

One-click connect (no API key)

In Claude, go to Settings → Connectors → Add custom connectorand paste the MCP endpoint below. You'll be asked to sign in to NowPinned and approve access — no key handling needed. The same flow works in ChatGPT connectors (developer mode).

https://manage.nowpinned.com/api/mcp

OAuth scopes changed in June 2026. Revoke any older NowPinned connector under Account → Connected apps, then reconnect it to receive the reduced openid/profile grant.

Claude Code

claude mcp add --transport http pinned https://manage.nowpinned.com/api/mcp \
  --header "Authorization: Bearer pin_live_YOUR_KEY"

Claude Desktop / other MCP clients

{
  "mcpServers": {
    "pinned": {
      "type": "http",
      "url": "https://manage.nowpinned.com/api/mcp",
      "headers": { "Authorization": "Bearer pin_live_YOUR_KEY" }
    }
  }
}

Example prompts: “List my Pins” · “Upload this file to the menu Pin and publish it” · “Externally label the pricing version ‘June update’” · “What versions does the pricing Pin have? Roll it back to the previous one” · “Schedule this version to publish tomorrow at 9am” · “Create a Pin called Specials and put it in the Commercials folder” · “Require an email before anyone can view the pricing deck”

Connect ChatGPT (Actions)

In a custom GPT, choose Create new actionImport from URL and paste:

https://manage.nowpinned.com/api/v1/openapi.json?client=chatgpt

Set authentication to API Key — Bearer and paste your pin_live_… key. ChatGPT can then list Pins, upload files, and publish versions on your behalf.

Endpoints

EndpointPurpose
GET /api/v1/sitesList sites this key can publish to
GET /api/v1/readmeFull operating guide for clients and assistants
GET /api/v1/pinsList Pins and their live versions
GET /api/v1/pins/{id}/active-versionWhat's currently published
GET /api/v1/pins/{id}/active-version/contentFetch the live file's content (text or signed URL)
POST /api/v1/uploads/directOne-call upload (base64 or HTML)
POST /api/v1/uploads/prepareSigned URL for large files
POST /api/v1/uploads/completeFinalise a prepared upload
POST /api/v1/versions/{id}/publishMake a staged version live (or schedule it)
GET /api/v1/pins/{id}/versionsVersion history, including archived
GET /api/v1/versions/{id}/contentFetch a version's file content (text or signed URL)
POST /api/v1/versions/{id}/restoreRoll back — restore an archived version
PATCH /api/v1/versions/{id}/labelSet a version's public and/or internal label
POST /api/v1/pinsCreate a new Pin
PATCH /api/v1/pins/{id}Rename a Pin
GET /api/v1/sites/{id}/foldersList folders
POST /api/v1/sites/{id}/foldersCreate a folder
PATCH /api/v1/pins/{id}/folderMove a Pin into a folder
GET /api/v1/pins/{id}/secure-accessRead the secure-access gate
PATCH /api/v1/pins/{id}/secure-accessRequire email/PIN to view (Pro)

Full schemas: manage.nowpinned.com/api/v1/openapi.json

Full operating guide: manage.nowpinned.com/api/v1/readme

Behaviour and limits

  • Staged, then published. Uploads never go live by themselves — a version stays staged until you (or your assistant) publish it.
  • Idempotent creates and publishing. Pin/folder creation, upload prepare/complete/direct, and publish calls require an Idempotency-Key header. Reuse a key only for an exact retry: the original response is returned. Changed input with the same key returns 409. Restore, relabel, rename, move, and secure-access updates are state-setting and need no key.
  • Files.PDF, DOCX, XLSX, CSV, PNG, JPEG, WebP, and HTML, up to 20 MB.
  • Rate limits. 300 requests/minute per IP before authentication, then 120 requests/minute per authenticated principal across the API and MCP server. Direct uploads are further limited to 20/minute. Over the limit returns 429 with Retry-After. MCP requests may batch at most 25 calls.
  • Access.Keys are scoped to one site — a key can only read and act on its own site's Pins — shown once at creation, stored hashed, and revocable from Integrations. OAuth clients can be revoked under Account → Connected apps.
  • Public changes. Check Secure Access and get explicit confirmation before publishing or restoring. Uploading only stages a version; it does not change the public file.