Skip to Content

Profiles

Aggregated profile data for any Ethereum address or ENS name.

Base path: /api/v1/profiles


GET /api/v1/profiles/:addressOrName

Returns a comprehensive profile for the given address or ENS name, including ENS records, owned names with listing status, activity stats, persona classification, and various timestamps.

If the input is an ENS name not found in the database, the API attempts to fetch it from The Graph subgraph. For wrapped ENS names, the API resolves the actual owner through the Name Wrapper contract.

Profile views are tracked asynchronously after the response is sent.

Authentication: Optional (enhances response with user-specific context)

Cache: None

Path Parameters

ParameterTypeRequiredDescription
addressOrNamestringYesEthereum address (0x...) or ENS name (e.g. vitalik.eth)

Sample Request

curl https://api.grails.app/api/v1/profiles/vitalik.eth
curl https://api.grails.app/api/v1/profiles/0x1234567890abcdef1234567890abcdef12345678

Response

// 200 OK { "success": true, "data": { "address": "0x1234567890abcdef1234567890abcdef12345678", "primaryName": "example.eth", "ensRecords": { "avatar": "https://...", "name": "Example User", "description": "ENS enthusiast", "email": "user@example.com", "url": "https://example.com", "location": "Ethereum", "twitter": "example", "github": "example", "header": "https://...", "address": "0x1234...", "records": { /* full ENS text records */ } }, "persona": { "slug": "collector", "name": "Collector", "icon": "🏆" }, "lastSeenAt": "2026-04-07T10:00:00.000Z", "lastSeenOnchain": "2026-04-06T18:30:00.000Z", "lastRenewedAt": "2026-03-15T12:00:00.000Z", "lastTransferInAt": "2026-02-20T09:00:00.000Z", "lastTransferOutAt": null, "ownedNames": [ { "id": 1, "token_id": "12345678901234567890", "name": "example.eth", "expiry_date": "2027-01-15T00:00:00.000Z", "registration_date": "2023-01-15T00:00:00.000Z", "created_at": "2025-06-01T00:00:00.000Z", "is_listed": true, "active_listing": { "id": 42, "price_wei": "100000000000000000", "currency_address": "0x0000000000000000000000000000000000000000", "source": "grails", "created_at": "2026-04-01T00:00:00.000Z" } } ], "stats": { "totalNames": 15, "listedNames": 3, "totalActivity": 128, "viewCount": 42 } }, "meta": { "timestamp": "2026-04-07T12:00:00.000Z", "version": "1.0.0" } }

Response Fields

FieldTypeDescription
addressstringResolved Ethereum address (lowercase)
primaryNamestring | nullPrimary ENS name for this address (from EFP API)
ensRecordsobject | nullENS text records (avatar, name, description, socials, etc.)
personaobject | nullUser’s persona classification (slug, name, icon)
lastSeenAtstring | nullLast time user was active on the platform
lastSeenOnchainstring | nullLast on-chain transaction (cached, refreshed every 6 hours)
lastRenewedAtstring | nullLast ENS renewal transaction
lastTransferInAtstring | nullLast inbound ENS transfer
lastTransferOutAtstring | nullLast outbound ENS transfer
ownedNamesarrayENS names owned, with listing status and active listing details
statsobjectAggregated counts: total names, listed names, activity count, profile views

Error Responses

StatusCodeDescription
404PROFILE_NOT_FOUNDNo profile found for the given address or ENS name
404INVALID_ADDRESSENS name exists but has no valid owner (stuck in Name Wrapper)
500INTERNAL_ERRORFailed to fetch profile
Last updated on