Comprehensive, fully-typed Node.js/TypeScript library for the SuperOps.ai GraphQL API.
- Complete API coverage - All SuperOps.ai queries and mutations
- Strong TypeScript types - Full type definitions for all resources
- GraphQL abstraction - Method-based access without writing raw GraphQL
- Automatic pagination - Async iterators for page-based pagination
- Rate limit handling - Built-in request throttling (800 req/min)
- Multi-region support - US and EU endpoints for MSP and IT verticals
- Zero live API testing - Full test suite with mocked GraphQL responses
npm install @wyre-ai/node-superopsimport{SuperOpsClient}from'@wyre-ai/node-superops';constclient=newSuperOpsClient({apiToken: process.env.SUPEROPS_API_TOKEN!,customerSubDomain: process.env.SUPEROPS_SUBDOMAIN!,region: 'us',// 'us' | 'eu'vertical: 'msp',// 'msp' | 'it'});// Get an assetconstasset=awaitclient.assets.get('asset-123');// List tickets with paginationconsttickets=awaitclient.tickets.list({page: 1,pageSize: 50,});console.log(tickets.items,tickets.meta.totalCount);// Auto-paginate through all clientsforawait(constclientRecordofclient.clients.listAll()){console.log(clientRecord.name);}constclient=newSuperOpsClient({// RequiredapiToken: 'your-api-token',customerSubDomain: 'your-company',// Optional - Region/Vertical (defaults to US MSP)region: 'us',// 'us' | 'eu'vertical: 'msp',// 'msp' | 'it'// OR explicit endpointendpoint: 'https://api.superops.ai/msp',// Optional settingstimeout: 30000,// Request timeout in ms (default: 30000)dates: 'date',// 'date' (Date objects) | 'string' (ISO strings)// Rate limiting configurationrateLimiter: {enabled: true,// Enable rate limiting (default: true)maxRequests: 800,// Max requests per window (default: 800)windowMs: 60000,// Window duration in ms (default: 60000)throttleThreshold: 0.8,// Throttle at 80% (default: 0.8)retryAfterMs: 5000,// Retry delay (default: 5000)maxRetries: 3,// Max retries (default: 3)},});| Region | Vertical | Endpoint |
|---|---|---|
us | msp | https://api.superops.ai/msp |
us | it | https://api.superops.ai/it |
eu | msp | https://euapi.superops.ai/msp |
eu | it | https://euapi.superops.ai/it |
// Get single assetconstasset=awaitclient.assets.get('asset-123');console.log(asset.name,asset.hostName,asset.status);// List assets, one page at a timeconstresult=awaitclient.assets.list({page: 1,pageSize: 50});console.log(result.items,result.meta.totalCount);// Auto-paginate all assetsforawait(constassetofclient.assets.listAll()){console.log(asset.name);}// Update an asset's custom fieldsconstupdated=awaitclient.assets.update('asset-123',{customFields: {location: 'HQ'},});// Get single ticketconstticket=awaitclient.tickets.get('ticket-001');// List tickets with paginationconstresult=awaitclient.tickets.list({page: 1,pageSize: 50,});console.log(result.items,result.meta.totalCount);// Create ticketconstnewTicket=awaitclient.tickets.create({subject: 'Server not responding',description: 'Production server is unresponsive',clientId: 'client-456',priority: 'CRITICAL',});// Update ticketawaitclient.tickets.update('ticket-001',{priority: 'HIGH',});// Get single clientconstclientRecord=awaitclient.clients.get('client-456');// List clientsconstresult=awaitclient.clients.list({page: 1,pageSize: 50,});console.log(result.items,result.meta.totalCount);// Create clientconstnewClient=awaitclient.clients.create({name: 'New Company',stage: 'PROSPECT',});// Update clientawaitclient.clients.update('client-456',{name: 'Updated Company Name',});// Get siteconstsite=awaitclient.sites.get('site-789');// List sitesconstsites=awaitclient.sites.list({page: 1,pageSize: 50,});console.log(sites.items,sites.meta.totalCount);// Create siteconstnewSite=awaitclient.sites.create({name: 'Branch Office',line1: '456 Oak Ave',city: 'Othertown',stateCode: 'CA',postalCode: '54321',clientId: 'client-456',});// Update siteawaitclient.sites.update('site-789',{name: 'Updated Branch Name',});// List alertsconstalerts=awaitclient.alerts.list({page: 1,pageSize: 50,});console.log(alerts.items,alerts.meta.totalCount);// List alerts for a specific assetconstassetAlerts=awaitclient.alerts.listByAsset('asset-123',{page: 1,pageSize: 50,});// Create alertconstnewAlert=awaitclient.alerts.create({message: 'Disk Space Low',description: 'Drive C: is at 95% capacity',severity: 'WARNING',assetId: 'asset-123',});// Resolve alertsawaitclient.alerts.resolve({alertIds: ['alert-001'],resolutionNote: 'Issue resolved',});// Get a KB item (article or collection)constitem=awaitclient.knowledgeBase.get('item-123');// List KB itemsconstitems=awaitclient.knowledgeBase.list({page: 1,pageSize: 50,});console.log(items.items,items.meta.totalCount);// Create articleconstnewArticle=awaitclient.knowledgeBase.createArticle({name: 'How to Reset Passwords',description: 'Step-by-step password reset guide',parentId: 'collection-456',});// Create collectionconstnewCollection=awaitclient.knowledgeBase.createCollection({name: 'How-To Guides',description: 'Step-by-step guides',});// Update articleawaitclient.knowledgeBase.updateArticle({itemId: 'article-123',name: 'Updated Password Reset Guide',description: 'Updated password reset steps',});// Delete articleawaitclient.knowledgeBase.deleteArticle({itemId: 'article-123',});// Get contractconstcontract=awaitclient.contracts.get('contract-123');// List contractsconstcontracts=awaitclient.contracts.list({page: 1,pageSize: 50,});console.log(contracts.items,contracts.meta.totalCount);// Create contractconstnewContract=awaitclient.contracts.create({clientId: 'client-456',name: 'Annual Support Contract',startDate: '2026-01-01',endDate: '2026-12-31',});// Update contractawaitclient.contracts.update('contract-123',{name: 'Updated Contract Name',});// List techniciansconsttechnicians=awaitclient.technicians.list({page: 1,pageSize: 50,});console.log(technicians.items,technicians.meta.totalCount);// Create technicianconstnewTechnician=awaitclient.technicians.create({firstName: 'John',lastName: 'Doe',email: 'john.doe@company.com',role: 'Technician',});// Update technicianawaitclient.technicians.update('tech-001',{phoneNumber: '+1-555-0123',});SuperOps.ai uses page-based pagination. The library provides async iterators for automatic pagination:
// Auto-paginate all resultsforawait(constassetofclient.assets.listAll()){console.log(asset.name);}// Collect all into an arrayconstallAssets=awaitclient.assets.listAll().toArray();// Custom page size for auto-paginationforawait(constticketofclient.tickets.listAll({pageSize: 100})){console.log(ticket.subject);}The library provides typed error classes:
import{SuperOpsError,SuperOpsAuthenticationError,SuperOpsNotFoundError,SuperOpsValidationError,SuperOpsRateLimitError,SuperOpsServerError,}from'@wyre-ai/node-superops';try{awaitclient.assets.get('non-existent');}catch(error){if(errorinstanceofSuperOpsNotFoundError){console.log('Asset not found');}elseif(errorinstanceofSuperOpsAuthenticationError){console.log('Check your API token');}elseif(errorinstanceofSuperOpsValidationError){console.log('Validation errors:',error.validationErrors);}elseif(errorinstanceofSuperOpsRateLimitError){console.log('Rate limited, retry after:',error.retryAfter);}}The library automatically handles SuperOps.ai's 800 requests per minute limit:
- Tracks requests in a rolling window
- Throttles when approaching the limit
- Automatically retries on rate limit errors
- Configurable thresholds and delays
// Check rate limit statusconststatus=client.getRateLimitStatus();console.log(`Remaining: ${status.remaining}/${status.maxRequests}`);console.log(`Throttling: ${status.isThrottling}`);Apache-2.0
Aaron Sachs / WYRE Technology