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
- Create an API key on your Integrations page (Pro plan). Keys look like
pin_live_…and are shown once. 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, astaged_preview_url(a draft preview for your team — not the public link), and the Pin'spermanent_link.internal_labelis an optional private note;change_labelsets the optional public label (shown to viewers) — omit it to stage with no public label. Find Pin ids viaGET /api/v1/pins.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/orchange_label(the public label). Add"announce": truewith achange_labelto show the change badge and notify subscribers. Relabel later withPATCH /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 action → Import 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
| Endpoint | Purpose |
|---|---|
| GET /api/v1/sites | List sites this key can publish to |
| GET /api/v1/readme | Full operating guide for clients and assistants |
| GET /api/v1/pins | List Pins and their live versions |
| GET /api/v1/pins/{id}/active-version | What's currently published |
| GET /api/v1/pins/{id}/active-version/content | Fetch the live file's content (text or signed URL) |
| POST /api/v1/uploads/direct | One-call upload (base64 or HTML) |
| POST /api/v1/uploads/prepare | Signed URL for large files |
| POST /api/v1/uploads/complete | Finalise a prepared upload |
| POST /api/v1/versions/{id}/publish | Make a staged version live (or schedule it) |
| GET /api/v1/pins/{id}/versions | Version history, including archived |
| GET /api/v1/versions/{id}/content | Fetch a version's file content (text or signed URL) |
| POST /api/v1/versions/{id}/restore | Roll back — restore an archived version |
| PATCH /api/v1/versions/{id}/label | Set a version's public and/or internal label |
| POST /api/v1/pins | Create a new Pin |
| PATCH /api/v1/pins/{id} | Rename a Pin |
| GET /api/v1/sites/{id}/folders | List folders |
| POST /api/v1/sites/{id}/folders | Create a folder |
| PATCH /api/v1/pins/{id}/folder | Move a Pin into a folder |
| GET /api/v1/pins/{id}/secure-access | Read the secure-access gate |
| PATCH /api/v1/pins/{id}/secure-access | Require 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-Keyheader. 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.