ShareNotes
Ed. 07 — Public API No key · No login · 20/day free sharenotes.dev
REST API for developers

curl. Paste.
Done.

Create a ShareNotes note from a script, a CI pipeline, or your terminal — one POST request, no API key, no account. Pipe a log file in, get a shareable link back. Free, 20 requests a day per IP.

0 API keys 0 CAPTCHAs 20 req/day free
no auth header just curl
Jump to API reference
No sign-up · Free forever · text/plain or JSON
I

Built for scripts, not for sign-ups.

Auth

No API keys, none to leak.

Nothing to provision, store in a secrets manager, or rotate. The endpoint is open — rate limiting is the only gate.

CI-friendly

No CAPTCHA to solve.

The web editor uses reCAPTCHA; the API doesn't, because a CI runner can't click a checkbox. That's exactly what this endpoint is for.

Limits

20 a day, free.

Per IP address, no tiers, no upsell. Enough for a script that posts a daily log digest or a CI job that shares a failing build's output.

II

Two endpoints. That's the whole API.

Create a note
POST https://sharenotes.dev/api/v1/notes

Send your content as a raw text/plain body, or as JSON if you want a custom slug, an expiry timer, or PIN protection.

# plain text — the whole body becomes the note curl -X POST https://sharenotes.dev/api/v1/notes \ -H "Content-Type: text/plain" \ --data-binary @notes.txt
# JSON — with optional fields curl -X POST https://sharenotes.dev/api/v1/notes \ -H "Content-Type: application/json" \ -d '{ "content": "Deploy notes for v2.3.0...", "customSlug": "deploy-v2-3-0", "expiresIn": "24h" }'

Response — 201 Created:

{ "slug": "deploy-v2-3-0", "url": "https://sharenotes.dev/deploy-v2-3-0", "expiresAt": "2026-06-25T14:32:00.000Z" }
JSON body fields
FieldRequiredDescription
contentRequiredThe text to share. Ignored if you send a text/plain body instead — the whole raw body becomes the content in that case.
customSlugOptional3-10 chars, lowercase letters/numbers/hyphens. Returns 409 if already taken.
expiresInOptionalOne of 1h, 24h, 7d, 30d. Self-destructs after this duration. Omit for no expiry.
passwordOptionalA 4-6 digit PIN to protect the note.
passwordModeOptionaledit (anyone can view, PIN to edit) or view_edit (PIN for both). Requires password.
titleOptionalUp to 100 characters.
Rate limits

20 requests per day per IP address. Every response includes RateLimit-* headers showing your remaining quota for the window. Exceeding the limit returns 429.

Read a note back
GET https://sharenotes.dev/api/v1/notes/:slug
curl https://sharenotes.dev/api/v1/notes/deploy-v2-3-0

Returns the same note shape the editor itself uses: content, updatedAt, passwordRequired, title, expiresAt. 404 if the slug doesn't exist, 410 if it expired.

Errors
400
Validation error — missing content, bad customSlug, invalid expiresIn, etc. Message in the response body.
409
customSlug already taken.
429
Rate limit exceeded — 20/day per IP.
404 / 410
(GET only) note not found, or expired.
III

Answers, briefly.

Do I need an API key?

No. The API is public and unauthenticated — there's no key to request, store, or rotate. Abuse is controlled purely by a per-IP rate limit.

What's the rate limit, and can I get more?

20 POST requests per day per IP address. There's currently no paid tier to raise that limit — it's a flat free limit for everyone.

Can I set an expiry or password through the API?

Yes, if you send a JSON body instead of plain text. Include expiresIn (one of 1h, 24h, 7d, 30d) for a self-destruct timer, or password plus passwordMode to PIN-protect the note.

Is there an official client library?

No — it's a plain REST API, so any HTTP client or curl works. There's no SDK to install.

Is the API stable? Will it change without warning?

The endpoint is versioned at /api/v1/ specifically so it can stay stable. Any breaking change would ship under a new /api/v2/ path rather than altering v1's behavior.

Why use text/plain instead of JSON?

It's the simplest way to pipe a file straight into a note from a shell script — curl --data-binary @file.txt with a text/plain Content-Type, no JSON escaping required. Use JSON only when you need options like a custom slug or expiry.