Create Project
Endpointβ
POST https://api.verifik.co/v3/projects
Create a new KYC project with complete configuration. You can create a basic project with minimal fields or include a complete project flow configuration in a single request.
Headersβ
| Name | Value |
|---|---|
| Content-Type | application/json |
| Authorization | Bearer <token> |
Paramsβ
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Project name (max 60 characters) |
allowedCountries | array | Yes | List of allowed countries |
contactEmail | string | Yes | Contact email (valid email format) |
privacyUrl | string | Yes | Privacy policy URL (valid URL format) |
termsAndConditionsUrl | string | Yes | Terms and conditions URL (valid URL format) |
dataProtection | object | Yes | Data protection officer information |
identifier | string | No | Project identifier |
currentStep | number | No | Current configuration step |
lastStep | number | No | Last completed step |
demoMode | boolean | No | Enable demo mode for testing |
demoOTP | string | No | Demo OTP (6 digits) - auto-generated if not provided |
branding | object | No | Project branding configuration |
projectFlow | object | No | Project flow configuration |
projectFlowType | string | No | Project flow type (required if projectFlow provided) |
Data Protection Objectβ
| Name | Type | Required | Description |
|---|---|---|---|
name | string | Yes | DPO name |
email | string | Yes | DPO email (valid email format) |
address | string | Yes | Primary address |
address2 | string | No | Secondary address |
city | string | Yes | City |
country | string | Yes | Country |
postalCode | string | Yes | Postal code (3-12 characters, alphanumeric with spaces and hyphens) |
Project Flow Objectβ
| Name | Type | Required | Description |
|---|---|---|---|
target | string | Yes | Target audience (personal) |
type | string | Yes | Flow type (onboarding) |
signUpForm | object | No | Sign-up form configuration |
documents | object | No | Document verification settings |
liveness | object | No | Biometric verification settings |
steps | object | No | Step configuration |
integrations | object | No | Integration settings |
Requestβ
- Node.js
- PHP
- Python
- Go
const fetch = require("node-fetch");
async function run() {
const res = await fetch("https://api.verifik.co/v3/projects", {
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.VERIFIK_TOKEN}`,
},
body: JSON.stringify({
name: "My KYC Project",
allowedCountries: ["United States"],
contactEmail: "admin@example.com",
privacyUrl: "https://example.com/privacy",
termsAndConditionsUrl: "https://example.com/terms",
dataProtection: {
name: "John Doe",
email: "dpo@example.com",
address: "123 Main St",
city: "New York",
country: "United States",
postalCode: "10001"
}
}),
});
console.log(await res.json());
}
run();
<?php
$ch = curl_init("https://api.verifik.co/v3/projects");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Content-Type: application/json",
"Authorization: Bearer " . getenv("VERIFIK_TOKEN")
]);
$body = json_encode([
"name" => "My KYC Project",
"allowedCountries" => ["United States"],
"contactEmail" => "admin@example.com",
"privacyUrl" => "https://example.com/privacy",
"termsAndConditionsUrl" => "https://example.com/terms",
"dataProtection" => [
"name" => "John Doe",
"email" => "dpo@example.com",
"address" => "123 Main St",
"city" => "New York",
"country" => "United States",
"postalCode" => "10001"
]
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
import os, requests
url = "https://api.verifik.co/v3/projects"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {os.getenv('VERIFIK_TOKEN')}"
}
payload = {
"name": "My KYC Project",
"allowedCountries": ["United States"],
"contactEmail": "admin@example.com",
"privacyUrl": "https://example.com/privacy",
"termsAndConditionsUrl": "https://example.com/terms",
"dataProtection": {
"name": "John Doe",
"email": "dpo@example.com",
"address": "123 Main St",
"city": "New York",
"country": "United States",
"postalCode": "10001"
}
}
r = requests.post(url, json=payload, headers=headers)
print(r.json())
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
payload := map[string]interface{}{
"name": "My KYC Project",
"allowedCountries": []string{"United States"},
"contactEmail": "admin@example.com",
"privacyUrl": "https://example.com/privacy",
"termsAndConditionsUrl": "https://example.com/terms",
"dataProtection": map[string]string{
"name": "John Doe",
"email": "dpo@example.com",
"address": "123 Main St",
"city": "New York",
"country": "United States",
"postalCode": "10001",
},
}
b, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.verifik.co/v3/projects", bytes.NewBuffer(b))
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Authorization", "Bearer "+os.Getenv("VERIFIK_TOKEN"))
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var out map[string]interface{}
json.NewDecoder(resp.Body).Decode(&out)
fmt.Println(out)
}
Responseβ
- 201
- 400
- 401/403
- 409
- 422
{
"data": {
"_id": "64a1b2c3d4e5f6789012345",
"name": "My KYC Project",
"identifier": null,
"contactEmail": "admin@example.com",
"privacyUrl": "https://example.com/privacy",
"termsAndConditionsUrl": "https://example.com/terms",
"status": "draft",
"currentStep": 0,
"lastStep": 0,
"demoMode": false,
"demoOTP": null,
"allowedCountries": ["United States", "Canada"],
"dataProtection": {
"name": "John Doe",
"email": "dpo@example.com",
"address": "123 Main St",
"address2": "",
"city": "New York",
"country": "United States",
"postalCode": "10001"
},
"branding": {
"bgColor": "#01236D",
"tabColor": "#01236D",
"borderColor": "#B2BDD3",
"buttonColor": "#B2BDD3",
"buttonTxtColor": "#FFFFFF",
"secondaryButtonColor": "#B2BDD3",
"secondaryButtonTextColor": "#FFFFFF",
"txtColor": "#8091B6",
"titleColor": "#000000",
"logo": null,
"rightImage": null,
"rightImagePosition": "center center",
"rightBackgroundColor": "white"
},
"projectFlows": "64a1b2c3d4e5f6789012346",
"version": 2,
"createdAt": "2023-07-01T10:00:00.000Z",
"updatedAt": "2023-07-01T10:00:00.000Z"
}
}
{
"message": "Invalid request body",
"code": "BadRequest",
"status": 400,
"timestamp": "2023-07-01T10:00:00.000Z"
}
{
"message": "Access forbidden",
"code": "Forbidden",
"status": 401,
"timestamp": "2023-07-01T10:00:00.000Z"
}
or
{
"message": "Access forbidden",
"code": "Forbidden",
"status": 403,
"timestamp": "2023-07-01T10:00:00.000Z"
}
{
"message": "Country not supported. contact support to help you include your country to our list.",
"code": "MissingParameter",
"status": 409,
"timestamp": "2023-07-01T10:00:00.000Z"
}
{
"message": "Project flow validation failed",
"code": "UnprocessableEntity",
"status": 422,
"timestamp": "2023-07-01T10:00:00.000Z",
"details": [
{
"field": "projectFlow.documents.verificationMethods",
"message": "verificationMethods is required when documents step is not skipped"
}
]
}
Notesβ
- Demo Mode: When
demoMode: truewithoutdemoOTP, the system auto-generates a random 6-digit OTP. In development environments, demo mode is automatically enabled. - Project Flow: For production use, create complete projects with projectFlow configuration in a single request to ensure consistency.
- Validation: All fields are validated; missing required fields or invalid values result in validation errors.
- Data Protection: The
postalCodemust be 3-12 characters, alphanumeric with spaces and hyphens allowed. - Document Types: When
steps.documentis not "skip",verificationMethodsanddocumentTypesare required. - Liveness:
minScorerange: 0.52β0.9;searchMinScorerange: 0.7β0.95.