Skip to content
ZiaSignZiaSign
ZiaSign
  • How it works
  • Free PDF Tools
  • Documentation
  • Pricing
  • Company

    • About
    • Blog
    • Investors
    • Security

    Compare

    • vs DocuSign
    • vs Adobe Sign
    • vs PandaDoc
    • vs iLovePDF
    • vs Smallpdf
    • vs PDF24
    • vs Sejda
    Investor connectLatest blog
  • Free PDF ToolsFree
  • Browse use casesNew
  • How-to guides100+
  • How it works
  • Pricing
  • Documentation

Theme

Light mode

Sign Now
Sign Now
  1. Home
  2. Documentation
  3. Developer API
  4. API Authentication
Developer API

API Authentication

Authenticate your API requests using API keys with HMAC-SHA256 request signing for maximum security.

Last updated April 15, 2026
Quickstart GuideAccount & Organization SettingsDocument TemplatesSecurity & ComplianceHelp & Support
Sending Documents for SignatureThe Signing ExperienceAudit Trail & Legal ValidityBulk SendPDF ToolsDocument Editor & StudioDocument LibraryAnalytics & Reports
API AuthenticationDocuments APIWebhooksSandbox & TestingEmbedded SigningIntegrations
AI Contract AnalysisAI Smart Workflows
Plans & PricingBilling & InvoicesReferral Program
Mobile App Guide
Changelog & Release Notes

Overview

ZiaSign uses API key authentication with HMAC-SHA256 request signing. Every API request must include:

  1. Your API Key ID in the X-Api-Key header
  2. A timestamp in the X-Timestamp header (ISO 8601)
  3. A signature in the X-Signature header (HMAC-SHA256)

Getting Your API Keys

  1. Navigate to Dashboard → Developer APIs
  2. Open the Credentials tab
  3. Click Create API Key
  4. Give your key a name, select scopes (permissions), and set an expiration date
  5. Copy both the Key ID and Secret — the secret is only shown once

Important: Store your API secret securely. Never commit it to version control or expose it in client-side code. Key creation and rotation events are recorded in the audit trail.

Request Signing

Every request must include an HMAC-SHA256 signature computed from:

signature_payload = HTTP_METHOD + "\n" + URL_PATH + "\n" + TIMESTAMP + "\n" + BODY_SHA256

Where BODY_SHA256 is the SHA-256 hash of the request body (empty string hash for GET requests).

cURL Example


JavaScript / TypeScript


Python


C#


Key Scopes

When creating an API key, select only the permissions your integration needs:

ScopeAccess
documents:readList and retrieve documents
documents:writeCreate, send, void, and delete documents
templates:readList and retrieve templates
templates:writeCreate, update, and delete templates
webhooks:manageCreate and manage webhook subscriptions
team:readList team members and roles

Rate Limits

API requests are rate-limited per key:

PlanRate Limit
Sandbox (Free)60 requests/minute
Starter API300 requests/minute
Growth API1,000 requests/minute
Scale / Enterprise APICustom (contact sales)

Rate limit headers are included in every response:

Frequently asked questions

Where do I find my API keys?

Go to Dashboard → Developer APIs → Credentials tab. You can create multiple keys with different scopes and expiration dates.

What is request signing?

Request signing uses HMAC-SHA256 to create a signature from your request details and secret key. This proves the request came from you and wasn't tampered with in transit.

Can I rotate my API keys without downtime?

Yes. Create a new key, update your application, then delete the old key. ZiaSign supports multiple active keys simultaneously.

Related documentation

Documents API

Create, send, retrieve, download, and manage documents programmatically via the REST API.

Webhooks

Receive real-time HTTP notifications when documents are viewed, signed, completed, or declined.

Sandbox & Testing

Use the sandbox environment to test your integration with simulated documents, signers, and events.

Next

Documents API

On this page

OverviewGetting Your API KeysRequest SigningcURL ExampleJavaScript / TypeScriptPythonC#Key ScopesRate Limits

Product

  • How it works
  • Pricing
  • About
  • Blog
  • Security

Documentation

  • All Docs
  • Quickstart
  • API Authentication
  • Webhooks
  • Templates
  • Integrations

Free PDF Tools

  • All Tools
  • How-To Guides
  • Use-Case Guides
  • Organize PDFs
  • Convert PDFs
  • Edit PDFs
  • Security
  • Optimize
  • AI Tools

Compare

  • vs DocuSign
  • vs Adobe Sign
  • vs PandaDoc
  • vs iLovePDF
  • vs Smallpdf
  • vs PDF24
  • vs Sejda

Company

  • FAQs
  • Investors
  • Privacy Policy
  • Terms of Services
ZiaSignZiaSign
ZiaSign

AI-native e-signature and document workflows for modern teams.

© 2026 ZiaSign. All rights reserved.

bash
# Set your credentials
API_KEY="your_api_key_id"
API_SECRET="your_api_secret"
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")

# Compute the signature
BODY=""
BODY_HASH=$(printf '%s' "$BODY" | openssl dgst -sha256 -hex | awk '{print $2}')
PAYLOAD=$(printf 'GET\n/documents\n%s\n%s' "$TIMESTAMP" "$BODY_HASH")
SIGNATURE=$(printf '%s' "$PAYLOAD" | openssl dgst -sha256 -hmac "$API_SECRET" -hex | awk '{print $2}')

# Make the request
curl -X GET "https://api.ziasign.com/api/v1/documents" \
  -H "X-Api-Key: $API_KEY" \
  -H "X-Timestamp: $TIMESTAMP" \
  -H "X-Signature: $SIGNATURE" \
  -H "Content-Type: application/json"
typescript
import crypto from "crypto";

const API_KEY = process.env.ZIASIGN_API_KEY!;
const API_SECRET = process.env.ZIASIGN_API_SECRET!;
const BASE_URL = "https://api.ziasign.com/api/v1";

async function ziasignFetch(method: string, path: string, body?: object) {
  const timestamp = new Date().toISOString();
  const bodyStr = body ? JSON.stringify(body) : "";
  const bodyHash = crypto.createHash("sha256").update(bodyStr).digest("hex");
  const payload = `${method}\n${path}\n${timestamp}\n${bodyHash}`;
  const signature = crypto
    .createHmac("sha256", API_SECRET)
    .update(payload)
    .digest("hex");

  const response = await fetch(`${BASE_URL}${path}`, {
    method,
    headers: {
      "X-Api-Key": API_KEY,
      "X-Timestamp": timestamp,
      "X-Signature": signature,
      "Content-Type": "application/json",
    },
    body: bodyStr || undefined,
  });

  if (!response.ok) throw new Error(`API error: ${response.status}`);
  return response.json();
}

// List documents
const docs = await ziasignFetch("GET", "/documents");
python
import hashlib
import hmac
import json
import os
from datetime import datetime, timezone

import requests

API_KEY = os.environ["ZIASIGN_API_KEY"]
API_SECRET = os.environ["ZIASIGN_API_SECRET"]
BASE_URL = "https://api.ziasign.com/api/v1"


def ziasign_request(method: str, path: str, body: dict | None = None):
    timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
    body_str = json.dumps(body) if body else ""
    body_hash = hashlib.sha256(body_str.encode()).hexdigest()
    payload = f"{method}\n{path}\n{timestamp}\n{body_hash}"
    signature = hmac.new(
        API_SECRET.encode(), payload.encode(), hashlib.sha256
    ).hexdigest()

    response = requests.request(
        method,
        f"{BASE_URL}{path}",
        headers={
            "X-Api-Key": API_KEY,
            "X-Timestamp": timestamp,
            "X-Signature": signature,
            "Content-Type": "application/json",
        },
        data=body_str or None,
    )
    response.raise_for_status()
    return response.json()


# List documents
docs = ziasign_request("GET", "/documents")
csharp
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;

public class ZiaSignClient
{
    private readonly string _apiKey;
    private readonly string _apiSecret;
    private readonly HttpClient _http;
    private const string BaseUrl = "https://api.ziasign.com/api/v1";

    public ZiaSignClient(string apiKey, string apiSecret)
    {
        _apiKey = apiKey;
        _apiSecret = apiSecret;
        _http = new HttpClient { BaseAddress = new Uri(BaseUrl) };
    }

    public async Task<JsonDocument> RequestAsync(
        HttpMethod method, string path, object? body = null)
    {
        var timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
        var bodyStr = body is not null ? JsonSerializer.Serialize(body) : "";
        var bodyHash = Convert.ToHexString(
            SHA256.HashData(Encoding.UTF8.GetBytes(bodyStr))).ToLower();
        var payload = $"{method.Method}\n{path}\n{timestamp}\n{bodyHash}";
        var signature = Convert.ToHexString(
            HMACSHA256.HashData(
                Encoding.UTF8.GetBytes(_apiSecret),
                Encoding.UTF8.GetBytes(payload))).ToLower();

        var request = new HttpRequestMessage(method, path);
        request.Headers.Add("X-Api-Key", _apiKey);
        request.Headers.Add("X-Timestamp", timestamp);
        request.Headers.Add("X-Signature", signature);

        if (body is not null)
            request.Content = new StringContent(
                bodyStr, Encoding.UTF8, "application/json");

        var response = await _http.SendAsync(request);
        response.EnsureSuccessStatusCode();
        var stream = await response.Content.ReadAsStreamAsync();
        return await JsonDocument.ParseAsync(stream);
    }
}

// Usage
var client = new ZiaSignClient("your_key", "your_secret");
var docs = await client.RequestAsync(HttpMethod.Get, "/documents");
text
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 297
X-RateLimit-Reset: 1713200000