Skip to main content
The Signa API uses a credit-based system for simple, transparent pricing and rate limiting.

How Credits Work

Instead of complex requests-per-minute limits, each API operation costs a certain number of credits:
OperationCreditsExample
Text search1GET /v1/trademarks/search?q=apple
Image search3POST /v1/trademarks/search/image
Fast conflict check2POST /v1/analysis/check
Deep clearance analysis5POST /v1/analysis/clearance
Class classification1POST /v1/analysis/classify
Class suggestions1POST /v1/classifications/search
Trademark lookup1GET /v1/trademarks/{jurisdiction}/{id}
Owner search1GET /v1/owners/search
List offices0GET /v1/offices
List classes0GET /v1/classifications
List jurisdictions0GET /v1/jurisdictions
Health check0GET /v1/health

Credit Tiers

PlanMonthly CreditsOverage RateMonitoring
Starter1,000$0.01/credit2 monitors
Growth10,000$0.008/credit10 monitors
Pro50,000$0.006/credit50 monitors
EnterpriseCustomCustomUnlimited
All plans include:
  • Text and image search
  • AI-powered analysis (fast check, deep clearance, classification)
  • Webhook monitoring
  • Full API access
  • Email support

Rate Limit Headers

Every API response includes credit information in the headers:
X-RateLimit-Limit: 10000
X-RateLimit-Remaining: 9545
X-RateLimit-Reset: 1730851200
X-RateLimit-Cost: 5
HeaderDescription
X-RateLimit-LimitTotal credits available in your plan
X-RateLimit-RemainingCredits remaining this billing period
X-RateLimit-ResetUnix timestamp when credits reset
X-RateLimit-CostCredits consumed by this request

Handling Rate Limits

When you exceed your credit limit, you’ll receive a 429 Too Many Requests response:
{
  "error": {
    "code": "quota_exceeded",
    "message": "Monthly credit quota exceeded. Resets at 2025-11-01T00:00:00Z.",
    "request_id": "req_abc123xyz",
    "details": {
      "credits_used": 10000,
      "credits_limit": 10000,
      "reset_at": "2025-11-01T00:00:00Z"
    }
  }
}

Best Practices

Track the X-RateLimit-Remaining header to monitor credit usage in real-time.
const response = await fetch(url, options);
const remaining = response.headers.get('X-RateLimit-Remaining');

if (remaining < 100) {
  console.warn(`Low on credits: ${remaining} remaining`);
}
Use fast checks when possible, deep analysis when needed:
  • Fast conflict check (2 credits) - Quick trademark conflict detection in 300-800ms
  • Deep clearance analysis (5 credits) - Comprehensive AI analysis with detailed recommendations
  • Image search (3 credits) - Use only for logo similarity checks
// Good: Start with fast check
const quickCheck = await fastCheck(name); // 2 credits, 300-800ms

// Only run deep analysis if potential conflicts found
if (quickCheck.conflicts.length > 0) {
  const deepAnalysis = await clearanceAnalysis(name, business); // 5 credits, 3-5s
}
Trademark data doesn’t change frequently. Cache search results to reduce API calls.
const cache = new Map();
const CACHE_TTL = 24 * 60 * 60 * 1000; // 24 hours

async function searchWithCache(query) {
  const cacheKey = `search:${query}`;
  const cached = cache.get(cacheKey);

  if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
    return cached.data;
  }

  const data = await searchTrademark(query);
  cache.set(cacheKey, { data, timestamp: Date.now() });

  return data;
}
Filter by jurisdiction, classes, and status to get more relevant results:
// Inefficient: Search all jurisdictions, all classes
const results = await search('tech'); // Returns thousands of results

// Efficient: Filter to relevant scope
const results = await search('tech', {
  jurisdiction: 'US',
  classes: '9,42',
  status: 'live_registered'
}); // Returns focused results, same 1 credit
Note: Better filtering improves result quality without consuming extra credits.
For monitoring use cases, webhooks are more efficient than polling:
// Bad: Polling wastes credits
setInterval(async () => {
  const results = await search('competitor'); // 1 credit every 5 minutes
}, 5 * 60 * 1000); // = 288 credits/day

// Good: Set up a monitor with webhooks (monthly subscription, no credits)
await createMonitor({
  watches: [{ type: 'query', value: 'competitor' }],
  webhook_url: 'https://myapp.com/webhooks'
});
If you hit a rate limit, wait before retrying:
async function fetchWithRetry(url, options, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    const response = await fetch(url, options);

    if (response.status !== 429) {
      return response;
    }

    const resetTime = response.headers.get('X-RateLimit-Reset');
    const waitTime = Math.min(
      (2 ** i) * 1000,
      resetTime * 1000 - Date.now()
    );

    console.log(`Rate limited. Waiting ${waitTime}ms...`);
    await new Promise(resolve => setTimeout(resolve, waitTime));
  }

  throw new Error('Max retries exceeded');
}
Filter by office, classes, and status to get more relevant results:
// Inefficient: Search all offices, all classes
const results = await search('tech'); // Returns thousands of results

// Efficient: Filter to relevant scope
const results = await search('tech', {
  office: 'USPTO',
  classes: '9,42',
  status: 'live_registered'
}); // Returns focused results, same 1 credit

Credit Usage Examples

// Typical brand clearance workflow
const search = await searchTrademarks(name);                    // 1 credit
const fastCheck = await fastConflictCheck(name);                // 2 credits
const deepAnalysis = await deepClearanceAnalysis(name, business); // 5 credits

// Total: 8 credits per brand check

Scenario 2: E-commerce Seller Tool (Etsy/Amazon)

// Check 50 product listings with fast conflict detection
const listings = [/* 50 product titles */];

for (const product of listings) {
  const check = await fastConflictCheck(product.title); // 2 credits each

  // Only run deep analysis on high-risk products
  if (check.risk_level === 'HIGH' || check.risk_level === 'MEDIUM') {
    await deepClearanceAnalysis(product.title, product.description); // 5 credits
  }
}

// Total: (50 * 2) + (high_risk_count * 5) credits

Scenario 3: Logo Similarity Check

// Upload logo and search for similar designs
const imageResults = await imageSearch(logoFile); // 3 credits

// Get details on matches
for (const match of imageResults.slice(0, 5)) {
  await getTrademark(match.id); // 1 credit each
}

// Total: 3 + 5 = 8 credits

Monitoring Costs

Monitors are priced separately from credits:
PlanMonitors IncludedAdditional Monitors
Starter2$10/month each
Growth10$5/month each
Pro50$2/month each
EnterpriseUnlimitedIncluded
Monitors do not consume credits - they run in the background and send webhooks when matches are found.

Overage Handling

When you exceed your monthly credits:
  1. Auto-upgrade (recommended): Automatically purchase overage credits
  2. Hard limit: API returns 429 errors until next billing cycle
  3. Prepurchase: Buy credit packs in advance
Set your preference in the dashboard.

View Your Usage

Check your current usage anytime:
curl https://api.signa.so/v1/usage \
  -H "Authorization: Bearer YOUR_API_KEY"
{
  "period": {
    "start": "2025-10-01T00:00:00Z",
    "end": "2025-11-01T00:00:00Z"
  },
  "credits": {
    "limit": 10000,
    "used": 4555,
    "remaining": 5445,
    "overage": 0
  },
  "usage_by_operation": {
    "text_search": 4000,
    "fast_conflict_check": 450,
    "deep_clearance_analysis": 91,
    "image_search": 12,
    "class_classification": 2
  },
  "monitors": {
    "active": 7,
    "limit": 10
  }
}
Or view detailed analytics in your dashboard.

Upgrade Your Plan

Need more credits? Upgrade anytime:

Enterprise Plans

For high-volume usage, contact sales for:
  • Custom credit allocations (100K+ credits/month)
  • Dedicated infrastructure with guaranteed performance
  • Volume discounts on credits
  • Custom rate limits and SLAs
  • Priority support with dedicated account manager
  • Bulk data exports and custom integrations
Contact Sales →

Fair Use Policy

We expect reasonable use of the API:
  • Allowed: Production applications, integrations, research
  • Allowed: Caching results, batch processing
  • Allowed: Reselling value-added services built on our API
  • Not Allowed: Scraping our entire database
  • Not Allowed: Bypassing credit limits with multiple accounts
  • Not Allowed: Reselling raw API access without adding value
Violation may result in account suspension. See Terms of Service.

FAQs

No, unused credits expire at the end of each billing period. Prepurchased credit packs do not expire.
You’ll immediately get access to your new credit limit. Previous usage counts toward the new limit.
Yes! Buy credit packs anytime in the dashboard. They never expire and can be used alongside your monthly allocation.
No. Only successful responses (HTTP 200) consume credits. Errors (4xx, 5xx) are free.
Yes! Webhook deliveries don’t consume credits. Monitor subscriptions are priced separately.