Skip to content

Fellow API

The Fellow API provides programmatic access to App Store feature history and screenshots. Integrate that data into your systems and workflows.

API access is available on Scale. App count and history limits follow the account’s plan.

Use the API to:

Requests run with the permissions and plan limits of the authenticated account. Feature data and screenshots are available only for apps with active tracking, within the feature history your plan includes.

Download OpenAPI schema

https://app.fellowdev.io/api/v1

Send a bearer token in the Authorization header with every request.

API keys belong to an account and grant full API access within its plan limits.

Manage keys in Developers → API keys on desktop.

Authorization: Bearer YOUR_API_TOKEN

Requests without a valid token return 401.

The API is served over HTTPS. Send request bodies as JSON with Content-Type: application/json. Pass filters and pagination parameters in the query string.

Successful responses return JSON with the result in data, as an object or an array. List responses also include pagination. A successful DELETE returns 204 with no body.

Fellow app IDs start with app_ and feature IDs start with feat_, followed by at least eight digits. Treat them as strings. Apple IDs such as apple_app_id and apple_feature_id are strings. Dates use YYYY-MM-DD and timestamps use ISO 8601. Both are in UTC.

Pass filters in the query string. GET /features supports all of the parameters below. GET /features/{fellow_feature_id}/screenshots supports countries, from and to.

  • App. Limit results to one app with fellow_app_id or apple_app_id. The two are mutually exclusive, and supplying both returns 400. Omit both to include all active tracked apps.
  • Lists. countries and types take comma-separated values, as in countries=US,GB. Values within a filter match with OR. Different filters combine with AND. Country codes are case-insensitive. Empty or unsupported values return 400.
  • Dates. from and to are inclusive YYYY-MM-DD dates in UTC. Results match history periods that overlap the range. from defaults to the start of your available history and to defaults to today. from must be on or before to. A from before your available history returns 403.
  • Sort. sort orders features by first_seen or last_seen. Prefix the field with - for descending order. The default is -last_seen. Ties have a stable order.

Unknown or repeated parameters return 400. When nothing matches, data is an empty array.

List endpoints use cursor pagination.

ParameterTypeDescription
limitintegerItems per page. Default 50. Maximum 100.
cursorstringnext_cursor from the previous response.

Each list response includes a pagination object. To get the next page, pass next_cursor as cursor and keep the same filters, sort order and limit. On the last page, has_more is false and next_cursor is null.

{
  "pagination": {
    "next_cursor": "opaque_example_cursor",
    "has_more": true
  }
}

Cursors are tied to your account. An invalid, expired or mismatched cursor returns 400.

Errors use application/problem+json. The body includes status, code and detail. Validation errors can include field-level details in errors.

StatusCodesDescription
400invalid_query, invalid_body, invalid_cursorInvalid request.
401invalid_tokenMissing or invalid token.
403access_denied, app_tracking_paused, history_not_availableAccess denied.
404not_foundNot found.
409tracking_limit_reached, tracking_change_limit_reachedTracking request blocked.
413invalid_bodyRequest body too large.
429rate_limit_exceededUsage limit reached.
500internal_errorServer error.

On 429, wait for the number of seconds in Retry-After before retrying.

Error response example
{
  "type": "about:blank",
  "title": "Bad Request",
  "status": 400,
  "detail": "Use fellow_app_id or apple_app_id, not both.",
  "code": "invalid_query",
  "errors": [
    {
      "field": "fellow_app_id",
      "code": "mutually_exclusive",
      "message": "Use fellow_app_id or apple_app_id, not both."
    },
    {
      "field": "apple_app_id",
      "code": "mutually_exclusive",
      "message": "Use fellow_app_id or apple_app_id, not both."
    }
  ]
}
MethodPathDescription
GET/accountGet the account type and plan tier.
GET/tracked-appsList tracked apps.
POST/tracked-appsAdd a tracked app by Apple app ID.
GET/tracked-apps/{fellow_app_id}Get a tracked app.
DELETE/tracked-apps/{fellow_app_id}Remove a tracked app.
GET/featuresList features with filters and sorting.
GET/features/{fellow_feature_id}Get a feature and its history.
GET/features/{fellow_feature_id}/screenshotsList a feature’s screenshots.

The account your API key belongs to, including its type and effective plan tier.

GET /api/v1/account

Returns the account type and effective plan tier for the API key.

Authorization Bearer

No parameters.

Request

curl 'https://app.fellowdev.io/api/v1/account' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'

Responses

The account type and effective plan tier.

application/json

{
  "data": {
    "type": "individual",
    "tier": "pro"
  }
}
Response fields
data object required

The account associated with the API key.

Child fields 2
type string required

Individual or team account.

Values
individualteam
Exampleindividual
tier string required

The account’s effective plan tier. API permissions and allowances are evaluated separately.

Values
freeindieproscale
Examplepro

Add apps by their Apple App Store ID. Use the returned fellow_app_id to get or remove a tracked app. Tracking status is active or paused. App details, feature data and screenshots require active tracking.

Pro allows 10 active apps and Scale allows 100. In any rolling 60-day period, an account can track up to 15 distinct apps on Pro or 120 on Scale. Removed apps count for 60 days after removal. Re-adding an app already counted is free. These limits also apply in the Fellow app. Indie allows 3 active apps and 6 distinct apps in the same period.

GET /api/v1/tracked-apps

Returns active and paused tracked apps in a stable order.

Authorization Bearer

Query parameters

status string optional

Tracking status. Omit to include active and paused apps.

Values
activepaused
Exampleactive
limit integer optional

Number of items per page. Defaults to 50. Maximum 100.

Default50
Example50
Minimum1
Maximum100
cursor string optional

Use pagination.next_cursor from the previous response. Keep filters, sort order and limit unchanged. Cursors are tied to your account. Invalid, expired or mismatched cursors return 400.

Exampleopaque_example_cursor
Min. length1

Request

curl 'https://app.fellowdev.io/api/v1/tracked-apps?status=active' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'

Responses

A page of tracked apps, or an empty data array.

application/json

{
  "data": [
    {
      "fellow_app_id": "app_30274105",
      "apple_app_id": "123456789",
      "name": "Demo Fitness",
      "tracking_status": "active",
      "tracked_at": "2026-09-10T09:00:00Z"
    }
  ],
  "pagination": {
    "next_cursor": null,
    "has_more": false
  }
}
Response fields
data array<object> required
Child fields 5
fellow_app_id string required

Fellow app ID. Use with the fellow_app_id filter.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$
apple_app_id string required

Apple App Store app ID. Use with the apple_app_id filter.

Example123456789
Pattern^[0-9]+$
name string | null required

App display name, or null when unavailable.

ExampleDemo Fitness
tracking_status string required

Current tracking status for this account.

Values
activepaused
Exampleactive
tracked_at string (date-time) required

UTC timestamp when this account began tracking this app.

Example2026-09-10T09:00:00Z
pagination object required

Continue with next_cursor and unchanged filters, ordering and limit. Stop when has_more is false.

Child fields 2
next_cursor string | null required

Opaque, account-bound continuation cursor. null on the final page.

Examplenull
Min. length1
has_more boolean required

Whether another page is available through next_cursor.

Examplefalse
POST /api/v1/tracked-apps

Starts tracking an app by its Apple App Store ID. Fellow retrieves the app details. Returns 201 for a newly tracked app, or 200 if the app is already tracked. An existing tracking status is unchanged. Pro allows 10 active apps and 15 distinct apps tracked within a rolling 60-day period. Scale allows 100 active apps and 120 distinct apps in that period. Removed apps count for 60 days after removal. Re-adding an app already counted is free.

Authorization Bearer

Request body application/json

apple_app_id string required

Apple App Store app ID, always encoded as a string.

Example123456789
Pattern^[0-9]+$

Request

curl --request POST 'https://app.fellowdev.io/api/v1/tracked-apps' \
  --header 'Authorization: Bearer YOUR_API_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{"apple_app_id":"123456789"}'

Responses

App added to tracking.

application/json

{
  "data": {
    "fellow_app_id": "app_30274105",
    "apple_app_id": "123456789",
    "name": "Demo Fitness",
    "tracking_status": "active",
    "tracked_at": "2026-09-10T09:00:00Z"
  }
}
Response fields
data object required

An app tracked by the account. fellow_app_id identifies the Fellow app, not its tracking relationship.

Child fields 5
fellow_app_id string required

Fellow app ID. Use with the fellow_app_id filter.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$
apple_app_id string required

Apple App Store app ID. Use with the apple_app_id filter.

Example123456789
Pattern^[0-9]+$
name string | null required

App display name, or null when unavailable.

ExampleDemo Fitness
tracking_status string required

Current tracking status for this account.

Values
activepaused
Exampleactive
tracked_at string (date-time) required

UTC timestamp when this account began tracking this app.

Example2026-09-10T09:00:00Z
Response headers
Location string (uri-reference) optional

Relative URI of the tracked-app resource.

Example/api/v1/tracked-apps/app_30274105
GET /api/v1/tracked-apps/{fellow_app_id}

Returns an active tracked app. Paused apps return 403. Untracked apps return 404.

Authorization Bearer

Path parameters

fellow_app_id string required

fellow_app_id returned by the tracked-app endpoints.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$

Request

curl 'https://app.fellowdev.io/api/v1/tracked-apps/app_30274105' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'

Responses

The active tracked app.

application/json

{
  "data": {
    "fellow_app_id": "app_30274105",
    "apple_app_id": "123456789",
    "name": "Demo Fitness",
    "tracking_status": "active",
    "tracked_at": "2026-09-10T09:00:00Z"
  }
}
Response fields
data object required

An app tracked by the account. fellow_app_id identifies the Fellow app, not its tracking relationship.

Child fields 5
fellow_app_id string required

Fellow app ID. Use with the fellow_app_id filter.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$
apple_app_id string required

Apple App Store app ID. Use with the apple_app_id filter.

Example123456789
Pattern^[0-9]+$
name string | null required

App display name, or null when unavailable.

ExampleDemo Fitness
tracking_status string required

Current tracking status for this account.

Values
activepaused
Exampleactive
tracked_at string (date-time) required

UTC timestamp when this account began tracking this app.

Example2026-09-10T09:00:00Z
DELETE /api/v1/tracked-apps/{fellow_app_id}

Stops tracking the app and removes this account's access to its feature data. Stored app history is preserved. Returns 204 even if the app is not tracked.

Authorization Bearer

Path parameters

fellow_app_id string required

fellow_app_id returned by the tracked-app endpoints.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$

Request

curl --request DELETE 'https://app.fellowdev.io/api/v1/tracked-apps/app_30274105' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'

Responses

App no longer tracked. No response body.

No response body.

A feature records an app’s appearance in App Store editorial content. Types are story, room, section, app and event. Each entry in history is one continuous period in a country. A return after a gap is a separate entry.

Feature responses do not include structured tab, placement or recognition metadata, such as carousel positions, App of the Day or Editors’ Choice. Screenshots provide visual evidence of captured appearances. Missing metadata does not establish that an app lacked a placement or recognition.

GET /features includes history periods that match the country and date filters. first_seen and last_seen summarize those periods. GET /features/{fellow_feature_id} returns periods that overlap your available history.

Date filters select overlapping periods. Returned dates are the original dates, even when first_seen is before your available history or the dates extend beyond from and to.

Use fellow_feature_id to get a feature or its screenshots. apple_feature_id is Apple’s editorial or event ID. Story, room and event history entries include an app_store_url for their country when a link can be formed. The field is omitted for app and section features. Events belong to one parent app; their URL is https://apps.apple.com/<country>/app/id<apple_app_id>?eventid=<apple_feature_id>. Event screenshots show the tab card.

GET /api/v1/features

Returns features for active tracked apps. Each feature includes only the history periods that match the request filters, by country.

Authorization Bearer

Query parameters

fellow_app_id string optional

Fellow app ID. Cannot be combined with apple_app_id, even for the same app. Omit both to include all active tracked apps.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$
apple_app_id string optional

Apple App Store app ID. Cannot be combined with fellow_app_id, even for the same app. Omit both to include all active tracked apps.

Example123456789
Pattern^[0-9]+$
countries array<string> optional

Comma-separated country codes. Matches any listed country. Codes are case-insensitive. Duplicates are ignored. Responses use uppercase. Empty or unsupported values return 400.

ExampleUS,GB
Min. items1
Item pattern^(?:[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][rR]|[aA][tT]|[aA][uU]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][jJ]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][dD]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][vV]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][sS]|[fF][iI]|[fF][jJ]|[fF][mM]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][hH]|[gG][mM]|[gG][rR]|[gG][tT]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][nN]|[hH][rR]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][nN]|[iI][qQ]|[iI][sS]|[iI][tT]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][nN]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][kK]|[lL][rR]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][dD]|[mM][eE]|[mM][gG]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][eE]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][eE]|[sS][gG]|[sS][iI]|[sS][kK]|[sS][lL]|[sS][nN]|[sS][rR]|[sS][tT]|[sS][vV]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][hH]|[tT][jJ]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][nN]|[vV][uU]|[xX][kK]|[yY][eE]|[zZ][aA]|[zZ][mM]|[zZ][wW])$
types array<string> optional

Comma-separated feature types. Matches any listed type. Duplicates are ignored. Empty or unsupported values return 400.

Values
storyroomsectionappevent
Examplestory,room
Min. items1
from string (date) optional

Inclusive start date in UTC. Defaults to the start of your plan's available history. Matches appearances with last_seen on or after this date. Must be on or before to. Dates outside your available history are rejected.

Example2026-09-10
to string (date) optional

Inclusive end date in UTC. Defaults to today in UTC. Matches appearances with first_seen on or before this date. Returned appearances keep their full dates, even when they extend beyond the requested range.

Example2026-09-16
sort string optional

Sorts by dates from matching appearances. Prefix with - for descending order. Ties have a stable order.

Values
first_seen-first_seenlast_seen-last_seen
Default-last_seen
Example-last_seen
limit integer optional

Number of items per page. Defaults to 50. Maximum 100.

Default50
Example50
Minimum1
Maximum100
cursor string optional

Use pagination.next_cursor from the previous response. Keep filters, sort order and limit unchanged. Cursors are tied to your account. Invalid, expired or mismatched cursors return 400.

Exampleopaque_example_cursor
Min. length1

Request

curl 'https://app.fellowdev.io/api/v1/features?fellow_app_id=app_30274105' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'

Responses

A page of features and their matching appearance history.

application/json

{
  "data": [
    {
      "fellow_feature_id": "feat_20860906",
      "fellow_app_id": "app_30274105",
      "apple_app_id": "123456789",
      "apple_feature_id": "987654321",
      "type": "story",
      "title": "Make time to move",
      "first_seen": "2026-09-10",
      "last_seen": "2026-09-16",
      "history": [
        {
          "country": "US",
          "first_seen": "2026-09-10",
          "last_seen": "2026-09-16",
          "app_store_url": "https://apps.apple.com/us/iphone/story/id987654321"
        }
      ]
    }
  ],
  "pagination": {
    "next_cursor": null,
    "has_more": false
  }
}
Response fields
data array<object> required
Child fields 9
fellow_feature_id string required

Fellow feature ID used in /features/{fellow_feature_id}.

Examplefeat_20860906
Pattern^feat_[0-9]{8,}$
fellow_app_id string required

Fellow ID of the app associated with this feature.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$
apple_app_id string required

Apple App Store ID of the app associated with this feature.

Example123456789
Pattern^[0-9]+$
apple_feature_id string required

Apple editorial ID. May be shared by several apps or Fellow records. Use fellow_feature_id for detail requests.

Example987654321
Min. length1
type string required

App Store feature type.

Values
storyroomsectionappevent
Examplestory
title string | null required

Feature title, or null when unavailable.

ExampleMake time to move
first_seen string (date) required

Earliest first_seen across returned history periods.

Example2026-09-10
last_seen string (date) required

Latest last_seen across returned history periods.

Example2026-09-16
history array<object> required

Periods that overlap available history and match the request, by country. Returns after a gap are listed separately.

Min. items1
Child fields 4
country string required

App Store country where this appearance was observed.

175 allowed values
AEAFAGAIALAMAOARATAUAZBABBBEBFBGBHBJBMBNBOBRBSBTBWBYBZCACDCGCHCICLCMCNCOCRCVCYCZDEDKDMDODZECEEEGESFIFJFMFRGAGBGDGEGHGMGRGTGWGYHKHNHRHUIDIEILINIQISITJMJOJPKEKGKHKNKRKWKYKZLALBLCLKLRLTLULVLYMAMDMEMGMKMLMMMNMOMRMSMTMUMVMWMXMYMZNANENGNINLNONPNRNZOMPAPEPGPHPKPLPTPWPYQARORSRURWSASBSCSESGSISKSLSNSRSTSVSZTCTDTHTJTMTNTOTRTTTWTZUAUGUSUYUZVCVEVGVNVUXKYEZAZMZW
ExampleUS
first_seen string (date) required

First known UTC date in this appearance.

Example2026-09-10
last_seen string (date) required

Last known UTC date in this appearance, inclusive.

Example2026-09-16
app_store_url string (uri) optional

Country-specific Apple page for a story, room, or in-app event. Event URLs use the parent app ID and eventid query parameter. Omitted when no page URL can be formed.

Examplehttps://apps.apple.com/us/iphone/story/id987654321
pagination object required

Continue with next_cursor and unchanged filters, ordering and limit. Stop when has_more is false.

Child fields 2
next_cursor string | null required

Opaque, account-bound continuation cursor. null on the final page.

Examplenull
Min. length1
has_more boolean required

Whether another page is available through next_cursor.

Examplefalse
GET /api/v1/features/{fellow_feature_id}

Returns a feature and its history by country that overlaps your available history. Use its fellow_feature_id to list screenshots.

Authorization Bearer

Path parameters

fellow_feature_id string required

fellow_feature_id returned by GET /features.

Examplefeat_20860906
Pattern^feat_[0-9]{8,}$

Request

curl 'https://app.fellowdev.io/api/v1/features/feat_20860906' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'

Responses

Feature data and appearance history available to your account.

application/json

{
  "data": {
    "fellow_feature_id": "feat_20860906",
    "fellow_app_id": "app_30274105",
    "apple_app_id": "123456789",
    "apple_feature_id": "987654321",
    "type": "story",
    "title": "Make time to move",
    "first_seen": "2026-09-10",
    "last_seen": "2026-09-16",
    "history": [
      {
        "country": "US",
        "first_seen": "2026-09-10",
        "last_seen": "2026-09-16",
        "app_store_url": "https://apps.apple.com/us/iphone/story/id987654321"
      }
    ]
  }
}
Response fields
data object required

A record of an app appearing in App Store editorial content. first_seen, last_seen and sort order derive from the returned history. Use fellow_feature_id to get the feature or list its screenshots.

Child fields 9
fellow_feature_id string required

Fellow feature ID used in /features/{fellow_feature_id}.

Examplefeat_20860906
Pattern^feat_[0-9]{8,}$
fellow_app_id string required

Fellow ID of the app associated with this feature.

Exampleapp_30274105
Pattern^app_[0-9]{8,}$
apple_app_id string required

Apple App Store ID of the app associated with this feature.

Example123456789
Pattern^[0-9]+$
apple_feature_id string required

Apple editorial ID. May be shared by several apps or Fellow records. Use fellow_feature_id for detail requests.

Example987654321
Min. length1
type string required

App Store feature type.

Values
storyroomsectionappevent
Examplestory
title string | null required

Feature title, or null when unavailable.

ExampleMake time to move
first_seen string (date) required

Earliest first_seen across returned history periods.

Example2026-09-10
last_seen string (date) required

Latest last_seen across returned history periods.

Example2026-09-16
history array<object> required

Periods that overlap available history and match the request, by country. Returns after a gap are listed separately.

Min. items1
Child fields 4
country string required

App Store country where this appearance was observed.

175 allowed values
AEAFAGAIALAMAOARATAUAZBABBBEBFBGBHBJBMBNBOBRBSBTBWBYBZCACDCGCHCICLCMCNCOCRCVCYCZDEDKDMDODZECEEEGESFIFJFMFRGAGBGDGEGHGMGRGTGWGYHKHNHRHUIDIEILINIQISITJMJOJPKEKGKHKNKRKWKYKZLALBLCLKLRLTLULVLYMAMDMEMGMKMLMMMNMOMRMSMTMUMVMWMXMYMZNANENGNINLNONPNRNZOMPAPEPGPHPKPLPTPWPYQARORSRURWSASBSCSESGSISKSLSNSRSTSVSZTCTDTHTJTMTNTOTRTTTWTZUAUGUSUYUZVCVEVGVNVUXKYEZAZMZW
ExampleUS
first_seen string (date) required

First known UTC date in this appearance.

Example2026-09-10
last_seen string (date) required

Last known UTC date in this appearance, inclusive.

Example2026-09-16
app_store_url string (uri) optional

Country-specific Apple page for a story, room, or in-app event. Event URLs use the parent app ID and eventid query parameter. Omitted when no page URL can be formed.

Examplehttps://apps.apple.com/us/iphone/story/id987654321

Screenshots show a feature’s placement in the App Store. Filter by country and date. Results are ordered by the most recent matching appearance.

image_url is a temporary HTTPS URL that expires at image_url_expires_at. List the screenshots again to get a new URL.

GET /api/v1/features/{fellow_feature_id}/screenshots

Returns screenshots for this feature, ordered by the most recent matching appearance.

Authorization Bearer

Path parameters

fellow_feature_id string required

fellow_feature_id returned by GET /features.

Examplefeat_20860906
Pattern^feat_[0-9]{8,}$

Query parameters

countries array<string> optional

Comma-separated country codes. Matches any listed country. Codes are case-insensitive. Duplicates are ignored. Responses use uppercase. Empty or unsupported values return 400.

ExampleUS,GB
Min. items1
Item pattern^(?:[aA][eE]|[aA][fF]|[aA][gG]|[aA][iI]|[aA][lL]|[aA][mM]|[aA][oO]|[aA][rR]|[aA][tT]|[aA][uU]|[aA][zZ]|[bB][aA]|[bB][bB]|[bB][eE]|[bB][fF]|[bB][gG]|[bB][hH]|[bB][jJ]|[bB][mM]|[bB][nN]|[bB][oO]|[bB][rR]|[bB][sS]|[bB][tT]|[bB][wW]|[bB][yY]|[bB][zZ]|[cC][aA]|[cC][dD]|[cC][gG]|[cC][hH]|[cC][iI]|[cC][lL]|[cC][mM]|[cC][nN]|[cC][oO]|[cC][rR]|[cC][vV]|[cC][yY]|[cC][zZ]|[dD][eE]|[dD][kK]|[dD][mM]|[dD][oO]|[dD][zZ]|[eE][cC]|[eE][eE]|[eE][gG]|[eE][sS]|[fF][iI]|[fF][jJ]|[fF][mM]|[fF][rR]|[gG][aA]|[gG][bB]|[gG][dD]|[gG][eE]|[gG][hH]|[gG][mM]|[gG][rR]|[gG][tT]|[gG][wW]|[gG][yY]|[hH][kK]|[hH][nN]|[hH][rR]|[hH][uU]|[iI][dD]|[iI][eE]|[iI][lL]|[iI][nN]|[iI][qQ]|[iI][sS]|[iI][tT]|[jJ][mM]|[jJ][oO]|[jJ][pP]|[kK][eE]|[kK][gG]|[kK][hH]|[kK][nN]|[kK][rR]|[kK][wW]|[kK][yY]|[kK][zZ]|[lL][aA]|[lL][bB]|[lL][cC]|[lL][kK]|[lL][rR]|[lL][tT]|[lL][uU]|[lL][vV]|[lL][yY]|[mM][aA]|[mM][dD]|[mM][eE]|[mM][gG]|[mM][kK]|[mM][lL]|[mM][mM]|[mM][nN]|[mM][oO]|[mM][rR]|[mM][sS]|[mM][tT]|[mM][uU]|[mM][vV]|[mM][wW]|[mM][xX]|[mM][yY]|[mM][zZ]|[nN][aA]|[nN][eE]|[nN][gG]|[nN][iI]|[nN][lL]|[nN][oO]|[nN][pP]|[nN][rR]|[nN][zZ]|[oO][mM]|[pP][aA]|[pP][eE]|[pP][gG]|[pP][hH]|[pP][kK]|[pP][lL]|[pP][tT]|[pP][wW]|[pP][yY]|[qQ][aA]|[rR][oO]|[rR][sS]|[rR][uU]|[rR][wW]|[sS][aA]|[sS][bB]|[sS][cC]|[sS][eE]|[sS][gG]|[sS][iI]|[sS][kK]|[sS][lL]|[sS][nN]|[sS][rR]|[sS][tT]|[sS][vV]|[sS][zZ]|[tT][cC]|[tT][dD]|[tT][hH]|[tT][jJ]|[tT][mM]|[tT][nN]|[tT][oO]|[tT][rR]|[tT][tT]|[tT][wW]|[tT][zZ]|[uU][aA]|[uU][gG]|[uU][sS]|[uU][yY]|[uU][zZ]|[vV][cC]|[vV][eE]|[vV][gG]|[vV][nN]|[vV][uU]|[xX][kK]|[yY][eE]|[zZ][aA]|[zZ][mM]|[zZ][wW])$
from string (date) optional

Inclusive start date in UTC. Defaults to the start of your plan's available history. Matches appearances with last_seen on or after this date. Must be on or before to. Dates outside your available history are rejected.

Example2026-09-10
to string (date) optional

Inclusive end date in UTC. Defaults to today in UTC. Matches appearances with first_seen on or before this date. Returned appearances keep their full dates, even when they extend beyond the requested range.

Example2026-09-16
limit integer optional

Number of items per page. Defaults to 50. Maximum 100.

Default50
Example50
Minimum1
Maximum100
cursor string optional

Use pagination.next_cursor from the previous response. Keep filters, sort order and limit unchanged. Cursors are tied to your account. Invalid, expired or mismatched cursors return 400.

Exampleopaque_example_cursor
Min. length1

Request

curl 'https://app.fellowdev.io/api/v1/features/feat_20860906/screenshots?countries=US%2CGB' \
  --header 'Authorization: Bearer YOUR_API_TOKEN'

Responses

A page of matching screenshots, or an empty data array.

application/json

{
  "data": [
    {
      "country": "US",
      "location": "today",
      "history": [
        {
          "country": "US",
          "first_seen": "2026-09-10",
          "last_seen": "2026-09-16",
          "app_store_url": "https://apps.apple.com/us/iphone/story/id987654321"
        }
      ],
      "image_url": "https://app.fellowdev.io/api/screenshots/full/EXAMPLE_TOKEN.EXAMPLE_SIGNATURE",
      "image_url_expires_at": "2026-09-16T12:30:00Z"
    }
  ],
  "pagination": {
    "next_cursor": null,
    "has_more": false
  }
}
Response fields
data array<object> required
Child fields 5
country string required

App Store country associated with this screenshot.

175 allowed values
AEAFAGAIALAMAOARATAUAZBABBBEBFBGBHBJBMBNBOBRBSBTBWBYBZCACDCGCHCICLCMCNCOCRCVCYCZDEDKDMDODZECEEEGESFIFJFMFRGAGBGDGEGHGMGRGTGWGYHKHNHRHUIDIEILINIQISITJMJOJPKEKGKHKNKRKWKYKZLALBLCLKLRLTLULVLYMAMDMEMGMKMLMMMNMOMRMSMTMUMVMWMXMYMZNANENGNINLNONPNRNZOMPAPEPGPHPKPLPTPWPYQARORSRURWSASBSCSESGSISKSLSNSRSTSVSZTCTDTHTJTMTNTOTRTTTWTZUAUGUSUYUZVCVEVGVNVUXKYEZAZMZW
ExampleUS
location string required

App Store location represented by the screenshot.

Values
todayappsgamesarcadestandalone
Exampletoday
history array<object> required

Matching periods of this feature in the screenshot's country that overlap available history. Returns after a gap are listed separately.

Min. items1
Child fields 4
country string required

App Store country where this appearance was observed.

175 allowed values
AEAFAGAIALAMAOARATAUAZBABBBEBFBGBHBJBMBNBOBRBSBTBWBYBZCACDCGCHCICLCMCNCOCRCVCYCZDEDKDMDODZECEEEGESFIFJFMFRGAGBGDGEGHGMGRGTGWGYHKHNHRHUIDIEILINIQISITJMJOJPKEKGKHKNKRKWKYKZLALBLCLKLRLTLULVLYMAMDMEMGMKMLMMMNMOMRMSMTMUMVMWMXMYMZNANENGNINLNONPNRNZOMPAPEPGPHPKPLPTPWPYQARORSRURWSASBSCSESGSISKSLSNSRSTSVSZTCTDTHTJTMTNTOTRTTTWTZUAUGUSUYUZVCVEVGVNVUXKYEZAZMZW
ExampleUS
first_seen string (date) required

First known UTC date in this appearance.

Example2026-09-10
last_seen string (date) required

Last known UTC date in this appearance, inclusive.

Example2026-09-16
app_store_url string (uri) optional

Country-specific Apple page for a story, room, or in-app event. Event URLs use the parent app ID and eventid query parameter. Omitted when no page URL can be formed.

Examplehttps://apps.apple.com/us/iphone/story/id987654321
image_url string (uri) required

Temporary HTTPS image URL. Expires at image_url_expires_at.

Examplehttps://app.fellowdev.io/api/screenshots/full/EXAMPLE_TOKEN.EXAMPLE_SIGNATURE
Pattern^https://
image_url_expires_at string (date-time) required

UTC expiry of image_url.

Example2026-09-16T12:30:00Z
pagination object required

Continue with next_cursor and unchanged filters, ordering and limit. Stop when has_more is false.

Child fields 2
next_cursor string | null required

Opaque, account-bound continuation cursor. null on the final page.

Examplenull
Min. length1
has_more boolean required

Whether another page is available through next_cursor.

Examplefalse