Developers
All calls are POST with a JSON body to https://app.dwalliance.com/MODULE/. GET a module with no body for its live help. The full guide is at app.dwalliance.com.
1. Create an account
// step 1: a confirmation code is emailed to you
await fetch('https://app.dwalliance.com/account_setup/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: 'you@example.com' })
}).then(r => r.json()); // returns ok and id
// step 2: your brand code is emailed to you
await fetch('https://app.dwalliance.com/account_setup/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ id: 'SETUP_ID', confirmation_id: 'xxxxxx',
first_name: 'Ada', last_name: 'Lovelace', company_name: 'Example LLC' })
}).then(r => r.json()); // returns person_id, company_id, relation_id
2. Start a session
await fetch('https://app.dwalliance.com/session/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: 'you@example.com', brand: 'BRANDCODE' })
}).then(r => r.json()); // {"ok":true,"mailed":true}; the session id is emailed
3. Upload a page
await fetch('https://app.dwalliance.com/files/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'create', session: 'SESSION_ID',
file_name: 'index.html', file_path: '', file_type: 'HTML',
public_private: 'PUBLIC', file_data: btoa('<h1>Hello</h1>') })
}).then(r => r.json()); // returns id
// open https://app.dwalliance.com/BRANDCODE/index.html
Keep your navigation in one PUBLIC menu.json, a list of {"label","href"} items, and have each page load it. Adding a page is then one update to menu.json.
Do not name a top-level file or folder after a module path (lib, files, session, account_setup, relation, crm, dns, domain, notes, note_files, docs, skill). On your own domain those paths reach the platform, not your files.
4. Add a contact to your CRM
await fetch('https://app.dwalliance.com/crm/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'create_person', session: 'SESSION_ID',
brand: 'BRANDCODE', first_name: 'Grace', last_name: 'Hopper' })
}).then(r => r.json());
5. Claim a domain and add records
// claims example.com and www.example.com
await fetch('https://app.dwalliance.com/domain/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'create', session: 'SESSION_ID',
brand: 'BRANDCODE', company_id: 'COMPANY_ID', domain_name: 'example.com' })
}).then(r => r.json());
// an A record on our nameservers
await fetch('https://app.dwalliance.com/dns/', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ action: 'create', session: 'SESSION_ID',
brand: 'BRANDCODE', company_id: 'COMPANY_ID', domain: 'example.com',
rr_type: '+', rr_fqdn: 'example.com', rr_ip: '64.62.211.170' })
}).then(r => r.json());
Platform names such as app, ns1, ns2, ns3, mail, and store.dwalliance.com, and the dwalliance.com MX and NS records, are protected and refused.
Hand it to your AI
Point your assistant at https://app.dwalliance.com/ and tell it to GET each module's help before calling it. Give it the codes from your email only when it needs them.