Every API here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for apis
7 MCP tools reach this
find_apisBrowse and filter every API in the catalog.
get_api_artifactsOne API's artifacts, grouped by type.
get_openapiThe primary OpenAPI for this API.
find_similar_apisAPIs that look like this one.
apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
resolveTurn a domain, URL or GitHub org into the provider it belongs to.
find_cohortsEvery scored population of providers in the catalog.
All 92 tools →
Call it yourself
curl for this page
This API
curl "https://apis.io/api/v1/apis/euler:euler-activity-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Euler Data API (V3) Activity API
version: 3.0.0
description: 'API specification for Euler Data v3. This spec defines the current
resource-oriented contract for the platform, with emphasis on consistent
schemas, predictable REST semantics, caching, observability, and a uniform
developer experience. This public document covers unauthenticated endpoints and integrations that
use API keys, including capability-scoped keys. Browser-session Toolbox
operations, admin-secret operations, and the Prometheus endpoint are served
separately and are intentionally omitted. Migration notes
- Euler Data v3 is not a path-for-path clone of v1/v2. Some endpoints map
directly, some require multiple v3 calls, and some legacy aggregates were
intentionally removed. - The live migration guide explains how legacy v1/v2
endpoints and payloads map into the v3 resource model. - Important semantic changes:
- Vault base APY and rewards APY are exposed separately in v3. - Account positions are flattened into account-vault rows instead of the
legacy nested sub-account shape. - All supported API paths live under `/v3`; legacy paths return `410`. - Summary endpoints prefer smaller, focused resources over large
BFF-style payloads. Base path: /v3
Conventions
- JSON field naming: camelCase
- Addresses: accept lowercase or checksum; responses are EIP-55 checksummed
- Public APY values (`*Apy`, `apy*`): percent numbers with 6 decimal places (e.g., 5.123456 = 5.123456%)
- Contract interest-rate fields (`borrowAPY`, `supplyAPY` in `interestRates`): decimal strings in contract fraction units
- Ratios (utilization, LTV, etc.): numbers with 6 decimal places
- Response timestamps: ISO-8601 strings (UTC). Some legacy fields still expose unix
seconds for compatibility and include `*Iso` companions. - Query time ranges: unix seconds (from/to)
Unit policy
- v3 separates market metadata from contract verdicts by both name and type. - Market-normalized USD prices and USD values are JSON numbers. These are values
derived from off-chain pricing, cached price snapshots, or API-level market math. This includes `/v3/prices`, token price routes, vault/earn/protocol USD totals,
portfolio market values, portfolio USD liquidation/risk fields such as
`liabilityValueUsd`, `totalCollateralValueUsd`, `borrowLiquidationPriceUsd`,
and `collateralLiquidationPricesUsd`, and vault holder `assetsUsd`. - Contract-derived oracle and raw account-liquidity verdict values are exact strings. These preserve the integer value used by contracts, normalized to 18 decimals
for API exposure. Oracle prices are quoted in the vault unit of account, which
can be USD, ETH, or another asset. This includes `/v3/oracles/prices`, raw
account-liquidity `liabilityValue` and `totalCollateralValue` objects,
`liabilityValueBorrowing`, `liabilityValueLiquidation`, and collateral verdict
values. - On-chain token quantities are bigint strings in their native unit scale. This
includes amounts, balances, shares, assets, borrows, reward amounts, liquidation
repay/yield amounts, and block numbers. - Caps are also bigint strings, but EVK caps are exposed as resolved underlying
asset-unit amounts rather than packed contract config words; an unlimited EVK cap is
type(uint256).max and `0` is a zero cap. The exceptions are
cap-history and config-history, which carry the raw uint16 encodings. - LTV config values use canonical basis-point strings. Legacy decimal aliases
may remain on config-history payloads for compatibility when explicitly named. Rate limiting
- Optional API keys for higher limits
- Standard limits are 1000 req/min for unauthenticated callers (IP-based)
and 10000 req/min for authenticated callers (per API key), with a 60s window. Individual API keys can carry a custom limit. - By default, proxy headers are not trusted for IP identity unless explicitly enabled. - Redis failures default to fail-closed (503) for strict enforcement; fail-open is opt-in. - RateLimit-* (IETF draft-6) and legacy X-RateLimit-* headers are returned.'
servers:
- url: /
description: Current environment
security: []
tags:
- name: Activity
description: Normalized vault and owner event timelines with explicit per-chain source coverage and cursor pagination.
paths:
/v3/activity/vaults/{chainId}/{vault}/events:
get:
tags:
- Activity
summary: Normalized vault activity events
description: 'Returns a deterministic event timeline for one EVK, Euler Earn, or Securitize vault.
`eventType` filters the normalized `type`; `rawType` preserves the indexed source name.
Coverage reflects the categories applicable to the requested vault type. Unsupported or
incomplete indexed sources are reported in `meta.coverage`. Any positive safe-integer chain
ID is accepted; chains without V3 Activity indexing return HTTP 200 with an empty timeline and
`meta.coverage.status: unsupported`. Structurally unavailable sources report unsupported
coverage; transient projection failures retain indexed events and report partial coverage.
EVK governance activity includes events from an EulerRouter used as the vault''s immutable
oracle only when that router is recorded as deployed by EulerRouterFactory. Routers outside
that factory registry are not decoded or projected.
Governance actor and before/after enrichment, underlying-asset metadata and valuation, and
swap asset/vault mapping can be unavailable. Missing normalized values stay
absent, source fields remain in `payload`, and coverage continues to describe indexed event-family
availability. Missing valuation is explicit and never synthesized as zero.
A served chain without the `activity` chain capability answers 404
`CHAIN_CAPABILITY_DISABLED`.'
x-status: implemented
x-chain-capability: activity
x-cache-ttl: 30
parameters:
- name: chainId
in: path
required: true
schema:
type: integer
minimum: 1
maximum: 9007199254740991
description: A positive safe-integer chain ID. V3 indexing support is reported at runtime in `meta.coverage`.
- name: vault
in: path
required: true
schema:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
- name: vaultType
in: query
required: true
schema:
type: string
enum:
- evk
- earn
- securitize
- name: category
in: query
required: false
description: Comma-separated normalized category filter. Empty or unknown values return 400.
schema:
type: string
maxLength: 1024
- name: eventType
in: query
required: false
description: Comma-separated normalized event type filter. Empty or unknown values return 400.
schema:
type: string
maxLength: 1024
- name: cursor
in: query
required: false
description: Opaque keyset cursor bound to the complete query shape.
schema:
type: string
maxLength: 2048
- name: from
in: query
required: false
schema:
type: integer
minimum: 0
maximum: 9007199254740991
description: Inclusive unix timestamp in seconds.
- name: to
in: query
required: false
schema:
type: integer
minimum: 0
maximum: 9007199254740991
description: Inclusive unix timestamp in seconds.
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
responses:
'200':
description: Normalized vault activity timeline and indexed-source coverage.
headers:
Cache-Control:
$ref: '#/components/headers/Cache-Control'
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ActivityResponse'
'400':
$ref: '#/components/responses/Error400'
'404':
$ref: '#/components/responses/Error404ChainCapability'
'429':
$ref: '#/components/responses/Error429'
'500':
$ref: '#/components/responses/Error500'
'503':
$ref: '#/components/responses/Error503'
operationId: getActivityVaultEvents
/v3/activity/accounts/{owner}/events:
get:
tags:
- Activity
summary: Normalized owner activity events
description: 'Returns one deterministic timeline across the requested chains and the owner''s complete
256-address EVC account family, spanning the owner at ID 0 through subaccount ID 255.
Account identities are excluded from request logs and persisted endpoint telemetry.
Coverage is aggregated across chains and reports incomplete
reward claims or unclassified multiply intent as partial. Unsupported sources and indexer
synchronization state are explicit in `meta.coverage`. Any positive safe-integer chain ID is
accepted; chains without V3 Activity indexing return HTTP 200 with an empty timeline and
per-chain `unsupported` coverage. Governance actor and before/after enrichment,
underlying-asset metadata and valuation, and swap asset/vault mapping can be unavailable.
Missing normalized values stay absent, source fields remain in `payload`, and coverage continues
to describe indexed event-family availability. Transient projection failures retain indexed events
and report partial coverage rather than authoritative unsupported or complete coverage.
A served chain without the `activity` chain capability answers 404
`CHAIN_CAPABILITY_DISABLED`.'
x-status: implemented
x-chain-capability: activity
parameters:
- name: owner
in: path
required: true
schema:
type: string
maxLength: 42
pattern: ^0x[0-9a-fA-F]{40}$
- name: chainId
in: query
required: true
description: Comma-separated positive safe-integer chain IDs. Values are deduplicated and sorted; maximum 20. V3 indexing support is reported per chain at runtime in `meta.coverage`.
schema:
type: string
maxLength: 256
- name: category
in: query
required: false
description: Comma-separated normalized category filter. Empty or unknown values return 400.
schema:
type: string
maxLength: 1024
- name: eventType
in: query
required: false
description: Comma-separated normalized event type filter. Empty or unknown values return 400.
schema:
type: string
maxLength: 1024
- name: cursor
in: query
required: false
description: Opaque keyset cursor bound to the complete query shape.
schema:
type: string
maxLength: 2048
- name: from
in: query
required: false
schema:
type: integer
minimum: 0
maximum: 9007199254740991
description: Inclusive unix timestamp in seconds.
- name: to
in: query
required: false
schema:
type: integer
minimum: 0
maximum: 9007199254740991
description: Inclusive unix timestamp in seconds.
- name: limit
in: query
required: false
schema:
type: integer
minimum: 1
maximum: 100
default: 20
responses:
'200':
description: Normalized owner activity timeline and per-chain indexed-source coverage.
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ActivityResponse'
'400':
$ref: '#/components/responses/Error400'
'404':
$ref: '#/components/responses/Error404ChainCapability'
'429':
$ref: '#/components/responses/Error429'
'500':
$ref: '#/components/responses/Error500'
'503':
$ref: '#/components/responses/Error503'
operationId: getActivityAccountEvents
components:
headers:
X-Request-Id:
description: Request identifier for tracing.
schema:
type: string
Cache-Control:
description: Cache policy for this response.
schema:
type: string
schemas:
ActivityChange:
type: object
additionalProperties: false
required:
- fields
properties:
fields:
type: object
additionalProperties: true
description: Source-specific changed fields retained under normalized event identity.
ActivityAsset:
type: object
additionalProperties: false
required:
- kind
- amountRaw
properties:
kind:
type: string
enum:
- assets
- shares
- value
- collateral
- yield
amountRaw:
type: string
pattern: ^\d+$
description: Native-unit on-chain amount without decimal normalization.
address:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
description: Token or vault address that gives the amount context when indexed.
symbol:
type: string
decimals:
type: integer
minimum: 0
maximum: 255
amount:
type: string
description: Optional decimal-normalized enrichment.
amountUsd:
type: string
description: Optional event-time USD enrichment. Absence never means zero.
ErrorResponse:
type: object
required:
- error
properties:
error:
type: object
required:
- code
- message
- requestId
properties:
code:
type: string
description: 'Domain error code. Examples:
- BAD_REQUEST
- INVALID_ADDRESS
- INVALID_CHAIN_ID
- CHAIN_NOT_SUPPORTED
- CHAIN_CAPABILITY_DISABLED
- NOT_FOUND
- VAULT_NOT_FOUND
- TOKEN_NOT_FOUND
- ACCOUNT_NOT_FOUND
- VALIDATION_ERROR
- CONFLICT
- PRECONDITION_FAILED
- PAYLOAD_TOO_LARGE
- RATE_LIMIT_EXCEEDED
- UNSUPPORTED_MEDIA_TYPE
- UPSTREAM_TIMEOUT
- UNAUTHORIZED
- FORBIDDEN
- SERVICE_UNAVAILABLE
- SERVICE_DISABLED
- INTERNAL_ERROR
'
message:
type: string
requestId:
type: string
details:
type: object
additionalProperties: true
description: Context of the error. Where present, `details.reason` is a stable kebab-case value to key on, and `details.cause` narrows a reason that has several causes. The labels routes list theirs in the Labels tag.
ActivityChainCoverage:
type: object
additionalProperties: false
required:
- chainId
- status
- missingCategories
properties:
chainId:
type: integer
minimum: 1
status:
type: string
enum:
- complete
- partial
- unsupported
- syncing
indexedFromBlock:
type: string
pattern: ^\d+$
indexedToBlock:
type: string
pattern: ^\d+$
missingCategories:
type: array
uniqueItems: true
items:
$ref: '#/components/schemas/ActivityCategory'
reason:
type: string
ActivityResponse:
type: object
additionalProperties: false
required:
- data
- meta
properties:
data:
type: array
items:
$ref: '#/components/schemas/ActivityEvent'
meta:
type: object
additionalProperties: false
required:
- hasMore
- nextCursor
- source
- coverage
- timestamp
properties:
hasMore:
type: boolean
nextCursor:
type: string
nullable: true
source:
type: string
enum:
- v3-ponder
coverage:
$ref: '#/components/schemas/ActivityCoverage'
timestamp:
type: string
format: date-time
ActivityValuation:
type: object
additionalProperties: false
required:
- status
properties:
status:
type: string
enum:
- available
- unavailable
- partial
amountUsd:
type: string
priceTimestamp:
type: string
format: date-time
source:
type: string
reason:
type: string
ActivityEventType:
type: string
description: Normalized event type. Filters apply to this value, not the source table name.
enum:
- deposit
- withdraw
- mint
- burn
- transfer
- borrow
- repay
- swap
- interest_accrued
- debt_socialized
- pull_debt
- liquidation
- approval
- balance_forwarder_status
- convert_fees
- set_caps
- set_ltv
- set_governor_admin
- set_config_flags
- set_fee_receiver
- set_hook_config
- set_interest_fee
- set_interest_rate_model
- set_liquidation_cool_off_time
- set_max_liquidation_discount
- set_oracle_config
- set_fallback_oracle
- set_resolved_vault
- set_oracle_governor
- accrue_interest
- update_last_total_assets
- update_lost_assets
- reallocate_supply
- reallocate_withdraw
- set_name
- set_symbol
- set_fee
- set_fee_recipient
- set_curator
- set_guardian
- set_timelock
- set_cap
- set_is_allocator
- set_supply_queue
- set_withdraw_queue
- submit_cap
- submit_guardian
- submit_timelock
- submit_market_removal
- revoke_pending_cap
- revoke_pending_guardian
- revoke_pending_timelock
- revoke_pending_market_removal
- ownership_transfer_started
- ownership_transferred
- frozen
- unfrozen
- paused
- unpaused
- seized
- set_controller_perspective
- set_supply_cap
- owner_registered
- collateral_status
- operator_status
- controller_status
- lockdown_mode_status
- nonce_status
- nonce_used
- permit_disabled_mode_status
- reward_lock_created
- reward_lock_removed
- reward_transfer
- reward_whitelist_status
- public_reallocate_to
- public_withdrawal
- set_admin
- set_allocation_fee
- set_flow_caps
- transfer_allocation_fee
- buy
- terms_of_use_signed
ActivityCategory:
type: string
enum:
- lending
- borrowing
- swaps
- liquidations
- account
- rewards
- governance
ActivityCoverage:
type: object
additionalProperties: false
required:
- status
- chains
- missingCategories
properties:
status:
type: string
enum:
- complete
- partial
- unsupported
- syncing
chains:
type: array
items:
$ref: '#/components/schemas/ActivityChainCoverage'
missingCategories:
type: array
uniqueItems: true
items:
$ref: '#/components/schemas/ActivityCategory'
reason:
type: string
ActivityEvent:
type: object
additionalProperties: false
required:
- id
- chainId
- timestamp
- blockNumber
- logIndex
- txHash
- type
- category
- source
properties:
id:
type: string
chainId:
type: integer
minimum: 1
timestamp:
type: string
format: date-time
blockNumber:
type: string
pattern: ^\d+$
logIndex:
type: integer
minimum: 0
txHash:
type: string
pattern: ^0x[0-9a-fA-F]{64}$
type:
$ref: '#/components/schemas/ActivityEventType'
category:
$ref: '#/components/schemas/ActivityCategory'
source:
type: string
enum:
- v3-ponder
rawType:
type: string
owner:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
account:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
subAccountIndex:
type: integer
minimum: 0
maximum: 255
vault:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
vaultType:
type: string
enum:
- evk
- earn
- securitize
actor:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
counterparty:
type: string
pattern: ^0x[0-9a-fA-F]{40}$
assets:
type: array
items:
$ref: '#/components/schemas/ActivityAsset'
change:
$ref: '#/components/schemas/ActivityChange'
valuation:
$ref: '#/components/schemas/ActivityValuation'
groupId:
type: string
payload:
type: object
additionalProperties: true
description: Source-specific fallback fields. Normalized properties remain authoritative.
responses:
Error500:
description: Internal server error
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Error400:
description: Bad request
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Error503:
description: Service unavailable
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Error429:
description: Rate limited
headers:
Retry-After:
description: Seconds until next request is allowed.
schema:
type: integer
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
Error404ChainCapability:
description: 'Not found, or `CHAIN_CAPABILITY_DISABLED`: a requested chain does not run the capability the operation needs (see `capabilities` on `/v3/chains`), named in `x-chain-capability` or, where it depends on the request, in the parameter. `details.chainIds` lists those chains and `details.capability` names the capability.'
headers:
X-Request-Id:
$ref: '#/components/headers/X-Request-Id'
content:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
example:
error:
code: CHAIN_CAPABILITY_DISABLED
message: Chain(s) 137 do not run prices
requestId: req_example
details:
chainIds:
- 137
capability: prices
securitySchemes:
ApiKeyAuth:
type: apiKey
in: header
name: X-API-Key
description: API key authentication (optional; higher rate limits).
BearerAuth:
type: http
scheme: bearer
bearerFormat: API key
description: 'Alternative to X-API-Key using Authorization: Bearer <key>'