Skip to content

Tutorial

Published September 3, 2026 · Updated September 5, 2026

Automate your links with the GetMySocial API

When you manage links for a roster of creators or wire click data into your own dashboards, clicking through a UI stops scaling. The public API gives you the same control over links, groups and analytics, over plain HTTPS.

REST, JSON, keys you create in the dashboard. Part of the Agency plan.

What can you do with the link in bio API?

The GetMySocial public API is a REST interface at https://api.getmysocial.com, with every endpoint under /v3. You authenticate with an API key and exchange JSON: links, groups, teams and a full analytics suite.

On the link side you can create, update, enable, disable, duplicate, delete and bulk delete. On the analytics side you get an account overview, a per-link performance table, time series, visitors, referrers and campaign parameter reports with a CSV export. Country, device and browser splits come from /v3/analytics/breakdowns/{dimension}. Two read-only endpoints, /v3/teams and /v3/api-keys, let an integration discover its own context.

API access is part of the Agency plan. Create a key in your dashboard under the API tab: you can hold up to 5 active keys, and the full key value appears once at creation, so store it in a password manager immediately.

Authenticate every request with a Bearer header. Responses are JSON with a consistent shape: lists arrive in an envelope with cursor pagination, objects carry prefixed ids like lnk_ for links, and every error is a structured object with a type, code and message.

Prefer talking over typing? The same operations are available by chatting with an AI assistant through our built-in connector: see managing your links with Claude or ChatGPT.

1. Create a link with curl

The minimal create call: a shortcode, a type and a destination.

curl -X POST https://api.getmysocial.com/v3/links \
  -H "Authorization: Bearer gms_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "shortcode": "summer",
    "type": "directlink",
    "url": "https://example.com/summer-promo",
    "display_name": "Summer Promo"
  }'

A successful response returns the full link object with its lnk_ id. If the shortcode is already taken you get a 409 with code shortcode_taken: catch it and retry with a different shortcode.

2. Pull a performance table for every link

One request returns pageviews, button clicks, unique visitors and CTR for each link: exactly the table you would otherwise build by hand. Do not loop an overview call per link. This endpoint exists so you never have to.

curl "https://api.getmysocial.com/v3/analytics/links?limit=100&timeframe=30" \
  -H "Authorization: Bearer gms_live_YOUR_KEY"

The timeframe=30 is doing real work: leave it out and every analytics endpoint answers for today only, with no warning. Lists are cursor-paginated, so when the response has has_more: true, pass its next_cursor back as ?cursor=. Resend the same sort with it, or you get a 400 invalid_cursor.

3. Export campaign data straight to a spreadsheet

If your links track URL parameters like utm_source, the API reports on them and exports a real CSV file, ready for Sheets or Excel.

# See which tracked parameters have data
curl "https://api.getmysocial.com/v3/analytics/tracking-params?timeframe=30" \
  -H "Authorization: Bearer gms_live_YOUR_KEY"

# Download the utm_source breakdown as CSV
curl -o utm_source.csv \
  "https://api.getmysocial.com/v3/analytics/tracking-params/utm_source/export.csv?timeframe=30" \
  -H "Authorization: Bearer gms_live_YOUR_KEY"

Parameter tracking is opt-in per link: name the parameters you care about (up to 10) in the link Tracking panel, and every visit carrying them gets recorded from then on. CSV is the one export format the API produces, and it exists only for tracking parameters.

Rules for a well-behaved integration

  • Send a timeframe with every analytics call

    Each /v3/analytics/ endpoint answers for today when timeframe is missing. Pass timeframe=7, 30 or 90 for a rolling window. Dates in start_date and end_date are ignored until you also send timeframe_type=custom.

  • Treat PATCH as a full replacement

    PATCH /v3/links/{id} validates the body as a complete link payload. display_name is required on every call, and several toggles fall back to their defaults when you leave them out. Fetch the link, change the one field you want, send the whole object back.

  • Respect the rate limits

    Reads allow 120 requests per minute, writes 60, each with its own daily budget. Every response carries X-RateLimit headers, and a Retry-After header tells you when to back off.

  • Know which reads degrade and which do not

    Cacheable reads keep answering over the limit, serving a slightly stale body with an X-GMS-ApiV3-Degraded header. The CSV export and GET /v3/groups are never cached, so they return a hard 429 the moment you cross the line.

  • Use bulk delete for cleanups

    One bulk-delete call accepts up to 100 link ids and counts as a single operation against your quota. Never loop single deletes.

  • Treat keys like passwords

    Keep them out of code repositories, use one key per integration so you can revoke narrowly, and rotate a key by creating its replacement before deleting it.

  • Handle errors by code, not by message

    Error messages can change; codes like shortcode_taken and plan_required will not. Branch on the code and log the request_id for support.

Frequently asked questions

Which plan includes API access?

The Agency plan. Requests from other plans receive a 403 with the code plan_required. You can explore the dashboard and the key management screens on any plan.

Where do I create and revoke API keys?

In your dashboard under the API tab. You can hold up to 5 active keys, the full value is displayed once at creation, and any key can be revoked instantly.

Why does the analytics endpoint only return today?

Because timeframe defaults to today on every analytics path. Add timeframe=7, 30 or 90 for a rolling window, or send timeframe_type=custom together with start_date and end_date for an exact range. Dates on their own are ignored.

What happens if I exceed the rate limits?

Writes are rejected with a 429 and a Retry-After header. Cacheable reads degrade instead: a slightly stale cached body is served with a degraded header, up to a ceiling. The CSV export and the groups endpoint have no cache, so they refuse outright.

Can I manage links without writing code?

Yes. The AI connector gives you the same operations conversationally through Claude, ChatGPT, Cursor or VS Code, with OAuth instead of an API key.

Are there webhooks?

Not currently. For near-real-time needs, poll the analytics endpoints within your rate budget.

Build on top of your links

Open an account free, and when your workflow outgrows the dashboard, the Agency plan puts the whole platform behind an API key.

Create your account