Understanding the shape of an ability will help as you map your ability’s data model to Daylight’s. Here's an example of how an ability manifests visually on Daylight's own web app UI:

18281828

🖼 Content

The content of each ability is what is presented to the user of an app using the Daylight API.

FieldDescriptionType
title*Title of the ability. Pick a title that clearly expresses what people will get. Great titles are fewer than 80 characters and start with an action verb (”Mint / Claim / Join / Buy / etc.”).string
descriptionA longer body of text with more details about the ability.string
imageUrlAn image that helps the user understand what the ability is. Do not use a required token’s logo here, as we automatically ingest that based on the token’s contract address. If it’s a mint, use an image of one of the NFTs in the collection. The Daylight API currently only accepts PNGs or JPEGs.string
openAtThe datetime at which this ability becomes available. If it is too distant in the future to be relevant to someone who qualifies, the API will not show it unless showDistant is set to true.string
closeAtThe datetime that this ability closes.string
sourceId*Source IDs should be deterministic and unique per ability for your API key so that - if you accidentally resubmit the same ability - it will fail and not create a duplicate and spammy ability.

It serves as your ID for finding, updating, or deactivating an ability later. Cannot be changed after ability creation.
string
isClosedThis is likely not applicable to you. If there is no specific close date but you need to mark this as closed, set this value to true.boolean
isActivetrue if this ability should be live in Daylight's system. false if this ability should be removed (equivalent of "delete").boolean
type*What type of ability this is: mints, airdrops, etc. See below for options and their descriptions. Cannot be changed after ability creation.string

Ability Types

Below are the different possible values for the above ability type.

ValueDescription
voteA proposal that someone can vote on based on a token they hold.
claimA on-chain reward that someone can claim that is not a mint or airdrop. Examples include: Juicebox claims, PoolTogether prize claims, ENS subdomain claims, and staking reward claims.
airdropA ERC-20 token airdrop, usually not promised in advance or directly connected to one contract interaction.
mintA ERC-721 or ERC-1155 token mint.
accessA general off-chain token-gated experience, often a group chat.
productAn off-chain product, often a discounted or free item available on an ecommerce store.
eventAn event, often at a conference or a token-gated online experience.
articleA blog post or article about a specific token.
resultThe result of a vote proposal.
miscAn ability that does not fall into any of these types.

⚡️ Action

The contents of this section give someone all the information they need to complete an ability. Abilities can be completed on-chain or off-chain, and indicating completion is very important. If you indicate completion, people will not see abilities that they have already completed, creating a better experience for everyone. Another important side effect: wallet apps can feel confident in sending users push notifications about your tool's abilities because the wallet apps know that you are reporting completion.

  • On-chain: On-chain abilities are completed by calling a function on a contract. When a tool posts an on-chain ability, it must include at least the contract address and function hash (example: 0xdd6be29a) so that Daylight can automatically track completion and not show or push abilities to people who have already completed them. If an ability can only be completed with specific function parameters, a tool must include the the necessary inputs on that function.
  • Off-chain: Off-chain abilities are usually actionable via a web app or event. A tool can indicate whether a user has completed an ability by posting to the Submit Completion endpoint.

The below fields are nested below the action field:

FieldDefinitionType
linkUrl*A link to the web app where a user can complete the ability. Your API key can only add abilities that link to a specific domain or from a list of domains that are on your API key’s allowlist. To update that allowlist, email [email protected]

If you do not have a link, link to the “Write Contract” section of the ability’s contract on Etherscan.
string
completedByIf your ability is on-chain, you must include at least the contract address and function hash(es) so that we can monitor which wallet addresses have completed this ability and not show it to people who have already completed it.

You could also include parameters so that users can complete the ability inside the apps using the Daylight API.

You can add multiple function hashes if there are multiple that indicate completion. These are logically “OR’d”.
array

completedBy Metadata

Below are the objects that should be nested in the above completedBy field.

FieldDefinitionType
chain*The chain that this ability can be completed on. Daylight currently supports ethereum - more chains coming soon.string
address*The address of the contract that a wallet address needs to interact with to complete this ability.string
functionHash*The function hash (8 bit value) on the above contract that a user needs to call to complete this ability. If we are just tracking if an ability was completed and not enabling users to complete the ability in an app using the Daylight API, provide this value. Example: 0xdd6be29a.string
inputsWill describe these in the future, but they remain undocumented for now.array

🔒 Requirements

Requirements describe the inputs necessary for a wallet address to qualify for an ability. The Daylight API uses these requirements to decide which users will see an ability.

FieldDefinitionType
requirementsLogicWhether the requirements in the requirements array below are logically OR'd or AND'd. Daylight currently only supports OR; AND will be added at some point in the future.string
requirements*An array of the requirements necessary for a wallet address to qualify for an ability. There are three different requirement types right now: hasTokenBalance, hasNftWithSpecificId, and onAllowlistarray

hasTokenBalance

When an ability is gated to holders of a specific ERC-20, ERC-1155, or ERC-721.

FieldDescriptionType
chain*The chain that this token exists on. Daylight currently supports ethereum - more chains coming soon.string
type*hasTokenBalance(must have a balance of a token or a NFT from a collection)string
address*The token or collection’s issuing contract address.string
communityMetadata about the token or collection issued by the above address. Used by wallet apps to inform the user visually about the ability's requirements.array
minAmountThe minimum amount a wallet address must have to qualify for this ability.number

community Metadata

The fields nested underneath the above community object. These fields contain metadata about the token or collection issued by the above address. Used by wallet apps to inform the user visually about the ability's requirements.

These fields are programmatically generated and cannot be submitted. These fields are also applicable to the community object for hasNftWithSpecificId requirement type.

FieldDescriptionType
chainThe chain that this token exists on. Daylight currently supports ethereum - more chains coming soon.string
contractAddressThe issuing contract address of the community's token.string
typeERC-20, ERC-721, or ERC-1155string
titleThe title of the community.string
slugA slugged version of the community title.string
currencyCodeThe abbreviated currency code if the community's token is an ERC-20.string
descriptionA description of the community.string
imageUrlA link to the community's logo.string

hasNftWithSpecificId

When an ability is gated to holders of a ERC-1155 or ERC-721 with a specific set of token IDs.

FieldDescriptionType
chain*The chain that this token exists on. Daylight currently supports ethereum - more chains coming soon.string
type*hasNftWithSpecificId (must have an NFT with one ID from an array of IDs)string
address*The token’s issuing contract address.string
id*An array of all the IDs necessary to qualify for this ability.array

onAllowlist

When an ability is gated to an array of wallet addresses.

FieldDescriptionType
chain*The chain that these addresses exist on. Daylight currently supports ethereum - more chains coming soon.string
type*onAllowlist (must be one of these addresses)string
addresses*An array of wallet addresses on the allowlist.array

📄 Generated Metadata

These fields offer more data about the ability and are generated by Daylight automatically.

FieldDefinitionType
slugA unique slug for this ability. Not required and Daylight will generate it automatically for you if you do not include one. Cannot be changed after ability creation.string
uidA unique id for this ability.string
walletCompletedWhether or not a specific wallet address completed this ability. Only returns when requesting abilities for a specific wallet address.boolean
supplierIf this ability was added to Daylight by a supplier (tool), this Metadata about the tool that submitted these abilities.array
submitterMetadata about the wallet address of the person who submitted this ability to Daylight via the Daylight Scout community.array

supplier Metadata

The fields nested underneath the above supplier object. These fields contain metadata about tool that added an ability to Daylight. Used by wallet apps to inform the user where this ability came from, or to filter a response of many abilities.

FieldDefinitionType
idThe ID of the supplier.number
nameThe name of the supplier.string
slugA slugged version of the supplier's name.string
urlA link to the supplier's website.string

submitter Metadata

The fields nested underneath the above submitter object. These fields contain metadata about wallet address of the person who submitted an ability to Daylight via the Daylight Scout community. Used by Daylight.xyz to attribute an ability to its Scout.

FieldDefinitionType
chainThe chain that these addresses exist on. Daylight currently supports ethereum - more chains coming soon.string
publicKeyThe wallet address of the submitter of this ability.string