valorant-api APIvalorant-api.com ↗
Access VALORANT skin bundle data via API. Retrieve names, icons, promo images, and descriptions for every bundle by UUID or as a paginated list.
What is the valorant-api API?
This API exposes VALORANT skin bundle catalogue data from valorant-api.com across 2 endpoints, returning up to 13 fields per bundle record including display names, icons, and promotional text. Use list_bundles to page through the full catalogue or get_bundle to fetch a single bundle by UUID. All text fields support localized output via a language parameter, with en-US and ja-JP verified.
curl -X GET 'https://api.parse.bot/scraper/44000689-284a-4b7f-9abe-fa4f2de14cf9/list_bundles?language=en-US' \ -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 valorant-api-com-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: Valorant skin bundles — browse the catalogue and drill into one bundle."""
from parse_apis.valorant_api_com_api import ValorantApi, BundleNotFound
client = ValorantApi()
# Page through the first few bundles in the catalogue.
for bundle in client.bundles.list(limit=5):
print(bundle.display_name, bundle.uuid)
# Drill into the first bundle's full detail via .first() + .refresh().
summary = client.bundles.list(limit=1).first()
if summary is not None:
detail = summary.refresh()
print(detail.display_name, detail.description)
print("icon:", detail.display_icon)
print("promo:", detail.vertical_promo_image)
# Point-lookup by uuid discovered from the listing above.
if summary is not None:
try:
found = client.bundles.get(uuid=summary.uuid)
print(found.display_name, "—", found.asset_path)
except BundleNotFound:
print("bundle no longer available")
print("exercised: bundles.list / bundles.get / bundle.refresh")
Returns skin bundles in the site's catalogue order, one record per bundle, with uuid, displayName, displayIcon, displayIcon2, verticalPromoImage and the other bundle asset fields. The whole catalogue (a few hundred bundles) is fetched in one round trip and sliced locally with offset and limit; total is the full catalogue size and has_more tells whether offset+limit is still below it. Omitting offset starts at 0 and omitting limit returns 100 bundles; limit is clamped to 500. Text fields (displayName, description) are returned in the requested language when the bundle has a translation; image fields may be null for bundles that lack that asset.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of bundles to return (1-500). |
| offset | integer | Zero-based index of the first bundle to return within the full catalogue. |
| language | string | Locale code for localized text, in the site's <lang>-<REGION> form (en-US and ja-JP verified). Omitted = the site's default (English). |
{
"type": "object",
"fields": {
"limit": "integer, limit applied to this page",
"total": "integer, number of bundles in the full catalogue",
"offset": "integer, offset applied to this page",
"bundles": "array of bundle records, each with uuid, displayName, displayNameSubText, description, extraDescription, promoDescription, useAdditionalContext (boolean), displayIcon, displayIcon2, displayIcon3, logoIcon, verticalPromoImage (image URLs or null), assetPath",
"has_more": "boolean, true when bundles remain after this page"
},
"sample": {
"data": {
"limit": 1,
"total": 324,
"offset": 2,
"bundles": [
{
"uuid": "a4937ee9-4148-8ff2-2c11-c28891880306",
"logoIcon": null,
"assetPath": "ShooterGame/Content/UI/OutOfGame/MainMenu/Store/Bundles/StorefrontItem_AirplaneThemeBundle_DataAsset",
"description": "Altitude",
"displayIcon": "https://media.valorant-api.com/bundles/a4937ee9-4148-8ff2-2c11-c28891880306/displayicon.png",
"displayName": "Altitude",
"displayIcon2": "https://media.valorant-api.com/bundles/a4937ee9-4148-8ff2-2c11-c28891880306/displayicon2.png",
"displayIcon3": null,
"extraDescription": null,
"promoDescription": null,
"displayNameSubText": null,
"verticalPromoImage": "https://media.valorant-api.com/bundles/a4937ee9-4148-8ff2-2c11-c28891880306/verticalpromoimage.png",
"useAdditionalContext": false
}
],
"has_more": true
},
"status": "success"
}
}About the valorant-api API
Endpoints and Response Shape
The list_bundles endpoint returns the full VALORANT skin bundle catalogue in a single round trip, then slices it using limit and offset parameters. Each record in the bundles array includes uuid, displayName, displayNameSubText, description, extraDescription, promoDescription, displayIcon, displayIcon2, verticalPromoImage, logoIcon, assetPath, and related asset fields. The response also surfaces total, offset, limit, and has_more so you can implement standard pagination.
Single-Bundle Lookup
The get_bundle endpoint accepts a uuid — exactly as emitted by list_bundles — and returns one complete bundle record. Unique fields returned here include displayIcon3 (tertiary image URL) and logoIcon (bundle logo URL or null), in addition to all the fields available in the list endpoint. Both endpoints accept the same language locale codes, allowing you to serve localized text for markets beyond en-US.
Language and Coverage Notes
Passing a language value in <lang>-<REGION> form (for example en-US or ja-JP) localizes displayName, description, extraDescription, and promoDescription fields when translations exist in the source catalogue. If a translation is absent for a given locale, the field falls back to the default. The catalogue covers cosmetic bundle data only — individual weapon skin tiers, player cards, and gun buddy items within a bundle are not part of the response schema.
The valorant-api API is a managed, monitored endpoint for valorant-api.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when valorant-api.com 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 valorant-api.com 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?+
- Display a browsable skin bundle gallery using displayName, displayIcon, and verticalPromoImage fields.
- Build a VALORANT bundle tracker that monitors catalogue additions by diffing total count across requests.
- Localize a bundle showcase for Japanese players using the ja-JP language parameter on list_bundles.
- Look up a specific bundle's promotional copy (promoDescription, extraDescription) by UUID for a wiki or fan site.
- Populate a mobile app's cosmetics section with paginated bundle data using limit and offset.
- Resolve bundle asset paths (assetPath) for use in custom game overlay or companion app integrations.
- Generate bundle image thumbnails using the displayIcon2 and displayIcon3 URLs from get_bundle.
| 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.