Developer Guide
Step-by-step guide to building on Omen — from zero to shipping
Contents
Overview — What You Can Build
Omen is a platform for kids and creators. As a developer, you can build apps and games that plug into the Omen ecosystem. Your app gets access to:
- User accounts — sign users in with "Login with Omen" (OAuth2)
- User data storage — store per-user and per-org JSON data on Omen's servers
- Items & badges — issue collectible items and badges to users
- Notifications — send push and in-app notifications
- Payments — sell products and subscriptions via Stripe (money goes directly to you)
- Avatar editor — let users customize avatars using your art assets
- Webhooks — receive real-time events about item transfers, purchases, etc.
- Family safety — child accounts have parental approval built in
Getting Started
You need an Omen account with developer access to use the Developer Portal.
1Create an Omen account at omen.dog. Sign up with email or wallet.
2Get developer access. Developer access is currently invite-only. Contact the Omen team or request access through your account settings. Once granted, you'll see the Developer Portal in your Omen menu.
3Open the Developer Portal at /pound/developer. This is your home base for managing organizations, apps, and tools.
Create Your Organization & App
Every app on Omen belongs to an organization. Organizations group apps together and control shared settings like badges and PFP projects.
1Create an Organization. In the Developer Portal, click "Create Organization". Give it a name (you can change it later). This represents your studio, team, or project.
2Create an App. Click "Create App". The app is automatically linked to your first organization. You can change which org it belongs to in the app settings.
3Note your credentials. On the app detail page, you'll see:
- Client ID — public identifier, safe to use in frontend code
- Client Secret — keep this on your server, never expose it publicly
4Add Redirect URIs. These are the URLs Omen will redirect users back to after login. Add at least one (e.g. https://myapp.com/callback). For local development, you can use http://localhost:3000/callback.
Login with Omen (OAuth2)
"Login with Omen" lets your users sign into your app using their Omen account. It uses standard OAuth2 authorization code flow.
How it works
- Redirect the user to Omen's authorize page:
https://omen.dog/api/authorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code
- User logs in & approves. Omen redirects them back to your redirect URI with a
codeparameter. - Exchange the code for tokens on your server:
POST https://omen.dog/api/token Content-Type: application/json { "grant_type": "authorization_code", "code": "THE_CODE", "client_id": "YOUR_CLIENT_ID", "client_secret": "YOUR_CLIENT_SECRET", "redirect_uri": "YOUR_REDIRECT_URI" } - Use the access token to call Omen APIs on behalf of the user:
GET https://omen.dog/api/v1/profile Authorization: Bearer ACCESS_TOKEN
Store & Retrieve User Data
Store arbitrary JSON data per user in your app. Useful for game saves, preferences, progress, or anything else. Data is scoped to your app — other apps can't see it.
// Read user's data for your app (OAuth2 Bearer auth)
GET /api/v1/app-data
→ { "level": 5, "coins": 120, ... }
// Write user's data (merges with existing)
POST /api/v1/app-data
{ "level": 6, "coins": 200 }
// Server-to-server: read/write any user's data
GET /api/v1/apps/{appId}/users/{userId}/data
POST /api/v1/apps/{appId}/users/{userId}/dataThere's also Org Data for data shared across all apps in your organization:
GET /api/v1/org-data POST /api/v1/org-data
Items & Badges
Issue collectible items and badges to users. Items appear in the user's inventory on their Omen profile.
Setup
- Create an Item Template via the API. Templates define what the item looks like, its rarity, whether it's transferable, etc.
POST /api/v1/apps/{appId}/item-templates Authorization: Bearer S2S_TOKEN { "type": "collectible", "name": "Gold Trophy", "description": "Awarded for winning the tournament", "imageUrl": "https://cdn.example.com/trophy.png", "rarity": "rare", "maxSupply": 100, "transferable": true } - Issue items to users when they earn them:
POST /api/v1/apps/{appId}/items Authorization: Bearer S2S_TOKEN { "userId": "USER_ID", "templateId": "TEMPLATE_ID" } - Check a user's inventory:
GET /api/v1/apps/{appId}/items?userId=USER_ID
templateId to a checkout product. See the Payments section below.Send Notifications
Send push and in-app notifications to your users.
POST /api/v1/apps/{appId}/notifications/send
Authorization: Bearer S2S_TOKEN
{
"userId": "USER_ID",
"title": "You won!",
"body": "You placed first in this week's tournament",
"actionUrl": "https://myapp.com/results",
"category": "achievement"
}Notifications show up in the user's notification center on Omen and as push notifications if they've enabled them. Rate limits apply (check the API reference for details).
Webhooks
Receive real-time HTTP callbacks when things happen — items transferred, purchases completed, subscriptions renewed.
Setup
- Register a webhook endpoint:
POST /api/v1/apps/{appId}/webhooks Authorization: Bearer S2S_TOKEN { "url": "https://myapp.com/webhooks/omen", "events": ["item.issued", "checkout.completed", "subscription.created"] }You'll receive a
secretin the response — save it to verify incoming webhooks. - Handle incoming webhooks. Omen sends POST requests with:
X-Omen-Signatureheader — HMAC-SHA256 of the body using your secretX-Omen-Eventheader — the event type- JSON body with the event payload
Available events
item.issued — Item issued to a user item.revoked — Item revoked item.expired — Item expired (TTL) item.transferred — Item transferred between users redeem.completed — Redeem code used checkout.completed — One-time payment completed checkout.cancelled — Checkout session expired checkout.denied — Parent denied child purchase subscription.created — New subscription activated subscription.renewed — Subscription renewed subscription.cancelled — Set to cancel at period end subscription.expired — Subscription ended subscription.payment_failed — Payment failed
Accept Payments (Stripe Connect)
Sell products and subscriptions to your users. Payments go directly to your Stripe account — Omen takes 0% platform fee. You connect your own Stripe account, Stripe handles all compliance and payouts.
Step 1: Connect your Stripe account
- Open the Developer Portal and go to your app
- Scroll to the Payments section
- Click "Connect Stripe Account"
- You'll be redirected to Stripe to create or link an account
- Complete the Stripe onboarding (business info, bank account, etc.)
- When you're done, you'll be redirected back to the Developer Portal
- The Payments section will show Connected with your Stripe account ID
Step 2: Create products
Products are created via the server-to-server API. Each product is synced to your connected Stripe account automatically.
One-time purchase (e.g. a premium skin, level pack):
POST /api/v1/apps/{appId}/products
Authorization: Bearer S2S_TOKEN
{
"name": "Premium Skin Pack",
"type": "one_time",
"priceCents": 499,
"templateId": "clx..." // optional: auto-issue an item on purchase
}Subscription (e.g. monthly pass):
POST /api/v1/apps/{appId}/products
Authorization: Bearer S2S_TOKEN
{
"name": "Pro Monthly",
"type": "subscription",
"priceCents": 999,
"billingInterval": "month",
"trialDays": 7
}Step 3: Trigger checkout from your app
When a user clicks "Buy" in your app, create a checkout session using their OAuth2 token. The user will be redirected to Stripe's checkout page.
// Your app's frontend
const res = await fetch('https://omen.dog/api/v1/checkout/sessions', {
method: 'POST',
headers: {
'Authorization': 'Bearer USER_ACCESS_TOKEN',
'Content-Type': 'application/json'
},
body: JSON.stringify({
productId: 'PRODUCT_ID',
redirectUrl: 'https://myapp.com/store'
})
});
const { checkoutUrl, status, requiresParentApproval } = await res.json();
if (requiresParentApproval) {
// Show "waiting for parent approval" message
// Parent gets notified via email + in-app notification
} else {
// Redirect user to Stripe checkout
window.location.href = checkoutUrl;
}
// After payment, user is redirected back to:
// https://myapp.com/store?checkout=success
// or
// https://myapp.com/store?checkout=cancelStep 4: Handle the result
After payment, Omen fires a webhook to your server. Set up a webhook endpoint (see Webhooks above) and listen for these events:
checkout.completed— payment succeeded, unlock the contentsubscription.created— subscription startedsubscription.renewed— subscription auto-renewedsubscription.expired— subscription ended, revoke access
templateId on your product, Omen automatically issues the linked item to the buyer when payment completes. No webhook handling needed for simple unlocks.Managing subscriptions
Users can cancel and resume their subscriptions through the Omen API:
// List user's subscriptions to your app GET /api/v1/checkout/subscriptions Authorization: Bearer USER_ACCESS_TOKEN // Cancel at period end POST /api/v1/checkout/subscriptions?subscriptionId=xxx&action=cancel // Resume (if still in active period) POST /api/v1/checkout/subscriptions?subscriptionId=xxx&action=resume
Refunds and disputes are managed through your Stripe Dashboard directly.
Avatar Editor
The Avatar Editor lets users customize avatars using art assets you provide. You host an API that serves your art layers, and Omen renders the editor UI.
Setup
- Build an avatar API server that serves your art assets. See the full Avatar Editor API spec for the required endpoints.
- Add a PFP Project to your app. In the Developer Portal, open your app, scroll to PFP Projects, and click "Add PFP Project". Enter your API's base URL and an API key if your server requires one.
- Test it by clicking "Open Editor" next to your project. The editor will load your art assets and let you compose avatars.
When a user saves their avatar, Omen stores the composed image and the selection data. Your app can read the user's avatar via the profile API.
Family & Child Accounts
Omen supports child accounts managed by a parent. If your app's users include children, here's what you need to know:
- Purchases require parent approval. When a child tries to buy something, the checkout session enters
awaiting_parent_approvalstate. The parent gets an email and in-app notification. Your app should show a "waiting for parent" message and poll the session status. - Check if a user is a child via the profile API. The
isChildfield will be1if the user is a child account. - Children log in via QR code generated by the parent — they don't use email or wallet login. From your app's perspective, the OAuth flow is the same.
- Notifications to parents: When you send notifications to a child user, the parent is also notified automatically for certain event types.
You don't need to build any special family logic — Omen handles it. Just be aware that checkout flows may pause for parent approval, and design your UI to handle that gracefully.
Publishing Creations
Omen Publish lets you deploy web games, apps, and interactive content to Omen user profiles. Published creations are hosted on Omen's CDN and accessible via the user's profile page.
Setup
- Install the CLI:
npm install -g omen-publish
- Build your project as a static site (HTML/CSS/JS).
- Publish:
omen-publish ./dist
The CLI will scan your files, run security checks, and deploy to Omen.
For more details, see the Publish Pipeline docs in the API reference.
Support Tickets
Users can submit support tickets about your app through Omen. View and manage tickets in the Developer Portal under Tickets.
Tickets are visible at /pound/developer/tickets.
Full API Reference
This guide covers the setup flow and common patterns. For complete endpoint documentation with all parameters, response shapes, and edge cases, see the full API reference.
Additional references:
- Login with Omen Kit — button assets & quick-start
- Avatar Editor API Spec — endpoint contract for PFP servers
- API Reference — every endpoint, every field