DeviantArt APIdeviantart.com ↗
Fetch DeviantArt user profiles, bios, stats, and gallery artworks by username. 2 endpoints covering watchers, deviations, media URLs, and pagination.
What is the DeviantArt API?
The DeviantArt API provides 2 endpoints for retrieving public user data from deviantart.com. The get_user_profile endpoint returns over 10 fields including bio, tagline, country, gender, account statistics (watchers, deviations, pageviews), and join date. The get_user_artworks endpoint delivers paginated gallery results with deviation IDs, media URLs, and published timestamps — useful for building artist research tools, portfolio trackers, or content aggregators.
curl -X GET 'https://api.parse.bot/scraper/e51e593e-c88b-499f-b17b-b6c797fbe6d5/get_user_profile?username=CrazyLunatic' \ -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 deviantart-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: DeviantArt SDK — browse a user's profile and gallery."""
from parse_apis.deviantart_com_api import DeviantArt, NotFoundError
client = DeviantArt()
# Fetch a user profile by username
user = client.users.get(username="yuumei")
print(f"{user.username} ({user.country}) — {user.tagline}")
print(f" Deviations: {user.stats.deviations}, Watchers: {user.stats.watchers}")
# List the user's interests
for interest in user.interests:
print(f" {interest.label}: {interest.value}")
# Browse the user's gallery, capped at 5 artworks
for artwork in user.artworks.list(limit=5):
print(f" [{artwork.type}] {artwork.title} — {artwork.stats.views} views")
# Drill into the first artwork for detail
first_artwork = user.artworks.list(limit=1).first()
if first_artwork is not None:
print(f"\nFeatured: {first_artwork.title}")
print(f" Published: {first_artwork.published_time}")
print(f" Favourites: {first_artwork.stats.favourites}, Downloads: {first_artwork.stats.downloads}")
print(f" Author: {first_artwork.author.username}")
print(f" URL: {first_artwork.url}")
# Demonstrate typed error handling for a missing user
try:
client.users.get(username="nonexistent_user_xyz_00000")
except NotFoundError as e:
print(f"Expected not-found error: {e}")
print("\nexercised: users.get / artworks.list")
Retrieve a DeviantArt user's public profile information including bio, tagline, country, gender, interests, social links, and account statistics (deviations count, watchers, watching, pageviews, join date). Makes two requests: one warmup navigation and one profile page fetch.
| Param | Type | Description |
|---|---|---|
| usernamerequired | string | DeviantArt username (case-insensitive, e.g. 'yuumei', 'CrazyLunatic'). |
{
"type": "object",
"fields": {
"age": "integer or null",
"bio": "string — HTML-formatted biography text",
"type": "string — account type (e.g. 'regular')",
"stats": "object with deviations, watchers, watching, pageviews, favourites, comments_made, comments_received_profile, join_date",
"gender": "string — user's gender if set",
"country": "string — user's country name",
"dob_day": "integer or null",
"tagline": "string — user's short tagline",
"user_id": "integer — DeviantArt numeric user ID",
"website": "string or null — user's website URL",
"dob_year": "integer or null",
"usericon": "string — URL to user avatar image",
"username": "string — display username",
"dob_month": "integer or null",
"interests": "array of objects with id, label, and value",
"is_artist": "boolean",
"country_code": "string — ISO country code (e.g. 'us')",
"social_links": "array of social link objects",
"website_label": "string or null — display label for website",
"twitter_username": "string or null"
},
"sample": {
"data": {
"age": null,
"bio": "<br><br>Current Residence: southwest florida<br>Favourite genre of music: everything",
"type": "regular",
"stats": {
"watchers": 6,
"watching": 16,
"join_date": "2003-09-20T07:58:23-0700",
"pageviews": 2914,
"deviations": 8,
"favourites": 12,
"comments_made": 214,
"comments_received_profile": 21
},
"gender": "female",
"country": "United States",
"dob_day": null,
"tagline": "J. me",
"user_id": 511553,
"website": null,
"dob_year": null,
"usericon": "https://a.deviantart.net/avatars-big/c/r/crazylunatic.gif",
"username": "CrazyLunatic",
"dob_month": null,
"interests": [
{
"id": 1,
"label": "Favorite visual artist",
"value": "nykolai"
}
],
"is_artist": true,
"country_code": "us",
"social_links": [],
"website_label": null,
"twitter_username": null
},
"status": "success"
}
}About the DeviantArt API
User Profile Data
The get_user_profile endpoint accepts a username string (case-insensitive) and returns a structured profile object. Key fields include bio (HTML-formatted), tagline, country, gender, website, and a numeric user_id. The stats object exposes deviations, watchers, watching, pageviews, favourites, comments_made, comments_received_profile, and join_date — giving a full picture of an artist's community standing without any authentication requirement.
Gallery Artwork Listing
The get_user_artworks endpoint fetches artworks from any public DeviantArt gallery by username. Results are ordered newest-first and are paginated via offset and limit (max 60 per call). Each artwork object in the artworks array includes deviation_id, title, url, type, published_time, media_url, stats, and author details. The has_more boolean and next_offset integer make it straightforward to walk through a user's full gallery programmatically.
Pagination Behavior
When calling get_user_artworks, omitting offset returns the first page. Pass the next_offset value from the previous response as offset in the next call to advance through the gallery. When has_more is false or next_offset is null, the gallery has been fully traversed. The limit parameter accepts 1–60; requesting more than 60 in a single call is not supported.
The DeviantArt API is a managed, monitored endpoint for deviantart.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when deviantart.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 deviantart.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?+
- Track an artist's follower (watcher) and deviation count over time using
statsfromget_user_profile - Build a portfolio aggregator that pulls gallery thumbnails and media URLs via
get_user_artworks - Audit publishing activity by sorting artworks by
published_timeto identify posting frequency - Compile artist contact and social data using
websiteand profile fields for directory listings - Monitor gallery growth by paginating
get_user_artworksand comparingdeviation_idsets across runs - Enrich an artist database with DeviantArt
country,gender, andbiofields alongside other platform profiles - Build a cross-platform art analytics tool that joins DeviantArt
pageviewsandwatcherswith other source metrics
| 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 DeviantArt have an official developer API?+
What does `get_user_profile` return beyond basic bio text?+
bio and tagline, the response includes a stats object with watchers, watching, deviations, pageviews, favourites, comments_made, comments_received_profile, and join_date. It also returns country, gender, website, user_id, age, dob_day, and account type.Are comments, forum posts, or journal entries accessible through this API?+
Does the API return artwork descriptions or tags?+
get_user_artworks endpoint returns title, url, type, published_time, media_url, stats, author, and deviation_id per artwork. Per-deviation descriptions, tags, and comment counts are not included in the current response shape. You can fork it on Parse and revise it to add a per-deviation detail endpoint that surfaces those fields.Is there a limit to how far back the gallery pagination goes?+
next_offset calls is supported as long as has_more remains true. Private or hidden deviations are not accessible.