Campaigns
Campaigns create public signing links from templates. Anyone with the link can submit a signed copy — no recipient list needed. Ideal for onboarding forms, waivers, and public agreements.
List campaigns
Section titled “List campaigns”GET /api/v1/campaignsQuery parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
cursor | string | — | Pagination cursor |
limit | integer | 25 | Items per page (1–100) |
status | string | — | Filter: active, paused, closed |
search | string | — | Search by name |
Required scope: campaigns.read
curl -X GET "https://app.insigner.co/api/v1/campaigns?status=active" \ -H "Authorization: Bearer isk_YOUR_API_KEY"const res = await fetch( 'https://app.insigner.co/api/v1/campaigns?status=active', { headers: { 'Authorization': 'Bearer isk_YOUR_API_KEY' } });const { data, meta } = await res.json();res = requests.get( "https://app.insigner.co/api/v1/campaigns", headers={"Authorization": "Bearer isk_YOUR_API_KEY"}, params={"status": "active"})Response
{ "data": [ { "id": "cmp_abc123", "name": "Employee Onboarding NDA", "slug": "employee-onboarding-nda-a1b2c3d4", "status": "active", "submissionCount": 142, "maxSubmissions": 500, "collectPhone": true, "requireOtp": false, "expiresAt": null, "brandColor": "#003271", "templateId": "tpl_abc123", "createdAt": "2026-04-01T10:00:00.000Z", "updatedAt": "2026-05-28T14:00:00.000Z" } ], "meta": { "count": 1, "hasMore": false, "nextCursor": null }}Create a campaign
Section titled “Create a campaign”POST /api/v1/campaignsRequired scope: campaigns.create
Request body
| Field | Type | Required | Description |
|---|---|---|---|
templateId | string | ✅ | Template to use for this campaign |
name | string | ✅ | Campaign name (1–200 chars) |
welcomeTitle | string | — | Title shown on the signing page (max 200 chars) |
welcomeMessage | string | — | Message shown on the signing page (max 1000 chars) |
maxSubmissions | integer | — | Maximum number of submissions (min: 1) |
expiresAt | string | — | ISO 8601 expiration date |
collectPhone | boolean | — | Collect phone numbers (default: true) |
requireOtp | boolean | — | Require OTP verification (default: false) |
requireKyc | boolean | — | Require KYC verification (default: false) |
brandColor | string | — | Hex color for branding (e.g. "#003271") |
redirectUrl | string | — | URL to redirect after signing (max 2000 chars) |
curl -X POST https://app.insigner.co/api/v1/campaigns \ -H "Authorization: Bearer isk_YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "templateId": "tpl_abc123", "name": "Employee Onboarding NDA", "welcomeTitle": "Welcome to Acme Corp", "welcomeMessage": "Please review and sign our NDA to get started.", "maxSubmissions": 500, "collectPhone": true, "requireOtp": false, "brandColor": "#003271", "redirectUrl": "https://acme.com/onboarding/complete" }'const res = await fetch('https://app.insigner.co/api/v1/campaigns', { method: 'POST', headers: { 'Authorization': 'Bearer isk_YOUR_API_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ templateId: 'tpl_abc123', name: 'Employee Onboarding NDA', welcomeTitle: 'Welcome to Acme Corp', welcomeMessage: 'Please review and sign our NDA to get started.', maxSubmissions: 500, collectPhone: true, brandColor: '#003271', redirectUrl: 'https://acme.com/onboarding/complete' })});const { data } = await res.json();res = requests.post( "https://app.insigner.co/api/v1/campaigns", headers={"Authorization": "Bearer isk_YOUR_API_KEY"}, json={ "templateId": "tpl_abc123", "name": "Employee Onboarding NDA", "welcomeTitle": "Welcome to Acme Corp", "welcomeMessage": "Please review and sign our NDA to get started.", "maxSubmissions": 500, "collectPhone": True, "brandColor": "#003271", "redirectUrl": "https://acme.com/onboarding/complete" })Response 201 Created
{ "data": { "id": "cmp_abc123", "name": "Employee Onboarding NDA", "slug": "employee-onboarding-nda-a1b2c3d4", "status": "active", "maxSubmissions": 500, "expiresAt": null, "collectPhone": true, "requireOtp": false, "brandColor": "#003271", "redirectUrl": "https://acme.com/onboarding/complete", "templateId": "tpl_abc123", "createdAt": "2026-05-28T12:00:00.000Z" }}Get campaign details
Section titled “Get campaign details”GET /api/v1/campaigns/{id}Required scope: campaigns.read
curl -X GET https://app.insigner.co/api/v1/campaigns/cmp_abc123 \ -H "Authorization: Bearer isk_YOUR_API_KEY"const res = await fetch( 'https://app.insigner.co/api/v1/campaigns/cmp_abc123', { headers: { 'Authorization': 'Bearer isk_YOUR_API_KEY' } });res = requests.get( "https://app.insigner.co/api/v1/campaigns/cmp_abc123", headers={"Authorization": "Bearer isk_YOUR_API_KEY"})Response — Full campaign object with welcomeTitle, welcomeMessage, and all settings.
Update a campaign
Section titled “Update a campaign”PATCH /api/v1/campaigns/{id}Required scope: campaigns.update
All fields from the create body are accepted but optional. You can also change status to "active", "paused", or "closed".
curl -X PATCH https://app.insigner.co/api/v1/campaigns/cmp_abc123 \ -H "Authorization: Bearer isk_YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"status": "paused"}'const res = await fetch( 'https://app.insigner.co/api/v1/campaigns/cmp_abc123', { method: 'PATCH', headers: { 'Authorization': 'Bearer isk_YOUR_API_KEY', 'Content-Type': 'application/json' }, body: JSON.stringify({ status: 'paused' }) });res = requests.patch( "https://app.insigner.co/api/v1/campaigns/cmp_abc123", headers={"Authorization": "Bearer isk_YOUR_API_KEY"}, json={"status": "paused"})Delete a campaign
Section titled “Delete a campaign”DELETE /api/v1/campaigns/{id}Permanently deletes a campaign.
Required scope: campaigns.delete
Response: 204 No Content
List submissions
Section titled “List submissions”GET /api/v1/campaigns/{id}/submissionsReturns documents created via this campaign, including signer details.
Required scope: campaigns.read
Query parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
cursor | string | — | Pagination cursor |
limit | integer | 25 | Items per page (1–100) |
curl -X GET "https://app.insigner.co/api/v1/campaigns/cmp_abc123/submissions?limit=10" \ -H "Authorization: Bearer isk_YOUR_API_KEY"const res = await fetch( 'https://app.insigner.co/api/v1/campaigns/cmp_abc123/submissions?limit=10', { headers: { 'Authorization': 'Bearer isk_YOUR_API_KEY' } });const { data, meta } = await res.json();res = requests.get( "https://app.insigner.co/api/v1/campaigns/cmp_abc123/submissions", headers={"Authorization": "Bearer isk_YOUR_API_KEY"}, params={"limit": 10})Response
{ "data": [ { "id": "cm5x9jkl012", "name": "Standard NDA.pdf", "status": "completed", "completedAt": "2026-05-28T15:30:00.000Z", "createdAt": "2026-05-28T15:20:00.000Z", "signers": [ { "id": "sr_ghi789", "name": "Carlos Rodriguez", "email": "carlos@example.com", "status": "completed", "signedAt": "2026-05-28T15:30:00.000Z" } ] } ], "meta": { "count": 1, "hasMore": true, "nextCursor": "cm5x9jkl012" }}