Nhảy đến nội dung chính

NEAR Enhanced API

warning

Please be advised that these tools and services will be discontinued soon.

Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

Try out our newly released Enhanced APIs - Balances (in Beta) and get what you need for all kinds of balances and token information at ease. Call Enhanced APIs using the endpoint in the API URL box, varies by Network.

Grab your API keys and give it a try! We will be adding more advanced Enhanced APIs in our offering, so stay tuned. Get the data you need without extra processing, NEAR Blockchain data query has never been easier!

We would love to hear from you on the data APIs you need, please leave feedback using the widget in the lower-right corner.

Base URLs:

Authentication

  • API Key (apiKey)
    • Parameter Name: x-api-key, in: header. Use Pagoda DevConsole API key here

Non Fungible Tokens

Get NFT

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/NFT/{contract_account_id}/{token_id} \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /NFT/{contract_account_id}/{token_id}

Get NFT

This endpoint returns detailed information on the NFT for the given token_id, NFT contract_id, timestamp/block_height.

Parameters

NameInTypeRequiredDescription
contract_account_idpathstringtruenone
token_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"contract_metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
},
"nft": {
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
}

Responses

StatusMeaningDescriptionSchema
200OKOKNftResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get NFT history

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/NFT/{contract_account_id}/{token_id}/history \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /NFT/{contract_account_id}/{token_id}/history

Get NFT history

This endpoint returns the transaction history for the given NFT and timestamp/block_height. Note: The result is centered around the history of the specific NFT and will return list of its passing owners and metadata.

Limitations

  • For now, we only support NFT contracts that implement the Events NEP standard.
  • We currently provide the most recent 100 items. Full-featured pagination will be provided in later phases.

Parameters

NameInTypeRequiredDescription
contract_account_idpathstringtruenone
token_idpathstringtruenone
limitqueryinteger(int32)falsenone

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"history": [
{
"block_height": "string",
"block_timestamp_nanos": "string",
"cause": "string",
"new_account_id": "string",
"old_account_id": "string",
"status": "string"
}
],
"nft": {
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
}

Responses

StatusMeaningDescriptionSchema
200OKOKHistoryResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get user's NFT collection overview

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/accounts/{account_id}/NFT \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /accounts/{account_id}/NFT

Get user's NFT collection overview

For the given account_id and timestamp or block_height, this endpoint returns the number of NFTs grouped by contract_id, together with the corresponding NFT contract metadata. The NFT contract will be present in the response if the account_id has at least one NFT there.

Note: block_timestamp_nanos helps you choose a moment in time, fixing the blockchain state at that time.

Limitations

  • We currently provide the most recent 100 items. Full-featured pagination will be provided in later phases.

Parameters

NameInTypeRequiredDescription
account_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone
limitqueryinteger(int32)falseMaximum available limit 100

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"nft_counts": [
{
"contract_account_id": "string",
"contract_metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
},
"last_updated_at_timestamp_nanos": "string",
"nft_count": 0
}
]
}

Responses

StatusMeaningDescriptionSchema
200OKOKNftCountsResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get user's NFT collection by contract

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/accounts/{account_id}/NFT/{contract_account_id} \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /accounts/{account_id}/NFT/{contract_account_id}

Get user's NFT collection by contract

This endpoint returns the list of NFTs with full details for the given account_id, NFT contract_id, timestamp/block_height. You can use the token_id from this response and then request the NFT history for that token.

Limitations

  • We currently provide the most recent 100 items. Full-featured pagination will be provided in later phases.

Parameters

NameInTypeRequiredDescription
account_idpathstringtruenone
contract_account_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone
limitqueryinteger(int32)falseMaximum available limit 100

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"contract_metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
},
"nfts": [
{
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
]
}

Responses

StatusMeaningDescriptionSchema
200OKOKNftsResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get NFT contract metadata

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/nep171/metadata/{contract_account_id} \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /nep171/metadata/{contract_account_id}

Get NFT contract metadata

This endpoint returns the metadata for a given NFT contract and timestamp/block_height. Note: This is contract-wide metadata. Each NFT also has its own metadata.

Parameters

NameInTypeRequiredDescription
contract_account_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
}
}

Responses

StatusMeaningDescriptionSchema
200OKOKMetadataResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

NEAR

Get user's NEAR balance

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/accounts/{account_id}/coins/NEAR \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /accounts/{account_id}/coins/NEAR

Get user's NEAR balance

This endpoint returns the NEAR balance of the given account_id at the given timestamp/block_height.

Parameters

NameInTypeRequiredDescription
account_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone

Example responses

200 Response

{
"balance": "string",
"block_height": "string",
"block_timestamp_nanos": "string",
"metadata": {
"decimals": 0,
"icon": "string",
"name": "string",
"symbol": "string"
}
}

Responses

StatusMeaningDescriptionSchema
200OKOKNearBalanceResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get user's NEAR history

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/accounts/{account_id}/coins/NEAR/history \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /accounts/{account_id}/coins/NEAR/history

Get user's NEAR history

This endpoint returns the history of operations with NEAR coins for the given account_id, timestamp/block_height.

Limitations

  • We currently provide the most recent 100 items. Full-featured pagination will be provided in an upcoming update.

Parameters

NameInTypeRequiredDescription
account_idpathstringtruenone
limitqueryinteger(int32)falsenone

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"history": [
{
"block_height": "string",
"block_timestamp_nanos": "string",
"cause": "string",
"new_account_id": "string",
"old_account_id": "string",
"status": "string"
}
],
"nft": {
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
}

Responses

StatusMeaningDescriptionSchema
200OKOKHistoryResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Fungible Tokens

Get user's coin balances

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/accounts/{account_id}/coins \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /accounts/{account_id}/coins

Get user's coin balances

This endpoint returns all the countable coin balances (including NEAR, fungible tokens, and multi-tokens) of the given account_id, at the given timestamp/block_height.

Limitations

  • For now, we only support the balance for NEAR and FT contracts that implement the Events NEP standard. We are working on a solution to support other FT contracts, including wrap.near and bridged tokens.
  • We are in the process of supporting Multi Token balances.
  • We currently provide the most recent 100 items. Full-featured pagination will be provided in an upcoming update.

Parameters

NameInTypeRequiredDescription
account_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone
limitqueryinteger(int32)falseMaximum available limit 100

Example responses

200 Response

{
"balances": [
{
"balance": "string",
"contract_account_id": "string",
"metadata": {
"decimals": 0,
"icon": "string",
"name": "string",
"symbol": "string"
},
"standard": "string"
}
],
"block_height": "string",
"block_timestamp_nanos": "string"
}

Responses

StatusMeaningDescriptionSchema
200OKOKCoinBalancesResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get user's coin balances by contract

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/accounts/{account_id}/coins/{contract_account_id} \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /accounts/{account_id}/coins/{contract_account_id}

Get user's coin balances by contract

This endpoint returns all the countable coin balances of the given account_id, for the given contract and timestamp/block_height. For FT contracts, the response has only 1 item in the list. For MT contracts, there could be several balances (MT support is still under development).

Limitations

  • For now, we support only the balance for FT contracts that implement the Events NEP standard. We are working on a solution to support other FT contracts, including wrap.near and bridged tokens.
  • We are in the process of supporting Multi Token balances.

Parameters

NameInTypeRequiredDescription
account_idpathstringtruenone
contract_account_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone

Example responses

200 Response

{
"balances": [
{
"balance": "string",
"contract_account_id": "string",
"metadata": {
"decimals": 0,
"icon": "string",
"name": "string",
"symbol": "string"
},
"standard": "string"
}
],
"block_height": "string",
"block_timestamp_nanos": "string"
}

Responses

StatusMeaningDescriptionSchema
200OKOKCoinBalancesResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get user's coin history by contract

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/accounts/{account_id}/coins/{contract_account_id}/history \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /accounts/{account_id}/coins/{contract_account_id}/history

Get user's coin history by contract

This endpoint returns the history of coin operations (FT, other standards) for the given account_id, contract_id, timestamp/block_height.

Limitations

  • For now, we support only FT contracts that implement the Events NEP standard. We are working on a solution to support other FT contracts, including wrap.near and bridged tokens.
  • We are in the process of supporting Multi Token history.
  • We currently provide the most recent 100 items. Full-featured pagination will be provided in an upcoming update.

Parameters

NameInTypeRequiredDescription
account_idpathstringtruenone
contract_account_idpathstringtruenone
limitqueryinteger(int32)falsenone

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"history": [
{
"block_height": "string",
"block_timestamp_nanos": "string",
"cause": "string",
"new_account_id": "string",
"old_account_id": "string",
"status": "string"
}
],
"nft": {
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
}

Responses

StatusMeaningDescriptionSchema
200OKOKHistoryResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Get FT contract metadata

Code samples

# You can also use wget
curl -X GET https://near-testnet.api.pagoda.co/eapi/v1/nep141/metadata/{contract_account_id} \
-H 'Accept: application/json' \
-H 'x-api-key: API_KEY'

GET /nep141/metadata/{contract_account_id}

Get FT contract metadata

This endpoint returns the metadata for a given FT contract and timestamp/block_height.

Limitations

  • For now, we support only FT contracts that implement the Events NEP standard. We are working on a solution to support other FT contracts, including wrap.near and bridged tokens.

Parameters

NameInTypeRequiredDescription
contract_account_idpathstringtruenone
block_heightquerystringfalsenone
block_timestamp_nanosquerystringfalsenone

Example responses

200 Response

{
"block_height": "string",
"block_timestamp_nanos": "string",
"metadata": {
"decimals": 0,
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
}
}

Responses

StatusMeaningDescriptionSchema
200OKOKFtContractMetadataResponse
500Internal Server ErrorSee the inner code value to get more detailsNone

Schemas

CoinBalancesResponse

{
"balances": [
{
"balance": "string",
"contract_account_id": "string",
"metadata": {
"decimals": 0,
"icon": "string",
"name": "string",
"symbol": "string"
},
"standard": "string"
}
],
"block_height": "string",
"block_timestamp_nanos": "string"
}

This response gives the information about all the available balances for the user. The answer gives the list of NEAR, FT balances, could be used for Multi Tokens. For MTs and other standards, balances could have multiple entries for one contract.

Properties
NameTypeRequiredRestrictionsDescription
balances[object]truenonenone
» balancestringtruenonenone
» contract_account_idstringfalsenonenull for NEAR, not null otherwise
» metadataobjecttruenoneThis type describes general Metadata info, collecting the most important fields from different standards in the one format.
decimals may contain 0 if it's not applicable (e.g. if it's general MT metadata)
»» decimalsinteger(int32)truenonenone
»» iconstringfalsenonenone
»» namestringtruenonenone
»» symbolstringtruenonenone
» standardstringtruenone"nearprotocol" for NEAR, "nep141" for FT
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone

FtContractMetadataResponse

{
"block_height": "string",
"block_timestamp_nanos": "string",
"metadata": {
"decimals": 0,
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
}
}

Properties
NameTypeRequiredRestrictionsDescription
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone
metadataobjecttruenoneThe type for FT Contract Metadata. Inspired by
https://nomicon.io/Standards/Tokens/FungibleToken/Metadata
» decimalsinteger(int32)truenonenone
» iconstringfalsenonenone
» namestringtruenonenone
» referencestringfalsenonenone
» reference_hashstringfalsenonenone
» specstringtruenonenone
» symbolstringtruenonenone

HistoryResponse

{
"block_height": "string",
"block_timestamp_nanos": "string",
"history": [
{
"block_height": "string",
"block_timestamp_nanos": "string",
"cause": "string",
"new_account_id": "string",
"old_account_id": "string",
"status": "string"
}
],
"nft": {
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
}

Properties
NameTypeRequiredRestrictionsDescription
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone
history[object]truenonenone
» block_heightstringtruenonenone
» block_timestamp_nanosstringtruenonenone
» causestringtruenonenone
» new_account_idstringfalsenonenone
» old_account_idstringfalsenonenone
» statusstringtruenonenone
nftobjecttruenoneThe type for Non Fungible Token. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
» metadataobjecttruenoneThe type for Non Fungible Token Metadata. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
»» copiesinteger(int64)falsenonenone
»» descriptionstringfalsenonenone
»» extrastringfalsenonenone
»» mediastringfalsenonenone
»» media_hashstringfalsenonenone
»» referencestringfalsenonenone
»» reference_hashstringfalsenonenone
»» titlestringfalsenonenone
» owner_account_idstringtruenonenone
» token_idstringtruenonenone

MetadataResponse

{
"block_height": "string",
"block_timestamp_nanos": "string",
"metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
}
}

Properties
NameTypeRequiredRestrictionsDescription
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone
metadataobjecttruenoneThe type for Non Fungible Token Contract Metadata. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
» base_uristringfalsenonenone
» iconstringfalsenonenone
» namestringtruenonenone
» referencestringfalsenonenone
» reference_hashstringfalsenonenone
» specstringtruenonenone
» symbolstringtruenonenone

NearBalanceResponse

{
"balance": "string",
"block_height": "string",
"block_timestamp_nanos": "string",
"metadata": {
"decimals": 0,
"icon": "string",
"name": "string",
"symbol": "string"
}
}

Properties
NameTypeRequiredRestrictionsDescription
balancestringtruenoneSum of staked and nonstaked balances
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone
metadataobjecttruenoneThis type describes general Metadata info, collecting the most important fields from different standards in the one format.
decimals may contain 0 if it's not applicable (e.g. if it's general MT metadata)
» decimalsinteger(int32)truenonenone
» iconstringfalsenonenone
» namestringtruenonenone
» symbolstringtruenonenone

NftCountsResponse

{
"block_height": "string",
"block_timestamp_nanos": "string",
"nft_counts": [
{
"contract_account_id": "string",
"contract_metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
},
"last_updated_at_timestamp_nanos": "string",
"nft_count": 0
}
]
}

Properties
NameTypeRequiredRestrictionsDescription
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone
nft_counts[object]truenonenone
» contract_account_idstringtruenonenone
» contract_metadataobjecttruenoneThe type for Non Fungible Token Contract Metadata. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
»» base_uristringfalsenonenone
»» iconstringfalsenonenone
»» namestringtruenonenone
»» referencestringfalsenonenone
»» reference_hashstringfalsenonenone
»» specstringtruenonenone
»» symbolstringtruenonenone
» last_updated_at_timestamp_nanosstringtruenonenone
» nft_countinteger(int32)truenonenone

NftResponse

{
"block_height": "string",
"block_timestamp_nanos": "string",
"contract_metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
},
"nft": {
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
}

Properties
NameTypeRequiredRestrictionsDescription
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone
contract_metadataobjecttruenoneThe type for Non Fungible Token Contract Metadata. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
» base_uristringfalsenonenone
» iconstringfalsenonenone
» namestringtruenonenone
» referencestringfalsenonenone
» reference_hashstringfalsenonenone
» specstringtruenonenone
» symbolstringtruenonenone
nftobjecttruenoneThe type for Non Fungible Token. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
» metadataobjecttruenoneThe type for Non Fungible Token Metadata. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
»» copiesinteger(int64)falsenonenone
»» descriptionstringfalsenonenone
»» extrastringfalsenonenone
»» mediastringfalsenonenone
»» media_hashstringfalsenonenone
»» referencestringfalsenonenone
»» reference_hashstringfalsenonenone
»» titlestringfalsenonenone
» owner_account_idstringtruenonenone
» token_idstringtruenonenone

NftsResponse

{
"block_height": "string",
"block_timestamp_nanos": "string",
"contract_metadata": {
"base_uri": "string",
"icon": "string",
"name": "string",
"reference": "string",
"reference_hash": "string",
"spec": "string",
"symbol": "string"
},
"nfts": [
{
"metadata": {
"copies": 0,
"description": "string",
"extra": "string",
"media": "string",
"media_hash": "string",
"reference": "string",
"reference_hash": "string",
"title": "string"
},
"owner_account_id": "string",
"token_id": "string"
}
]
}

Properties
NameTypeRequiredRestrictionsDescription
block_heightstringtruenonenone
block_timestamp_nanosstringtruenonenone
contract_metadataobjecttruenoneThe type for Non Fungible Token Contract Metadata. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
» base_uristringfalsenonenone
» iconstringfalsenonenone
» namestringtruenonenone
» referencestringfalsenonenone
» reference_hashstringfalsenonenone
» specstringtruenonenone
» symbolstringtruenonenone
nfts[object]truenonenone
» metadataobjecttruenoneThe type for Non Fungible Token Metadata. Inspired by
https://nomicon.io/Standards/Tokens/NonFungibleToken/Metadata
»» copiesinteger(int64)falsenonenone
»» descriptionstringfalsenonenone
»» extrastringfalsenonenone
»» mediastringfalsenonenone
»» media_hashstringfalsenonenone
»» referencestringfalsenonenone
»» reference_hashstringfalsenonenone
»» titlestringfalsenonenone
» owner_account_idstringtruenonenone
» token_idstringtruenonenone
Was this page helpful?