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
- 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. 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 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 by restoring 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. 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.