Skip to main content

Task types

Dyma ships a global task type catalog managed in super admin. Projects pick types when creating quests in Studio. The canonical list lives in dyma-shared as TASK_TYPE_CATALOG.

Catalog aligns with common quest-platform patterns (social, content, engagement, on-chain) while staying Cosmos / IBC-first. The following third-party builder types are not included: generic EVM contract builders, generic token/NFT holder apps, Substrate pallet tasks, faucets, partner-specific DEX integrations, and meta-platform tasks.

Tier 1 integrations​

Priority platforms for launch and marketing:

PlatformTask typesVerification
DiscordJoin, rolePlatform API (free)
TelegramJoin, bot startPlatform API (free)
GitHubStar, fork, commitPlatform API (free)
YouTubeSubscribe, like, visit channel, video submitPlatform API / manual
X (Twitter)Follow, like, retweet, reply, hashtag, quote, mention, bio, pinned post, X Spaces (join, speak, host)Platform API (paid API tier) / hybrid
On-chainSwap, stake, transfer, …API reads the chain's REST endpoints
EmailVerified email linkPlatform API
ReferralInvite friendsPlatform API

Verification methods​

MethodIDUsed for
On-chainon_chainCosmos / IBC transactions, read by the API from chain REST endpoints
Platform APIplatform_apiOAuth social integrations
Project REST APIproject_restCustom project logic
Manual reviewmanualLinks, content, moderators
HybridhybridAuto first, manual fallback
AI verifyai_verifycurrently routed to human review
Hybrid + AIhybrid_aicurrently routed to human review

Full catalog​

Social — X / Twitter​

IDNameAuto?
social_twitter_followTwitter FollowYes
social_twitter_likeTwitter LikeSemi
social_twitter_retweetTwitter RetweetSemi
social_twitter_commentTwitter CommentSemi
social_twitter_threadTwitter ThreadNo (review)
social_twitter_hashtagTwitter Hashtag PostSemi
social_twitter_memeTwitter Meme / Creative PostNo (review)
social_twitter_hashtag_aiTwitter Hashtag + AI VerifyNo (review)
social_twitter_quoteTwitter Quote PostSemi (hybrid)
social_twitter_mentionTwitter MentionSemi (hybrid)
social_twitter_bioTwitter Bio / Display NameYes
social_twitter_pinTwitter Pinned PostYes
social_twitter_space_attendJoin an X SpaceYes (live code)
social_twitter_space_speakSpeak in an X SpaceSemi (hybrid)
social_twitter_space_hostHost an X SpaceSemi (hybrid)

How the X checks work​

Every X quest runs through the dedicated X runner (POST /v1/quests/:id/twitter/verify): the earner links X once (scopes tweet.read users.read like.read follows.read offline.access, no other scope is ever requested) and Dyma reads the X API when they verify. Points are credited the moment a platform_api check passes; hybrid quests fall back to a reviewer after three negative checks or at once when X itself fails (outage, rate limit, or a feature the X API plan lacks).

QuestWhat Dyma readsPasses whenMethod
Quotethe earner's posts since the campaign started (reposts skipped, at most 2 pages of 100)a post quotes the target (referenced_tweets type quoted)hybrid
Mentionthe earner's original posts since the campaign started (replies and reposts skipped)a post mentions the account (entities.mentions), with the optional text and hashtagshybrid
Bio / display nameGET /2/users/me with descriptionthe display name and/or bio contains the text (case-insensitive)platform API
Pinned postGET /2/users/me with the pinned_tweet_id expansionthe pinned post is the target post or quotes it (X only lets people pin their own posts), or carries every required hashtagplatform API
Join an X Spacethe Space (GET /2/spaces/:id, app bearer token)the code the host says live matches (trimmed, case-insensitive) while the Space is live or within the grace after it endsplatform API
Speak in an X Spacethe Space's speaker_ids / host_ids (app bearer token)the earner's linked X id is on stage; retry while the Space is livehybrid
Host an X Spacethe Space the earner submits (creator_id, host_ids, title, started_at, optional participant_count)they created or co-hosted it, the title contains every keyword, it started inside the campaign window and had enough listenershybrid

X Spaces and the API plan. X does not expose who listens to a Space, so "Join an X Space" is proven by a code the host says live. Spaces lookups use the app-only bearer token (Admin → Integrations → X), because user-context Spaces reads need the space.read scope Dyma does not request. When the token is missing or the X API plan refuses Spaces lookups (403 client-not-enrolled and similar), the earner sees "Reading X Spaces is not available on Dyma's current X API plan": hybrid quests go to manual review, and the join quest falls back to the window the project set on the quest (start, end and grace). participant_count is not returned on every plan; a host quest with a minimum listener count then goes to review instead of failing. Wrong Space codes are rate-limited like the secret-code quest (10 per 15 minutes per earner).

Social — Discord & Telegram​

IDNameAuto?
social_discord_joinDiscord JoinYes
social_discord_roleDiscord RoleYes
social_discord_messageDiscord MessageYes
social_telegram_joinTelegram JoinYes
social_telegram_bot_startTelegram Bot StartYes

Discord Message​

Auto-verified via the Dyma Discord bot. Studio config: guildId (from project Discord connection), channelId / channelName, optional inviteUrl, optional requireSubstring.

Earner flow

  1. Link Discord (OAuth)
  2. Post in the configured channel (optionally paste a message URL)
  3. POST /v1/quests/:questId/discord/verify → bot scans recent messages for the linked Discord user

Bot needs View Channels and Read Message History. Reinstall the bot if an older install only had View Channels. A requireSubstring check also needs the privileged Message Content intent on Dyma's Discord application (see Integrations and credentials); without it Studio disables the option.

Studio dry-run: POST /v1/quests/:questId/discord/preview/status|verify.

Telegram Join + Bot Start​

Two separate quest types. Two bots with clear jobs:

BotWhere configuredUsed for
Dyma platform botAdmin → Integrations → TelegramEarner account linking only
Project botStudio → Settings → Integrations → TelegramJoin verification + Bot Start deep links

Join (social_telegram_join) Studio config: chatId, optional inviteUrl / chatTitle, requireStatus. Project bot must be an admin in that chat.

Bot Start (social_telegram_bot_start) Studio config: optional customStartMessage. Deep link opens the project bot. Start payload is server-generated per user.

Earner flow

  1. POST /v1/users/me/telegram/link-url then open Dyma bot deep link (once)
  2. GET /v1/quests/:questId/telegram/status
  3. Open invite (Join) or project bot deep link (Bot Start)
  4. POST /v1/quests/:questId/telegram/verify → credited at once when the check passes

Studio

  • Connect project bot: PUT /v1/projects/:id/telegram/bot with { botToken }
  • Dry-run preview: POST /v1/quests/:questId/telegram/preview/status|verify

Webhooks: POST /v1/telegram/webhook (Dyma bot), POST /v1/telegram/webhook/project/:projectId (project bot).

Social — Instagram​

IDNameAuto?
social_instagram_followInstagram FollowSemi
social_instagram_view_postInstagram View PostSemi
social_instagram_visit_profileInstagram Visit ProfileNo

Social — YouTube​

IDNameAuto?
social_youtube_subscribeYouTube SubscribeYes
social_youtube_likeYouTube LikeSemi
social_youtube_commentYouTube CommentNo
social_youtube_visit_channelYouTube Visit ChannelSemi

Social — Product Hunt, URL, Referral​

IDNameAuto?
social_producthunt_upvoteProduct Hunt UpvoteSemi
social_producthunt_commentProduct Hunt CommentNo
social_producthunt_visitProduct Hunt VisitNo
engagement_url_visitVisit URLSemi
engagement_url_shareShare URLNo
social_referralReferralYes

Developer — GitHub​

IDNameAuto?
social_github_starGitHub StarYes
social_github_forkGitHub ForkYes
dev_github_prGitHub Pull RequestYes
dev_github_issueGitHub IssueNo
dev_github_commitGitHub CommitYes
dev_deploy_contractDeploy Smart ContractYes
dev_deploy_workloadDeploy WorkloadNo

Content​

IDNameAuto?
content_blog_writeWrite Blog PostNo
content_blog_commentComment on BlogNo
content_media_uploadMedia / Screenshot UploadNo
content_media_upload_aiMedia Upload + AI VerifyNo (review)
dev_tutorial_submitTutorial / ArticleNo
dev_video_submitVideo Submission (YouTube, Loom, …)No
content_kickstarter_supportKickstarter SupportNo

Learn & forms​

IDNameAuto?
learn_quizQuiz / AssessmentYes
learn_course_completeCourse CompletionSemi
custom_formForm / SurveyNo

Quiz / Assessment (learn_quiz)​

Studio authors build in-app questions (single or multi correct options), a pass score (%), and optional shuffle / explanations. Correct answers stay in verificationConfig server-side only.

Earner APIs

MethodPathNotes
GET/v1/quests/:questId/quizPublic questions (answers stripped)
GET/v1/quests/:questId/quiz/statusAuth; prior submission state
POST/v1/quests/:questId/quiz/submitAuth; body { answers: { [questionId]: optionId[] } }

Passing credits the quest at once. A failed attempt returns which answers were right or wrong (the corrections only after a pass, when explanations are on); attempts are limited (maxAttempts, default 3, retryCooldownMinutes, default 1). Admin catalog: enable/logo for learn_quiz under Integrations / Task Types (no credentials panel).

Identity​

IDNameAuto?
identity_wallet_linkWallet ConnectYes
email_linkVerified EmailYes
attestation_signSigned MessageYes
engagement_terms_acceptTerms & ConditionsYes

Earners prove ownership of an email with a quest-scoped OTP. Studio configures optional domain allowlists, whether to reuse an already-linked profile email, and optional mail intro copy.

Earner flow

  1. GET /v1/quests/:questId/email-link/status: linked email, domain match, canSkipOtp
  2. POST /v1/quests/:questId/email-link/send-otp: body { email }; sends quest.email_link_otp with project and quest context
  3. POST /v1/quests/:questId/email-link/verify: body { code } or { useLinkedEmail: true }; upserts UserEmail and credits the quest

Verification does not stub-auto-pass for this type: a verified profile email matching domain rules is required. On-chain email attestation is deferred; OTP is the v1 path (same crypto and TTL rules as profile email link).

Engagement​

IDNameAuto?
engagement_daily_checkinDaily Check-inYes
engagement_secret_codeSecret CodeYes
engagement_lucky_drawLucky DrawYes
engagement_app_installMobile App InstallNo
engagement_app_install_aiApp Install + AI VerifyNo (review)

Daily Check-in (engagement_daily_checkin)​

No Studio verification JSON or custom inputs. Earners open the quest once per UTC day and tap Check in.

  1. GET /v1/quests/:questId/daily-checkin/status: whether the user can check in today, streak, next availability
  2. POST /v1/quests/:questId/daily-checkin/check-in: credits the quest for the current UTC day at once (409 QUEST_COOLDOWN if already checked in)

On-chain (Cosmos / IBC)​

Verified by the API, which reads each chain's REST endpoints (with fallbacks) and matches the earner's transaction; a transaction that is not indexed yet is re-checked. chain_lp_hold is disabled (it needs balance sampling over time).

IDName
chain_transferToken Transfer
chain_swapDEX Swap
chain_lp_addAdd Liquidity
chain_lp_holdHold LP Position (disabled)
chain_stakeStake / Delegate
chain_unstakeUnstake / Redelegate
chain_voteGovernance Vote
chain_proposal_submitSubmit Proposal
chain_nft_mintNFT Mint
chain_contract_interactContract Interaction
chain_blob_postData Availability Blob
chain_bridgeCross-chain Bridge
chain_wallet_connectWallet Connect Proof

Custom​

IDName
custom_restCustom (Project REST API)
custom_manualCustom (Manual)

Quest categories​

Filters in the client and Studio map to these slugs:

on-chain · staking · governance · developer · learn · social · content · identity · engagement · custom

Admin​

Super admin can enable or disable any task type platform-wide at admin.dyma.io → Task Types. Disabled types are hidden from Studio but existing quests remain until archived.

See also Verification and Content model.