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. Nobody touches the URL.

Watch the 2-minute walkthrough

Video coming soon. Use 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. You can also 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 by restoring 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. It is 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.