Airdrop API (v1)
Programmatically manage airdrop projects, tasks, and hunting workflows.
The Airdrop API allows you to register projects, manage tasks, and track your airdrop hunting workflow externally. It mirrors the Devora dashboard's Airdrop Center feature set.
How It Works
┌──────────┐ ┌─────────────────────┐ ┌──────────┐
│ Client │────▶│ Devora Airdrop API │────▶│ Prisma │
│ (SDK) │◄────│ /api/v1/airdrops │◄────│ (DB) │
└──────────┘ └─────────────────────┘ └──────────┘- Register a project via
POST /api/v1/airdrops - Add tasks via
POST /api/v1/airdrops/{id}/tasks - Track progress via
GET /api/v1/airdropswith status filters - Update status via
PUT /api/v1/airdropsas projects evolve
Authentication
All endpoints require an API Key in the Authorization header as a Bearer token.
Authorization: Bearer devora_your_api_key[!IMPORTANT] API Keys must be generated from your API Key Management page and must start with the
devora_prefix.
Base URL
https://devora.my.id/api/v1/airdropsProjects
List All Projects
Retrieve all airdrop projects you own, plus all public approved projects from other users.
- Endpoint:
GET /api/v1/airdrops - Method:
GET
Query Parameters
| Parameter | Type | Description |
|---|---|---|
status | String | Filter by status (New, Potential, Confirmed, etc.). |
projectType | String | Filter by project type (Infra, DeFi, etc.). |
isPublic | Boolean | Filter by visibility (true/false). |
Example Request
curl "https://devora.my.id/api/v1/airdrops?status=New&projectType=Infra" \
-H "Authorization: Bearer devora_your_api_key"Response 200
[
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Devora Protocol",
"status": "New",
"cost": "$0",
"time": "5 minutes",
"raise": "$11B",
"projectType": "Infra",
"links": "[{\"name\":\"web\",\"url\":\"https://devora.ai\"}]",
"isPublic": false,
"publishStatus": "NONE",
"createdAt": "2026-04-20T08:00:00.000Z",
"_count": {
"tasks": 3
}
}
][!NOTE] The
linksfield is stored as a JSON string. Parse it withJSON.parse()before use.
Register a New Project
Create a new airdrop project in your dashboard.
- Endpoint:
POST /api/v1/airdrops - Method:
POST
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
name | String | Yes | Name of the project. |
icon | String | No | URL to project icon/logo. |
description | String | No | Project description and instructions. |
status | String | No | Initial status. Defaults to New. |
cost | String | No | Estimated cost (e.g., "$0", "Rp. 50.000"). |
time | String | No | Estimated time (e.g., "10 minutes"). |
raise | String | No | Total funding raised (e.g., "$11B"). |
score | String | No | Project score or rating. |
symbol | String | No | Token symbol. |
rewardDate | String | No | Expected reward date. |
rewardType | String | No | Type of reward. See Reward Types. |
taskType | String | No | Type of tasks involved. See Task Types. |
stage | String | No | Project stage. |
projectType | String | No | Category. See Project Types. |
links | Array | No | Objects containing { "name": "web", "url": "..." }. |
isPublic | Boolean | No | Make project public (ULTRA users only). |
[!TIP] The
linksarray supports:web,x,github,telegram,discord. These appear as clickable icons in the UI.
Example Request
curl -X POST https://devora.my.id/api/v1/airdrops \
-H "Content-Type: application/json" \
-H "Authorization: Bearer devora_your_api_key" \
-d '{
"name": "Devora Protocol",
"icon": "https://devora.ai/logo.png",
"description": "Complete tasks to earn rewards",
"status": "New",
"cost": "$0",
"time": "5 minutes",
"raise": "$11B",
"symbol": "DVR",
"rewardType": "Airdrop",
"projectType": "Infra",
"links": [
{ "name": "web", "url": "https://devora.ai" },
{ "name": "x", "url": "https://x.com/devora" }
]
}'Response 201
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Devora Protocol",
"status": "New",
"statusDate": "2026-04-23T12:00:00.000Z",
"isPublic": false,
"publishStatus": "NONE",
"createdAt": "2026-04-23T12:00:00.000Z"
}[!IMPORTANT] Auto-status logic: When creating a project with status
New, if there are already 5Newprojects, the oldest ones are automatically demoted toPotentialto keep your dashboard focused.
Update a Project
Modify an existing airdrop project.
- Endpoint:
PUT /api/v1/airdrops - Method:
PUT
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
id | String | Yes | Project UUID to update. |
name | String | No | Updated project name. |
icon | String | No | Updated icon URL. |
description | String | No | Updated description. |
status | String | No | Updated status. |
links | Array | No | Updated links array. |
| ... | ... | No | Any other project fields to update. |
[!NOTE] Only the project owner or ULTRA users can update projects. ULTRA users can also modify
isPublicandpublishStatusfields.
Example Request
curl -X PUT https://devora.my.id/api/v1/airdrops \
-H "Content-Type: application/json" \
-H "Authorization: Bearer devora_your_api_key" \
-d '{
"id": "123e4567-e89b-12d3-a456-426614174000",
"status": "Confirmed",
"raise": "$15B"
}'Response 200
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "Devora Protocol",
"status": "Confirmed",
"statusDate": "2026-04-23T12:05:00.000Z",
"raise": "$15B",
"updatedAt": "2026-04-23T12:05:00.000Z"
}[!NOTE] The
statusDatefield is automatically updated whenever thestatuschanges, enabling timeline tracking in the UI.
Delete a Project
Permanently remove a project and all associated tasks.
- Endpoint:
DELETE /api/v1/airdrops?id=PROJECT_ID - Method:
DELETE
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
id | String | Yes | Project UUID to delete. |
[!WARNING] This will permanently delete the project and all associated tasks and progress records. This action cannot be undone.
Example Request
curl -X DELETE "https://devora.my.id/api/v1/airdrops?id=123e4567-e89b-12d3-a456-426614174000" \
-H "Authorization: Bearer devora_your_api_key"Response 200
{
"message": "Airdrop deleted successfully"
}Tasks
List Tasks for a Project
Get all tasks for a specific project.
- Endpoint:
GET /api/v1/airdrops/{id}/tasks - Method:
GET
Path Parameters
id: The UUID of the project.
Query Parameters
| Parameter | Type | Description |
|---|---|---|
category | String | Filter by category (Social, Testnet, etc.). |
status | String | Filter by status (Open, Closed). |
Example Request
curl "https://devora.my.id/api/v1/airdrops/123e4567-e89b-12d3-a456-426614174000/tasks?category=Social" \
-H "Authorization: Bearer devora_your_api_key"Response 200
[
{
"id": "task-uuid",
"title": "Join Telegram",
"category": "Social",
"description": "Join our community",
"status": "Open",
"deadline": "2026-12-31T00:00:00.000Z",
"steps": [
{
"text": "Click the link",
"image": "https://example.com/image.png",
"link": "https://t.me/devora",
"isPrivate": false
}
]
}
]Add Task to Project
Create a new task within a project.
- Endpoint:
POST /api/v1/airdrops/{id}/tasks - Method:
POST
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
title | String | Yes | Title of the task. |
category | String | Yes | Task category (Social, Testnet, etc.). |
description | String | No | Detailed instructions. |
deadline | String | No | Task deadline (ISO 8601 format). |
status | String | No | Task status (Open, Closed). Defaults to Open. |
steps | Array | No | Array of step objects with detailed information. |
Steps Object
| Field | Type | Description |
|---|---|---|
text | String | Step instruction text. |
image | String | Optional image URL for the step. |
link | String | Optional link URL for the step. |
isPrivate | Boolean | Whether step is private (only visible to owner). |
Example Request
curl -X POST https://devora.my.id/api/v1/airdrops/123e4567-e89b-12d3-a456-426614174000/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer devora_your_api_key" \
-d '{
"title": "Join Telegram",
"category": "Social",
"description": "Join our community and verify your username",
"deadline": "2026-12-31",
"steps": [
{
"text": "Click the link below to join",
"link": "https://t.me/devora",
"image": "https://example.com/telegram-guide.png",
"isPrivate": false
},
{
"text": "Send your username to admin",
"isPrivate": true
}
]
}'Update a Task
Modify an existing task.
- Endpoint:
PUT /api/v1/airdrops/{id}/tasks - Method:
PUT
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
taskId | String | Yes | Task UUID to update. |
title | String | No | Updated task title. |
category | String | No | Updated category. |
description | String | No | Updated description. |
deadline | String | No | Updated deadline. |
status | String | No | Updated status (Open, Closed). |
steps | Array | No | Updated steps array. |
[!NOTE] Only the project owner or ULTRA users can update tasks.
Example Request
curl -X PUT https://devora.my.id/api/v1/airdrops/123e4567-e89b-12d3-a456-426614174000/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer devora_your_api_key" \
-d '{
"taskId": "task-uuid-here",
"status": "Closed",
"steps": [
{
"text": "Updated instruction",
"link": "https://new-link.com",
"isPrivate": false
}
]
}'Delete a Task
Remove a task from a project.
- Endpoint:
DELETE /api/v1/airdrops/{id}/tasks?taskId=TASK_ID - Method:
DELETE
[!WARNING] This will permanently delete the task and all user progress records. This action cannot be undone.
Example Request
curl -X DELETE "https://devora.my.id/api/v1/airdrops/123e4567-e89b-12d3-a456-426614174000/tasks?taskId=task-uuid-here" \
-H "Authorization: Bearer devora_your_api_key"Mark Task as Completed
Mark a task as completed or incomplete for the current user.
- Endpoint:
POST /api/v1/airdrops/{id}/tasks/{taskId}/complete - Method:
POST
Request Body
| Field | Type | Required | Description |
|---|---|---|---|
completed | Boolean | Yes | true to mark as completed, false otherwise |
Example Request
curl -X POST "https://devora.my.id/api/v1/airdrops/123e4567-e89b-12d3-a456-426614174000/tasks/task-uuid-here/complete" \
-H "Content-Type: application/json" \
-H "Authorization: Bearer devora_your_api_key" \
-d '{
"completed": true
}'Response 200
{
"taskId": "task-uuid-here",
"completed": true,
"completedAt": "2026-04-23T09:45:00.000Z",
"message": "Task marked as completed"
}Get Task Completion Status
Check if a task is completed for the current user.
- Endpoint:
GET /api/v1/airdrops/{id}/tasks/{taskId}/complete - Method:
GET
Example Request
curl "https://devora.my.id/api/v1/airdrops/123e4567-e89b-12d3-a456-426614174000/tasks/task-uuid-here/complete" \
-H "Authorization: Bearer devora_your_api_key"Response 200
{
"taskId": "task-uuid-here",
"completed": true,
"completedAt": "2026-04-23T09:45:00.000Z"
}[!NOTE] If the task has not been completed yet,
completedwill befalseandcompletedAtwill benull.
Field Value References
Status Values
These are the standardized status values used in the Devora dashboard:
| Value | Description | UI Color |
|---|---|---|
New | Newly discovered project (default) | Purple |
Potential | Potential airdrop opportunity | Yellow |
Confirmed | Confirmed airdrop | Orange |
Verification Check | Under verification or eligibility check | Purple |
Ended | Airdrop has ended | Gray |
[!TIP] The
statusfield accepts any string value. Using the standardized values above ensures consistency and better filtering in the UI.
Task Types
| Value | Description |
|---|---|
Social | Social media tasks (Twitter, Discord, etc.) |
Testnet | Testnet interaction tasks |
Mainnet | Mainnet interaction tasks |
Quiz | Quiz or knowledge-based tasks |
Trading | Trading or swap tasks |
Staking | Staking or liquidity provision tasks |
Waitlist | Waitlist registration only |
Mixed | Multiple types of tasks |
Reward Types
| Value | Description |
|---|---|
Airdrop | Token airdrop reward |
Points | Points-based reward system |
Waitlist | Waitlist spot (no guaranteed reward) |
NFT | NFT reward |
Token | Direct token distribution |
Whitelist | Whitelist access |
Unknown | Reward type not yet determined |
Project Types
| Value | Description |
|---|---|
DeFi | Decentralized Finance |
Infra | Infrastructure / Protocol |
AI | Artificial Intelligence |
Gaming | Gaming / GameFi |
NFT | NFT Platform / Marketplace |
Social | Social Network / SocialFi |
ZK | Zero-Knowledge Technology |
Layer 1 | Layer 1 Blockchain |
Layer 2 | Layer 2 Scaling Solution |
Bridge | Cross-chain Bridge |
DEX | Decentralized Exchange |
Lending | Lending / Borrowing Protocol |
Wallet | Wallet / Account Abstraction |
Other | Other categories |
Error Handling
| Status | Message | Description |
|---|---|---|
401 | Unauthorized | Invalid or missing API Key. |
403 | Forbidden | You are trying to modify a project you don't own. |
404 | Not Found | The project ID provided does not exist. |
400 | Bad Request | Missing required fields (e.g., name, title). |
500 | Internal Server Error | Server-side error occurred. |
UI Sync
The Airdrop Center dashboard in Devora provides:
- Project Grid/List — visual cards or table view with status badges
- Status Timeline —
statusDatetracks when each status change occurred - Task Management — add, edit, and delete tasks with step-by-step instructions
- Link Icons —
web,x,github,telegram,discordlinks render as clickable icons - Visibility Control — ULTRA users can publish projects publicly with approval workflow
- Statistics Cards — total projects, confirmed count, total tasks, average raise
- Filters — filter by status, project type, visibility, and search by name
[!NOTE] Projects created via the API appear instantly in the dashboard. The
publishStatusfield controls public visibility:NONE(private),PENDING(awaiting approval),APPROVED(public), orREJECTED.