API Reference
Browse every REST and OAuth operation with its exact host, authentication method, scopes, parameters, request fields, and response codes.
OpenAPI v2.1.0
API overview
Public /v2 operations accept either a scoped API key or an OAuth 2.0 access token. OAuth management operations use their own browser, session, or client-credential requirements.
- Base URL:
- https://api.s.id/v2
- Operations
- 38
- Scopes
- 10
Authentication
Credentials are scoped. Missing a required scope returns 403 insufficient_scope. Request only the permissions your integration needs.
Authorization: Bearer sk_live_...Endpoints
Endpoint catalog
Expand an operation to inspect its exact base URL, authentication, inputs, and possible response codes.
Links
GET/linksList links
Returns a paginated list of the authenticated user's links.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:readParameters
pagequery · integerlimitquery · integersearchquery · stringFilter by short code or URL
Responses
200List of links401403429POST/linksCreate a link
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:writeRequest body
long_urlstringRequiredThe destination (long) URL
titlestringcustom_slugstringCustom short code; auto-generated when omitted
passwordstringOptional password to protect the link
expired_atintegerOptional expiry as a Unix timestamp (seconds)
domain_aliasstringCustom domain to use instead of s.id
Responses
200401403422429POST/links/availableCheck slug availability
Checks whether a custom slug is available before creating a link.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:readRequest body
shortstringRequireddomain_aliasstringCustom domain, if any
Responses
200Slug is available401422Slug is taken or invalidGET/links/{short}Get a link
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:readParameters
shortpath · stringRequiredThe short code of the link
Responses
200401404PUT/links/{short}Update a link
Updates a link. All fields are optional; omitted fields are left unchanged. - `password`: set a non-empty string to protect, empty string `""` to remove protection. - `custom_slug`: rename the short code (subject to quota). - `archive_at`: schedule auto-archive on a date (`YYYY-MM-DD`). - `domain_alias`: change the custom domain (must be owned by the user).
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:writeParameters
shortpath · stringRequiredThe short code of the link
Request body
long_urlstringNew destination URL
titlestringcustom_slugstringRename the short code (subject to plan quota)
passwordstringSet a password (`""` removes existing protection)
disposablebooleanMark link as disposable (expires after first click)
adultbooleanFlag link as adult content
archive_atstringSchedule auto-archive on this date (YYYY-MM-DD)
domain_aliasstringChange the custom domain (must be owned by the user)
Responses
200401403404422429DELETE/links/{short}Archive a link
Archives (soft-deletes) a link. The short code stops resolving. Use `POST /links/{short}/unarchive` to restore.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:archiveParameters
shortpath · stringRequiredThe short code of the link
Responses
200Link archived401404429POST/links/{short}/unarchiveRestore an archived link
Restores a previously archived link, making its short code resolve again.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:writeParameters
shortpath · stringRequiredThe short code of the archived link
Responses
200Link restored401403404429GET/links/{short}/statsLink click timeline
Returns a date-bucketed click-count timeline for the link.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:analyticsParameters
shortpath · stringRequiredstartquery · stringendquery · string
Responses
200Click timeline401403404429GET/links/{short}/stats/lifetimeLifetime click count
Returns the all-time total click count for a single link.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:analyticsParameters
shortpath · stringRequired
Responses
200Lifetime click count401403404429POST/links/bulkBulk create links
Create up to 100 short links in a single request. Requires a subscription plan with bulk shortening enabled. Each item reports individual success/failure — the overall request always returns 200 even if some items fail.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:writeRequest body
linksarray<object>Required
Responses
200Bulk result — individual items may have success=false401402Plan upgrade required (bulk shortening not in plan)403User
GET/userGet authenticated user
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
user:readResponses
200User profile401429GET/quotaGet account quota
Returns the authenticated user's current plan limits and usage counters.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
user:readResponses
200Account quota401429Microsites
GET/micrositesList microsites
Returns a paginated list of microsites owned by the authenticated user.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:readParameters
limitquery · integerafterquery · stringCursor for the next page (opaque string from previous response)
Responses
200List of microsites401403POST/micrositesCreate a microsite
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:writeRequest body
slugstringRequiredURL-safe identifier (alphanumeric + hyphens/underscores)
titlestringRequiredkindstringRequiredMicrosite category (e.g. `personal_branding`, `brand`, `other`)
themestringTheme slug (optional, defaults to the platform default)
Responses
200Microsite created400Validation error (slug already taken, quota exceeded, etc.)401403GET/microsites/{slug}Get a microsite
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:readParameters
slugpath · stringRequired
Responses
200Microsite detail401403404Microsite not foundPUT/microsites/{slug}Update a microsite
Patches title, description, and/or visibility. All fields are optional.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:writeParameters
slugpath · stringRequired
Request body
titlestringdescriptionstringhidebooleanSet `true` to hide the microsite from public (requires plan that supports visibility toggle)
Responses
200Updated microsite401403404Microsite not foundDELETE/microsites/{slug}Delete a microsite
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:deleteParameters
slugpath · stringRequired
Responses
200Microsite deleted401403404Microsite not foundPOST/microsites/availableCheck microsite slug availability
Checks whether a microsite slug is available before creating a microsite.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:readRequest body
slugstringRequired
Responses
200Slug availability result401403429GET/microsites/{slug}/componentsList microsite components
Returns the components belonging to a microsite, in display order.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:readParameters
slugpath · stringRequiredThe slug of the microsite
Responses
200List of microsite components401403404429POST/microsites/{slug}/componentsAdd a microsite component
Adds a new component to a microsite. The body is `{ kind, data, tag? }`. The shape of the `data` object depends on `kind`. Unknown fields are ignored, validation is per-kind, and invalid input returns `422`. All color fields are hex strings (e.g. `#1a56db`). **Kinds:** `PROFILE`, `LINK`, `HORIZONTAL_LINK`, `TEXT`, `IMAGE`, `MEDIA`, `DIVIDER`, `COUNTDOWN`, `MAPS`, `IMAGE_SLIDE`, `CV`, `AUTOPLAY_MUSIC`, `CONTACT`, `CALENDAR`, `SHOP_LISTING`, `SHOP_ITEM`, `SHOP_LEADERBOARD`. **Rules:** - `PROFILE`, `CV` and `AUTOPLAY_MUSIC` are unique — at most one per microsite. - `IMAGE_SLIDE` requires a plan with the Image Slide feature. - On create the password is always stored empty — set or change it via update (`PUT`). - Image fields (`image`, `imageBackground`, slide `image`) must be a local asset path, not a remote URL — they must match `[/.a-zA-Z0-9_-]+.(jpg|jpeg|png|svg|webp|gif|bmp)`; any value containing a scheme (`https://`), `//`, or `..` is rejected. **Shared field groups** (a kind that lists a group accepts all of its fields inside `data`): - **Button styling** (`LINK`, `CONTACT`, `CALENDAR`): `icon` (string, max 255), `textFont` (string, max 100), `textPosition` (string, max 100), `buttonEffect` (string, max 100), `buttonColor` (hex, max 20), `buttonBorderColor` (hex, max 20), `buttonIconBackground` (hex, max 20), `buttonShadowColor` (hex, max 20). - **Spoiler reveal** (`TEXT`, `IMAGE`, `MEDIA`, `MAPS`, `IMAGE_SLIDE`, `SHOP_LEADERBOARD`): `isSpoiler` (bool), `spoilerButtonText` (string, max 140), `spoilerButtonTextPosition` (string, max 100), `spoilerButtonIcon` (string), `spoilerButtonColor` (hex, max 20), `spoilerButtonFont` (string, max 100), `spoilerBackground` (string, max 100), `spoilerBackgroundOpacity` (string, max 100), `spoilerButtonBorderColor` (hex, max 20), `spoilerButtonIconBackground` (hex, max 20), `spoilerButtonShadowColor` (hex, max 20). - **Password protection** (`LINK`, `TEXT`, `IMAGE`, `MEDIA`, `MAPS`, `IMAGE_SLIDE`, `CONTACT`, `CV`, `SHOP_LEADERBOARD`): `passwordActive` (bool), `password` (string, max 255 — set via update only), `passwordMessage` (string, max 255).
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:writeParameters
slugpath · stringRequiredThe slug of the microsite
Request body
kindstringRequiredComponent kind. The shape of `data` depends on this value.
dataobjectRequiredKind-specific component data. Its shape depends on `kind`. See the operation description and examples below.
tagstringOptional grouping tag
Responses
200Component created401403404422429PUT/microsites/{slug}/components/{componentId}Update a microsite component
Updates a single microsite component.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:writeParameters
slugpath · stringRequiredThe slug of the microsite
componentIdpath · stringRequiredThe component ID
Request body
activebooleanRequiredWhether the component is shown
kindstringRequiredComponent kind (e.g. `LINK`, `PROFILE`, `TEXT`)
dataobjectRequiredKind-specific component data
Responses
200Component updated401403404422429DELETE/microsites/{slug}/components/{componentId}Delete a microsite component
Deletes a single microsite component.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:deleteParameters
slugpath · stringRequiredThe slug of the microsite
componentIdpath · stringRequiredThe component ID
Responses
200Component deleted401403404429POST/microsites/{slug}/components/orderReorder microsite components
Reorders a microsite's components according to the provided list of component IDs.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
microsites:writeParameters
slugpath · stringRequiredThe slug of the microsite
Request body
ordersarray<string>RequiredComponent IDs in the desired display order
Responses
200Components reordered401403404422429Analytics
GET/statsAccount-level click analytics
Returns a timeline of clicks plus breakdowns by top links, referers, locations, devices, and browsers for the authenticated account. Date range is gated by subscription plan.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
links:analyticsParameters
startquery · stringStart date (YYYY-MM-DD). Defaults to 30 days ago.
endquery · stringEnd date (YYYY-MM-DD). Defaults to today.
additionalquery · booleanInclude referer, location, device, browser breakdowns
Responses
200Account analytics401403QR
GET/qrGet global QR settings
Returns the account-level (global) QR code settings applied to QR codes by default.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
qr:readResponses
200Global QR settings401403429PUT/qrCustomize global QR settings
Updates the account-level (global) QR code settings. All fields are optional; omitted fields are left unchanged.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
qr:writeRequest body
logostringURL of the logo image embedded in the QR code
colorstringForeground color as a hex value, e.g. #1a56db
Responses
200Updated global QR settings401403422429GET/links/{short}/qrGet a link's QR settings
Returns the QR code settings for a single link.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
qr:readParameters
shortpath · stringRequiredThe short code of the link
Responses
200Link QR settings401403404429PUT/links/{short}/qrCustomize a link's QR settings
Updates the QR code settings for a single link. All fields are optional; omitted fields are left unchanged.
- Base URL
- https://api.s.id/v2
- Authentication
- API key or OAuth 2.0
Scope
qr:writeParameters
shortpath · stringRequiredThe short code of the link
Request body
logostringURL of the logo image embedded in the QR code
colorstringForeground color as a hex value, e.g. #1a56db
Responses
200Updated link QR settings401403404422429OAuth 2.0
POST/oauth/tokenExchange code or refresh token
- Base URL
- https://api.s.id
- Authentication
- API key
Request body
grant_typestringcodestringredirect_uristringclient_idstringclient_secretstringrefresh_tokenstring
Responses
200Token response400Invalid grant, unsupported_grant_type, or invalid_client401Invalid client credentialsPOST/oauth/revokeRevoke a token
Revokes an access or refresh token. Always returns 200 OK regardless of whether the token was valid (RFC 7009).
- Base URL
- https://api.s.id
- Authentication
- API key
Request body
tokenstringRequired
Responses
200Token revokedPOST/oauth/introspectIntrospect a token
Reports whether a token is currently active and, if so, which scopes and client it belongs to (RFC 7662). Client-credential protected: `client_id`/`client_secret` identify the caller, not the token owner. Always returns `200` — including for an unknown, expired, or revoked token (`{"active": false}`) — to avoid leaking token validity to unauthenticated probing.
- Base URL
- https://api.s.id
- Authentication
- API key
Request body
tokenstringRequiredclient_idstringRequiredclient_secretstringRequired
Responses
200Introspection result400Missing token/client_id, or invalid client credentialsGET/oauth/userinfoGet authorized user profile
Returns the profile of the user who authorized the OAuth app. Requires `Authorization: Bearer <access_token>` (the OAuth access token, not an sk_live_ key).
- Base URL
- https://api.s.id
- Authentication
- OAuth 2.0
Scope
user:readResponses
200User profile401UnauthorizedGET/api/user/oauth/appsList apps authorized by the current user
Returns all OAuth clients that have active tokens for the authenticated user. Auth: user session cookie (not API key).
- Base URL
- https://api.s.id
- Authentication
- API key
Responses
200List of connected apps401UnauthorizedDELETE/api/user/oauth/apps/{clientId}Revoke all tokens for an app
Revokes all active tokens granted by the current user to the specified OAuth client.
- Base URL
- https://api.s.id
- Authentication
- API key
Parameters
clientIdpath · stringRequired
Responses
200App access revoked401Unauthorized404App not foundIntegrations
POST/integrations/make/webhook/subscribeSubscribe a Make.com webhook
Registers a Make.com (Integromat) scenario webhook URL to receive s.id events. Authenticated via DeveloperAPIAuth (API key or OAuth Bearer) with no scope requirement — every authenticated developer credential can subscribe.
- Base URL
- https://api.s.id/v2
- Authentication
- API key
Responses
200Subscribed401UnauthorizedPOST/integrations/make/webhook/unsubscribeUnsubscribe a Make.com webhook
Removes a previously registered Make.com scenario webhook subscription. Authenticated via DeveloperAPIAuth with no scope requirement.
- Base URL
- https://api.s.id/v2
- Authentication
- API key
Responses
200Unsubscribed401UnauthorizedScope Reference
links:readList and read links
links:writeCreate and update links (create, edit, restore)
links:archiveArchive links
links:analyticsRead per-link click statistics and lifetime counts
qr:readRead QR code settings (global and per-link)
qr:writeCustomize QR code settings (global and per-link)
user:readRead the authenticated user profile and account quota
microsites:readRead microsites
microsites:writeCreate, update and manage components of microsites
microsites:deleteDelete microsites and their components
Rate Limits
The default limit is 38 requests per minute per credential—per API key or OAuth access token. OAuth apps also have a combined ceiling of 500 requests per minute across their tokens.
Common error responses
- 400
- Malformed or unsupported request
- 401
- Missing, invalid, revoked, or expired credential
- 403
- Credential does not have the required scope
- 404
- Requested resource was not found
- 422
- Request validation failed
- 429
- Rate limit exceeded
Ready to start building?
Create an API key in minutes. Free tier included, no credit card required.
