We will soon be publishing a blog post for Mastodon client developers, showcasing the new API and features that are available in this version.

#mastodev #mastodonapi

Using FourSquare's API to post location checkins to social media

https://shkspr.mobi/blog/2026/06/using-foursquares-api-to-post-location-checkins-to-social-media/

What is this, 2016?

I like sharing my location with my pocket friends sometimes. If I'm in a cool bar that they know, perhaps they can recommend a drink. If they live nearby, maybe they want to come for dinner. Not everyone has FourSquare's SwarmApp, so it is handy to automatically share its updates with other people.

Of course, Swarm doesn't cross-post to social media because walled-gardens are the most profitable. This is my attempt to open it back up again.

Here's what they look like on BlueSky and Mastodon:

Checked in to Hamburger Fischmarkt, Große Elbstr. 9 (Fischmarkt), Germany Probably a *bit* early for a breakfast beer. See on Swarm

[image or embed]

— Terence Eden (@edent.tel) 24 May 2026 at 07:45 Post by @[email protected] View on Mastodon

tl;dr

You can get the SwarmToSocial code from my GitLab.

At the moment, developers get 10,000 API calls for free each month. That's probably more than enough for most personal uses.

Documentation

I was pleasantly surprised that FourSquare's CheckIn documentation was fairly easy to use and understand.

Once you've signed up for a developer account you can create an OAuth app. That will generate a Client ID (ABC123), Client Secret (XYZ789), and you supply a Project URL.

Once done you can follow the Authentication documentation. Or just visit:

https://foursquare.com/oauth2/authenticate? client_id=ABC123 &response_type=code &redirect_uri=https://example.com/

Sign in with your FourSquare account. It will redirect you to:

https://example.com/?code=456QWE

Use that code to construct the final URl:

https://foursquare.com/oauth2/access_token? client_id=ABC123 &client_secret=XYZ789 &grant_type=authorization_code &redirect_uri=http://example.com/ &code=456QWE

That will respond with the Access Token:

{ "access_token":"asdfghjkl123456" }

Hurrah! Posting a new checkin is relatively simple. POST to this URl with a header of accept: application/json

https://api.foursquare.com/v2/checkins/add? v=20260223 &venueId=13600425 &shout=This%20is%20a%20test &oauth_token=asdfghjkl123456
  • v is, rather confusingly, a date. The versioning documentation has more details but, basically, set it to the date you deployed your app.
  • venuId you'll need to find yourself (more on that later).
  • shout is up to 140 characters (!) of URl encoded text.

That will send back rather a lot of JSON. Here are the important bits:

{ "meta": { "code": 200, "requestId": "123456789" }, "response": { "checkin": { "id": "987654321", "createdAt": 1771843820, "type": "checkin", "visibility": "closeFriends", "shout": "This is a test of the API", "timeZoneOffset": -300, "editableUntil": 1771930220000, "user": { "id": "56367", "firstName": "Terence", "lastName": "Eden", "relationship": "self", "displayName": "Terence Eden" }, "venue": { "id": "QWERTYUIOP", "name": "My Birthday Party!", "contact": {}, "location": { "isFuzzed": true, "lat": 39.123456789, "lng": -84.987654321, "cc": "US", "city": "Cincinnati", "state": "KY", "country": "United States", "formattedAddress": [ "Cincinnati, KY", "United States" ] } }, "checkinShortUrl": "https://swarmapp.com/user/56367/checkin/987654321?s=wRZ7ByNfCW1DNrOIpsRcytPZelE" } } }

For my purposes, the shout and checkinShortUrl are the most important. You can view a sample check in:

https://swarmapp.com/user/56367/checkin/699c34b55bad6b7fb1695544?s=LA7jCaAtH-s9CwSpgQrQdHrP5-8

Venue ID

If you're already using a service like Untappd you might be able to get the venue ID from that.

If not, FourSquare provides 100 million points of interest for free - although with questionable data quality.

Alternatively, you can search by location:

curl --request GET \ --url 'https://places-api.foursquare.com/places/search?ll=51.123%2C0.123&radius=1000&sort=POPULARITY' \ --header 'X-Places-Api-Version: 2025-06-17' \ --header 'accept: application/json' \ --header 'authorization: Bearer ABC123'

As far as I can see, the Bearer Token only exists on the documentation page. I couldn't find it in my developer console. Weird!

That gets you back:

{ "results": [ { "fsq_place_id": "4be584ed2457a593ad8cab15", "latitude": 51.11783041264215, "longitude": 0.11219274871133413, "categories": [ { "fsq_category_id": "4bf58dd8d48988d1fa941735", "name": "Farmers Market", "short_name": "Farmers Market", "plural_name": "Farmers Markets", "icon": { "prefix": "https://ss3.4sqi.net/img/categories_v2/shops/food_farmersmarket_", "suffix": ".png" } } ], "date_created": "2010-05-08", "date_refreshed": "2025-11-01", "distance": 970, "extended_location": {}, "link": "/places/4be584ed2457a593ad8cab15", "location": { "address": "", "locality": "Hartfield", "region": "East Sussex", "postcode": "", "admin_region": "England", "country": "GB", "formatted_address": "Hartfield, East Sussex" }, "name": "Perryhill Farm Shop", "placemaker_url": "https://foursquare.com/placemakers/review-place/4be584ed2457a593ad8cab15", "related_places": {}, "social_media": { "twitter": "" }, "tel": "", "website": "http://www.perryhillorchards.co.uk/index.php?sec=4" }, { "fsq_place_id": "8896f77565e54a658585301d", "latitude": 51.11649, "longitude": 0.13131, "categories": [], "date_created": "2021-12-06", "date_refreshed": "2021-12-06", "distance": 909, "extended_location": {}, "link": "/places/8896f77565e54a658585301d", "location": { "address": "Priory Park, Beech Green Lane", "locality": "Withyham", "region": "East Sussex", "postcode": "TN7 4DB", "admin_region": "England", "post_town": "Hartfield", "country": "GB", "formatted_address": "Priory Park, Beech Green Lane, Withyham, East Sussex, TN7 4DB" }, "name": "Spectra Studios", "placemaker_url": "https://foursquare.com/placemakers/review-place/8896f77565e54a658585301d", "related_places": {}, "social_media": {}, "tel": "01892 487149" }, ], "context": { "geo_bounds": { "circle": { "center": { "latitude": 51.123, "longitude": 0.1234 }, "radius": 1000 } } } }

You can manually check a place using the Placemaker site: https://foursquare.com/placemakers/review-place/64eca80f0398c97ab52298ec

Getting Existing Checkins

What if you've checked in to a place using the official Swarm app? How do you get your own recent checkin data?

Again, there is documentation on getting user checkins.

curl --request GET \ --url 'https://api.foursquare.com/v2/users/self/checkins?v=20260223&limit=2&offset=0&oauth_token=asdfghjkl123456' \ --header 'accept: application/json'

Where it says oauth_token it actually means the access_token.

The JSON that is returned is a bit verbose, so I've simplified it here:

{ "meta": { "code": 200, "requestId": "699c6505b488565a31e315e3" }, "response": { "checkins": { "count": 2344, "items": [ { "id": "699c34b55bad6b7fb1695544", "createdAt": 1771844789, "type": "checkin", "visibility": "closeFriends", "entities": [], "shout": "Testing the API using an Untappd FourSquare ID.", "timeZoneOffset": 0, "editableUntil": 1771931189000, "venue": { "id": "64eca80f0398c97ab52298ec", "name": "Abbey Wood Fossil Pit", "contact": {}, "location": { "lat": 51.487514, "lng": 0.13048041, "postalCode": "SE2 0AX", "cc": "GB", "country": "United Kingdom", "formattedAddress": [ "SE2 0AX" ] }, "createdAt": 1693231119 }, },

Annoyingly, there's no checkinShortUrl which means it can't easily be shared.

For that, you'll need to use the get-checkin-details API:

curl --request GET \ --url 'https://api.foursquare.com/v2/checkins/699c34b55bad6b7fb1695544?v=20250202&oauth_token=asdfghjkl123456' \ --header 'accept: application/json'

Which will return this (truncated for brevity):

{ "meta": { "code": 200, "requestId": "699c67de5f5c0a0e8ab234db" }, "response": { "checkin": { "id": "699c34b55bad6b7fb1695544", "createdAt": 1771844789, "type": "checkin", "shout": "Testing the API using an Untappd FourSquare ID.", "timeZoneOffset": 0, "checkinShortUrl": "https://swarmapp.com/user/56367/checkin/699c34b55bad6b7fb1695544?s=LA7jCaAtH-s9CwSpgQrQdHrP5-8",

Photos

If there's a photo with the checkin, it will be return in the JSON like this:

{ "response": { "checkin": { "photos": { "count": 1, "items": [ { "id": "699f3a9f96799c05c0f16c9c", "createdAt": 1772042911, "prefix": "https://fastly.4sqi.net/img/general/", "suffix": "/56367_5VYox4Y-hs66wURVsYc1NLgOokfwBfcWhtKQrOlMdD8.jpg", "width": 1008, "height": 1344,

The URl for the image is prefix width x height suffix - in this case https://fastly.4sqi.net/img/general/1008x1344/56367_5VYox4Y-hs66wURVsYc1NLgOokfwBfcWhtKQrOlMdD8.jpg

You can adjust the width and height if you want a thumbnail or some other resolution.

If there's no photo, the count will be 0.

Putting it all together

Every 15 minutes, the SwarmToSocial code does the following:

  • Get the most recent checkin.
  • Read a local file to get the previously seen checkin ID.
  • If the checkin ID hasn't been seen before:
  • Get the checkin details.
  • Get the photo if it exists
  • Post the checkin (plus photo) to Mastodon & BlueSky.
  • Save the checkin ID to a file.
  • Enjoy!

    #api #BlueSky #FourSquare #geolocation #MastodonAPI
    Using FourSquare's API to post location checkins to social media

    What is this, 2016? I like sharing my location with my pocket friends sometimes. If I'm in a cool bar that they know, perhaps they can recommend a drink. If they live nearby, maybe they want to come for dinner. Not everyone has FourSquare's SwarmApp, so it is handy to automatically share its updates with other people. Of course, Swarm doesn't cross-post to social media because walled-gardens…

    Terence Eden’s Blog

    🆕 blog! “Using FourSquare's API to post location checkins to social media”

    What is this, 2016?

    I like sharing my location with my pocket friends sometimes. If I'm in a cool bar that they know, perhaps they can recommend a drink. If they live nearby, maybe they want to come for dinner. Not everyone has FourSquare's…

    👀 Read more: https://shkspr.mobi/blog/2026/06/using-foursquares-api-to-post-location-checkins-to-social-media/

    #api #BlueSky #FourSquare #geolocation #MastodonAPI

    Using FourSquare's API to post location checkins to social media

    What is this, 2016? I like sharing my location with my pocket friends sometimes. If I'm in a cool bar that they know, perhaps they can recommend a drink. If they live nearby, maybe they want to come for dinner. Not everyone has FourSquare's SwarmApp, so it is handy to automatically share its updates with other people. Of course, Swarm doesn't cross-post to social media because walled-gardens…

    Terence Eden’s Blog
    Is getting this really the best way to fetch a post on a remote instance via the mastodon API?

    https://${localInstance}/api/v2/search?q=${postUrl}&resolve=true&limit=1

    #Mastodonapi #API
    GitHub - halcy/Mastodon.py: Python wrapper for the Mastodon ( https://github.com/mastodon/mastodon/ ) API.

    Python wrapper for the Mastodon ( https://github.com/mastodon/mastodon/ ) API. - halcy/Mastodon.py

    GitHub

    Today I unfollowed about 120 accounts that hadn't posted in more than ~8 months.

    It's a bummer to see so many gone and I hope they return, but my feed has been more active than ever. Plus, I'll likely be more liberal in following new folks for a while.

    What do ya'll do for user management? I cobbled together some JS for the MastoAPI to sort out the >8mo old accounts. I really didn't find any existing apps / repos for that type of thing.

    #mastodon #fediverse #userManagement #mastodonAPI

    @silverpill @Connected Places The problem with the Mastodon client API is still that it's a Mastodon API. As in, geared towards only one Fediverse server application. In fact, as in, geared towards a very lack-lustre server application that lacks features which have been present in many other places in the Fediverse for years.

    This means that you can use a whole lot of microblogging server applications with Mastodon clients. You can even use Friendica with some Mastodon clients. But then you're limited to the features which Mastodon has as well because the Mastodon client API doesn't support any features that Mastodon doesn't have. Why should it, after all?

    At the end of the day, the Mastodon client API is designed and maintained by the Mastodon developers. It's them who decide what it can do and what it can't do. For one, they won't waste their time adding features to it that Mastodon itself doesn't have. Besides, if they did, they'd support Mastodon's direct competition and strengthen their advantages over Mastodon when they could throw rocks into their paths instead like they've always done.

    This, by the way, is also one reason why both the developers of Hubzilla and the developer of (streams) and Forte refuse to implement the Mastodon client API. It simply wouldn't cover at least 90% of the features of these server applications, including features which you'll need all the time, everyday. That, and they don't want their software to end up at the mercy of Mastodon's developers and Mastodon's product politics by making it depend on Mastodon's technology. They'd rather have no native mobile app at all (and currently they do).

    #Long #LongPost #CWLong #CWLongPost #FediMeta #FediverseMeta #CWFediMeta #CWFediverseMeta #Mastodon #Hubzilla #Streams #(streams) #Forte #MastodonAPI #MastodonClientAPI
    Netzgemeinde/Hubzilla

    Adding "Log In With Mastodon" to Auth0

    https://shkspr.mobi/blog/2026/03/adding-log-in-with-mastodon-to-auth0/

    I use Auth0 to provide social logins for the OpenBenches website. I don't want to deal with creating user accounts, managing passwords, or anything like that, so Auth0 is perfect for my needs.

    There are a wide range of social media logins provided by Auth0 - including the usual suspects like Facebook, Twitter, WordPress, Discord, etc. Sadly, there's no support for Mastodon0.

    All is not lost though. The Auth0 documentation says:

    However, you can use Auth0’s Connections API to add any OAuth2 Authorization Server as an identity provider.

    You can manually add a single Mastodon instance, but that doesn't work with the decentralised nature of the Fediverse. Instead, I've come up with a manual solution which works with any Mastodon server!

    Background

    Every Mastodon1 server is independent. I have an account on mastodon.social you have an account on whatever.chaos. They are separate servers, albeit running similar software. A generic authenticator needs to work with all these servers. There's no point only allowing log ins from a single server.

    Fortuitously, Mastodon allows app developers to automatically create new apps. A few simple lines of code and you will have an API key suitable for read-only access to that server. You can read how to instantly create Mastodon API keys or you can steal my PHP code.

    User Experience

    The user clicks the sign-in button on OpenBenches. They're taken to the Auth0 social login screen:

    The user clicks on Mastodon. This is where Auth0's involvement ends!

    The user is asked to provide the URl of their instance:

    In the background, my server contacts the Mastodon instance and creates a read-only API key.

    The user is asked to sign in to Mastodon.

    The user is asked to authorise read-only access.

    The user is now signed in and OpenBenches can retrieve their name, avatar image, and other useful information. Hurrah!

    Auth0

    Once you have created a service to generate API keys, it will need to run on a publicly accessible web server. For example https://example.com/mastodon_login.

    Here's what you need to do within your Auth0 tennant:

    • Authentication → Social → Create Connection
    • At the bottom, choose "Create Custom".
    • Choose "Authentication" only.
    • Give your connection a name. This will be visible to users.
    • "Authorization URL" and "Token URL" have the same value - the URl of your service.
    • "Client ID" is only visible to you.
    • "Client Secret" any random password; it won't be used for anything.
    • Leave everything else in the default state.

    It should look something like this:

    Click the "Create" button and you're (almost) done.

    Auth0 Icon

    You will need to add a custom icon to the social integration. Annoyingly, there's no way to do it through the web interface, so follow that guide to use the command line.

    Done!

    I'll admit, this isn't the most straightforward thing to implement. Auth0 could make this easier - but it would still rely on users knowing the URl of their home instance.

    That said, the Mastodon API is a delight to work with and the read-only permissions reduce risk for all parties.

  • Auth0 did blog about Mastodon a few years ago but never bothered implementing it! ↩︎

  • I do mean Mastodon; not the wider Fediverse. This only works with sites which have implemented Mastodon's APIs. ↩︎

  • #Auth0 #HowTo #mastodon #MastodonAPI #SocialMedia
    Adding "Log In With Mastodon" to Auth0

    I use Auth0 to provide social logins for the OpenBenches website. I don't want to deal with creating user accounts, managing passwords, or anything like that, so Auth0 is perfect for my needs. There are a wide range of social media logins provided by Auth0 - including the usual suspects like Facebook, Twitter, WordPress, Discord, etc. Sadly, there's no support for Mastodon. All is not lost…

    Terence Eden’s Blog

    🆕 blog! “Adding "Log In With Mastodon" to Auth0”

    I use Auth0 to provide social logins for the OpenBenches website. I don't want to deal with creating user accounts, managing passwords, or anything like that, so Auth0 is perfect for my needs.

    There are a wide range of social media logins provided by Auth0 - including the usual suspects like…

    👀 Read more: https://shkspr.mobi/blog/2026/03/adding-log-in-with-mastodon-to-auth0/

    #Auth0 #HowTo #mastodon #MastodonAPI #SocialMedia

    Adding "Log In With Mastodon" to Auth0

    I use Auth0 to provide social logins for the OpenBenches website. I don't want to deal with creating user accounts, managing passwords, or anything like that, so Auth0 is perfect for my needs. There are a wide range of social media logins provided by Auth0 - including the usual suspects like Facebook, Twitter, WordPress, Discord, etc. Sadly, there's no support for Mastodon. All is not lost…

    Terence Eden’s Blog
    I've created a little #Mastodon 🐘 toot edit history viewer that lets you explore the history of a toot, edit by edit, through the #MastodonAPI. Here's an example: https://tomayac.github.io/mastodon-edit-history/#https://mastodon.social/@firefoxwebdevs/116002119945073671. Source code: https://github.com/tomayac/mastodon-edit-history.
    MastoDiff - Deep Linkable History