IntelliPortal

Introduction

  • Overview
  • Getting Started

Platform

  • Send API
  • Webhooks
  • Authentication

Guides

  • Embedded Signup
  • WhatsApp Limits
  • Error Codes

Resources

  • OpenAPI Spec
  • Postman Collection
GuidesAPI ReferenceChangelog
⌘K

© 2026 IntelliPortal Inc. All rights reserved.

Privacy PolicyStatusContact Support

On This Page

  • Introduction
  • Quick Start
  • Next Steps
  • Prerequisites

Need help?

Can't find what you're looking for? Our engineers are here to help.

Chat with support
Docs/Authentication

Authentication

Scoped API keys with Bearer token auth. SHA-256 hashed and never stored in plaintext.

API Key Authentication

All API requests must include your API key in the Authorization header:

HTTP Header
Authorization: Bearer ik_your_api_key_here

API keys are prefixed with ik_ for identification. Keys are hashed and never stored in plaintext.

Scopes

ScopeDescription
clients:readList and view client details
clients:writeOnboard new clients
messages:sendSend messages via the API
webhooks:readView webhook config and logs
webhooks:writeUpdate webhook configuration

Rate Limits

TierRequests/minWebhooks/monthClients
Free6010,0003
Pro300100,00025
Enterprise1,000UnlimitedUnlimited

Rate Limit Headers

Every API response includes rate limit headers so you can track your usage programmatically:

Response Headers
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 247
X-RateLimit-Reset: 1741824000
Retry-After: 60          # only present on 429 responses
HeaderDescription
X-RateLimit-LimitMaximum requests allowed per minute for your tier
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the rate limit window resets
Retry-AfterSeconds to wait before retrying (only on 429 Too Many Requests)

Reading rate limits in Node.js

JavaScript
const res = await fetch("https://api.intelliportal.io/v1/messages/send", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.INTELLI_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify(payload),
});

const remaining = parseInt(res.headers.get("X-RateLimit-Remaining") ?? "0");
const resetAt = parseInt(res.headers.get("X-RateLimit-Reset") ?? "0");

if (res.status === 429) {
  const retryAfter = parseInt(res.headers.get("Retry-After") ?? "60");
  console.log(`Rate limited. Retry in ${retryAfter}s`);
  await new Promise((r) => setTimeout(r, retryAfter * 1000));
}

console.log(`${remaining} requests remaining. Resets at ${new Date(resetAt * 1000)}`);

Reading rate limits in Python

Python
import requests, time

res = requests.post(
    "https://api.intelliportal.io/v1/messages/send",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
    },
    json=payload,
)

remaining = int(res.headers.get("X-RateLimit-Remaining", 0))
reset_at = int(res.headers.get("X-RateLimit-Reset", 0))

if res.status_code == 429:
    retry_after = int(res.headers.get("Retry-After", 60))
    print(f"Rate limited. Retrying in {retry_after}s")
    time.sleep(retry_after)

print(f"{remaining} requests remaining")

Idempotency Keys

To safely retry requests on network failures without sending duplicate messages, include an Idempotency-Key header with a unique value (we recommend a UUID v4).

HTTP
POST https://api.intelliportal.io/v1/messages/send
Authorization: Bearer ik_live_your_key
Idempotency-Key: 550e8400-e29b-41d4-a716-446655440000
Content-Type: application/json

How it works: Idempotency keys are valid for 24 hours. If you send the same key within that window, IntelliPortal returns the cached response from the original request without re-sending the message. After 24 hours, the key expires and can be reused.

Node.js example

JavaScript
import { randomUUID } from "crypto";

const idempotencyKey = randomUUID();

const res = await fetch("https://api.intelliportal.io/v1/messages/send", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.INTELLI_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": idempotencyKey,
  },
  body: JSON.stringify({
    client_ref: "partner-123",
    to: "+1234567890",
    type: "text",
    text: { body: "Order confirmed!" },
  }),
});

Python example

Python
import uuid, requests

res = requests.post(
    "https://api.intelliportal.io/v1/messages/send",
    headers={
        "Authorization": f"Bearer {api_key}",
        "Content-Type": "application/json",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={
        "client_ref": "partner-123",
        "to": "+1234567890",
        "type": "text",
        "text": {"body": "Order confirmed!"},
    },
)