Contact

Let's talk.

Book a 30-minute demo, apply to the design partner program, or send a question. We answer within one business day — usually faster.

Send a message

Tell us what you're trying to achieve. We tailor the demo to your stack.

Max 4000 characters. Plain text — no attachments here, email contact@isops.ai for files.

We reply within one business day. By submitting, you agree to our privacy policy.

Direct channels

Prefer to skip the form? Reach the team directly.

Book a demo

30 minutes, real AWS account. Email us to schedule.

Vulnerability reports

security@isops.ai — see Security for our disclosure policy.

Response time

Within 1 business day, usually within a few hours during EU/US working hours.

const endpoint = window.ISOPS_CONTACT_ENDPOINT || form.getAttribute('action') || ''; function showToast(msg, ok) { toast.textContent = msg; toast.classList.remove('ok', 'err', 'show'); toast.classList.add(ok ? 'ok' : 'err', 'show'); } function mailtoFallback(data) { // Build a pre-filled mailto: so the user can still send via their client. const subject = encodeURIComponent('isops.ai contact — ' + (data.reason || 'general')); const body = encodeURIComponent( 'Name: ' + (data.name || '') + '\n' + 'Company: ' + (data.company || '') + '\n' + 'Email: ' + (data.email || '') + '\n' + 'Reason: ' + (data.reason || '') + '\n\n' + (data.message || '') ); window.location.href = 'mailto:contact@isops.ai?subject=' + subject + '&body=' + body; } form.addEventListener('submit', async function (e) { e.preventDefault(); // Honeypot — bots fill hidden fields. if (form.website.value) { showToast('Something went wrong. Please email contact@isops.ai directly.', false); return; } const data = { name: form.name.value.trim(), email: form.email.value.trim(), company: form.company.value.trim(), reason: form.reason.value, message: form.message.value.trim(), website: '', // honeypot, always blank for real submissions }; if (!data.name || !data.email || !data.message) { showToast('Please fill in your name, email, and a short message.', false); return; } if (data.message.length > 4000) { showToast('Message is too long (max 4000 characters).', false); return; } if (!endpoint) { mailtoFallback(data); showToast('Opening your email client to send the message to contact@isops.ai…', true); return; } btn.disabled = true; btnLabel.textContent = 'Sending…'; try { const resp = await fetch(endpoint, { method: 'POST', headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' }, body: JSON.stringify(data), // Don't send cookies cross-origin (we don't need them and it // keeps the request "simple" for CORS preflight). credentials: 'omit', }); let payload = {}; try { payload = await resp.json(); } catch (_) { /* tolerate empty body */ } if (resp.ok && payload && payload.ok !== false) { showToast('Message sent. We\'ll reply within one business day.', true); form.reset(); } else if (resp.status === 429) { showToast('Too many submissions from your network — please wait a minute and retry.', false); } else if (resp.status === 403) { showToast('Request blocked. Opening your email client as a fallback…', false); mailtoFallback(data); } else { const detail = (payload && payload.detail) || 'Couldn\'t send right now — opening your email client as a fallback.'; showToast(detail, false); if (resp.status >= 500 || resp.status === 0) mailtoFallback(data); } } catch (_err) { showToast('Couldn\'t reach the server — opening your email client as a fallback.', false); mailtoFallback(data); } finally { btn.disabled = false; btnLabel.textContent = 'Send message'; } }); })();