feature APIfeature.fm ↗
Fetch artist names, streaming service links, release dates, cover art, and link type from any feature.fm (ffm.to) shortlink via one API endpoint.
What is the feature API?
The feature.fm API exposes 1 endpoint — get_presave_info — that returns 10 structured fields from any ffm.to shortlink, including artist identifier, release title, cover art URL, link type (pre_release or post_release), streaming service list, and release timezone. Pass either a bare slug like swimteam or a full URL and get back the release metadata without loading the page.
curl -X GET 'https://api.parse.bot/scraper/d848e99f-9b0d-4025-b5ca-f207f08244ef/get_presave_info?shortlink=swimteam' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace feature-fm-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Feature.fm SDK — fetch release link metadata."""
from parse_apis.feature_fm_api import FeatureFm, LinkNotFound
client = FeatureFm()
# Fetch a release link by its shortlink slug
try:
link = client.links.get(shortlink="swimteam")
except LinkNotFound:
print("Link not found")
raise
# Display core release metadata
print(f"{link.artist_name} — {link.release_name}")
print(f"Type: {link.type} | Layout: {link.page_layout}")
print(f"Pre-release: {link.is_pre_release}")
print(f"Cover art: {link.image_url}")
# List available streaming services
for svc in link.services:
print(f" Service: {svc.name} ({svc.id})")
# List social links
for social in link.social_links:
print(f" {social.platform}: {social.url}")
print("exercised: links.get")
Fetches release information from a feature.fm shortlink (ffm.to). Returns metadata about the release including artist name, release title, link type (pre_release or post_release), release date, available streaming services with direct URLs, cover art URL, and social media links. Accepts either a slug or full URL as input.
| Param | Type | Description |
|---|---|---|
| shortlinkrequired | string | The feature.fm shortlink slug (e.g. 'swimteam') or full URL (e.g. 'https://ffm.to/swimteam'). |
{
"type": "object",
"fields": {
"url": "Canonical URL of the link",
"type": "Content type (e.g. 'track', 'album', 'artist')",
"title": "Full page title (typically 'Artist - Release Name')",
"services": "Array of available streaming services with name, id, and direct streaming url",
"short_id": "The shortlink slug",
"timezone": "Timezone configured for the release",
"artist_id": "Feature.fm internal artist identifier",
"image_url": "URL of the release cover art image",
"link_type": "Link type: 'pre_release' for upcoming releases or 'post_release' for released content",
"object_id": "Feature.fm internal object identifier",
"artist_name": "Artist name extracted from the title, or null if not parseable",
"description": "Page meta description",
"page_layout": "Page layout style used for the landing page",
"release_date": "ISO datetime string of scheduled release, or null if not set",
"release_name": "Release/track name",
"social_links": "Array of artist social media links with platform and url",
"is_pre_release": "Boolean indicating if this is a pre-release/pre-save link"
},
"sample": {
"data": {
"url": "https://ffm.to/swimteam",
"type": "track",
"title": "Christelle Bofale - Swim Team",
"services": [
{
"id": "apple",
"name": "Apple Music"
},
{
"id": "itunes",
"name": "iTunes"
}
],
"short_id": "swimteam",
"timezone": "America/New_York",
"artist_id": "5c98fee90e00000ba39ba6fa",
"image_url": "https://cloudinary-cdn.ffm.to/s--wBEOO9At--/w_1108,h_1108,c_lfill/f_jpg/https%3A%2F%2Fd9nqml74o2sdi.cloudfront.net%2F39120619-fc4d-4582-bc82-bdb56020c2c3.6aa1b877-a0ba-4ed8-8bf5-9daba5ac3d87",
"link_type": "post_release",
"object_id": "5c98feeb0b000059f83e2c53",
"artist_name": "Christelle Bofale",
"description": "Choose your preferred music service",
"page_layout": "action_page",
"release_date": null,
"release_name": "Swim Team",
"social_links": [
{
"url": "https://www.facebook.com/christellebofale",
"platform": "facebook"
},
{
"url": "https://twitter.com/bofalebill",
"platform": "twitter"
},
{
"url": "https://www.instagram.com/christellebofale",
"platform": "instagram"
}
],
"is_pre_release": false
},
"status": "success"
}
}About the feature API
What the API Returns
The get_presave_info endpoint accepts a single required parameter, shortlink, which can be either the slug portion of an ffm.to URL (e.g. swimteam) or the full URL (e.g. https://ffm.to/swimteam). The response includes the canonical url, the short_id slug, a title field formatted as Artist - Release Name, and a type field indicating whether the link points to a track, album, or artist page.
Release and Distribution Fields
The link_type field distinguishes between pre_release (upcoming release with an active pre-save) and post_release (already released content). The services array lists each streaming platform available for the release, with both a human-readable name and a machine-readable id. The image_url field provides a direct URL to the release cover art. The timezone field reflects the release timezone configured by the artist or label, which is relevant when interpreting release dates for pre-saves.
Artist and Object Identifiers
Two internal identifiers are returned: artist_id (the feature.fm artist account identifier) and object_id (the feature.fm identifier for the specific release or link object). These can be used to correlate multiple shortlinks belonging to the same artist across requests.
The feature API is a managed, monitored endpoint for feature.fm — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when feature.fm changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official feature.fm API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Detect whether an ffm.to link is a pre-save or a live release by checking the
link_typefield - Build a streaming availability matrix by parsing the
servicesarray across a catalog of shortlinks - Resolve an ffm.to slug to its canonical URL and cover art for display in a music newsletter
- Extract
artist_idto group multiple releases under the same artist without manual lookup - Monitor release status changes from
pre_releasetopost_releaseby polling a list of shortlinks - Populate a release database with title, type, and timezone data derived from label-distributed shortlinks
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does feature.fm offer an official developer API?+
What does `link_type` actually distinguish, and can I tell the exact release date from the response?+
link_type field returns either pre_release for upcoming releases that have an active pre-save campaign, or post_release for content that is already publicly available. The response includes a timezone field that reflects the configured release timezone, but a raw release date timestamp is not a separate top-level field in the current response shape.Does the API return direct streaming URLs (e.g. Spotify or Apple Music links) for each service?+
services array returns the name and id of each available streaming platform, but per-service deep links to the release on each platform are not included in the current response. You can fork this API on Parse and revise it to add an endpoint that resolves individual service URLs.Can I look up all releases for a given artist using the `artist_id` returned?+
artist_id that identifies the artist account, but there is no endpoint for listing all releases or shortlinks associated with that artist. You can fork this API on Parse and revise it to add that listing endpoint.Are there shortlinks that the endpoint cannot resolve?+
services data depending on how the link was configured by the artist or distributor.