Skip to main content

Prerequisites

Before you begin, you’ll need:
  1. Urtentic Account: Sign up at urtentic.com
  2. API Credentials: Obtain your Client ID and API Secret from the integrations page in your dashboard
  3. Workflow ID: Create a verification workflow in your dashboard

Generate Your API Credentials

API Key Generation
Navigate to the integrations page in your dashboard to obtain your API credentials:
  • Client ID: Your application identifier (sent via X-CLIENT-ID header)
  • Client Secret: Your authentication token (sent via Authorization: Bearer header)

Create a Workflow

Workflow Creation
Set up your verification workflow by defining the required verification processes.
Workflow Configuration
Configure your workflow settings including document types, verification steps, and security options.

Quick Start (5 minutes)

Step 1: Set Up Your Environment

First, set your API credentials as environment variables:
export URTENTIC_API_KEY="your-base64-encoded-api-key"
export URTENTIC_CLIENT_ID="your-base64-encoded-client-id"

Step 2: Create Your First Verification

curl -X POST https://api.urtentic.com/api/v1/verifications \
  -H "Authorization: Bearer $URTENTIC_API_KEY" \
  -H "X-CLIENT-ID: $URTENTIC_CLIENT_ID" \
  -H "Content-Type: application/json" \
  -d '{
    "workflowId": "wf_abc123",
    "metadata": {
      "userId": "user_12345",
      "applicationId": "app_67890"
    }
  }'
Response:
{
  "id": "ver_xyz789",
  "workflowId": "wf_abc123",
  "status": "pending",
  "metadata": {
    "userId": "user_12345",
    "applicationId": "app_67890"
  },
  "createdAt": "2023-12-01T10:00:00Z",
  "verificationUrl": "https://verify.urtentic.com/ver_xyz789"
}

Step 3: Check Verification Status

curl -X GET https://api.urtentic.com/api/v1/verifications/ver_xyz789 \
  -H "Authorization: Bearer $URTENTIC_API_KEY" \
  -H "X-CLIENT-ID: $URTENTIC_CLIENT_ID"

Integration Examples

const URTENTIC_API_KEY = process.env.URTENTIC_API_KEY;
const URTENTIC_CLIENT_ID = process.env.URTENTIC_CLIENT_ID;
const BASE_URL = 'https://api.urtentic.com/api/v1';

// Create a verification
async function createVerification(workflowId, metadata = {}) {
  const response = await fetch(`${BASE_URL}/verifications`, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${URTENTIC_API_KEY}`,
      'X-CLIENT-ID': URTENTIC_CLIENT_ID,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({ workflowId, metadata })
  });
  return await response.json();
}

// Check verification status
async function getVerificationStatus(verificationId) {
  const response = await fetch(`${BASE_URL}/verifications/${verificationId}`, {
    headers: {
      'Authorization': `Bearer ${URTENTIC_API_KEY}`,
      'X-CLIENT-ID': URTENTIC_CLIENT_ID
    }
  });
  return await response.json();
}

// Usage
const verification = await createVerification('wf_abc123', { userId: 'user_12345' });
console.log('Verification URL:', verification.verificationUrl);

Workflow Types

Document Verification Only

{
  "workflowId": "wf_docs_only",
  "metadata": {
    "requiredDocuments": ["passport", "national_id"]
  }
}

Liveness + Document Verification

{
  "workflowId": "wf_full_kyc",
  "metadata": {
    "enableLiveness": true,
    "requiredDocuments": ["passport"]
  }
}

Location + Email Verification

{
  "workflowId": "wf_location_email",
  "metadata": {
    "requireLocation": true,
    "emailAddress": "[email protected]"
  }
}

Handling Webhooks

Configure webhook endpoints in your dashboard to receive real-time updates:
// Express.js webhook handler
app.post('/webhook/urtentic', express.raw({type: 'application/json'}), (req, res) => {
  const signature = req.headers['x-urtentic-signature'];
  const timestamp = req.headers['x-urtentic-timestamp'];
  const payload = req.body;

  try {
    const currentTime = Math.floor(Date.now() / 1000);
    if (Math.abs(currentTime - parseInt(timestamp)) > 300) {
      return res.status(400).send('Webhook timestamp too old');
    }

    const secretBytes = Buffer.from(WEBHOOK_SECRET, 'base64');
    const expectedSignature = crypto
      .createHmac('sha256', secretBytes)
      .update(payload)
      .digest('hex');

    let sig = signature.startsWith('sha256=') ? signature.substring(7) : signature;

    if (sig !== expectedSignature) {
      return res.status(400).send('Invalid signature');
    }
  } catch (error) {
    return res.status(400).send('Signature verification failed');
  }

  const event = JSON.parse(payload);

  switch (event.eventName) {
    case 'verification_completed':
      console.log('Verification completed:', event.flowId);
      break;
    case 'verification_abandoned':
      console.log('Verification abandoned:', event.flowId);
      break;
    case 'step_completed':
      console.log('Step completed:', event.flowId, 'Step:', event.step.stepId);
      break;
  }

  res.status(200).send('OK');
});

Error Handling

The API uses standard HTTP status codes and returns detailed error messages:
async function handleApiCall() {
  try {
    const response = await fetch(`${BASE_URL}/verifications`, {
      method: 'POST',
      headers: {
        'Authorization': `Bearer ${URTENTIC_API_KEY}`,
        'X-CLIENT-ID': URTENTIC_CLIENT_ID,
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ workflowId: 'wf_abc123' })
    });

    if (!response.ok) {
      const error = await response.json();
      console.error('API Error:', error);
      switch (response.status) {
        case 400: console.log('Bad request - check your payload'); break;
        case 401: console.log('Unauthorized - check your API credentials'); break;
        case 429: console.log('Rate limited - wait before retrying'); break;
      }
      return null;
    }
    return await response.json();
  } catch (error) {
    console.error('Network error:', error);
    return null;
  }
}

Next Steps

Support

Need help? We’re here to assist: