REST API
v1
120 req/min
OpenAPI 3.1
Softwire workspace API reference
Scoped bearer tokens for tickets, projects, HRMS attendance, and CRM — plus inbound Git, error, attendance, and lead webhooks with copy-paste code samples.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request · list tickets
Copy
curl -X GET "https://www.softwireapp.in/api/v1/workspaces/1/tickets\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\"
Request · list tickets
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tickets';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request · list tickets
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tickets';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request · list tickets
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request · list tickets
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request · list tickets
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request · list tickets
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
→ 200 OK · copy and paste into your project
Get started
Authentication
Create a workspace API token under Integrations → API . Tokens are prefixed with softwire_ and scoped to specific abilities. Each token is bound to one workspace.
Scope Access Status
tickets:read
List workspace tickets
Live
tickets:write
Create tickets
Live
tasks:write
Create tasks
Live
projects:read
List workspace projects
Live
hrms:read
List HRMS employee profiles
Live
hrms:write
Record attendance punches (API)
Live
crm:read
List CRM pipeline deals
Live
crm:write
Create CRM leads
Live
webhooks:manage
Manage outbound webhook subscriptions (UI today)
Planned
Authorization: Bearer softwire_xxxxxxxxxxxxxxxx
Copy
Base URL
Authenticated v1 resources live under one base path. Replace {workspace} with your numeric workspace ID (shown in the dashboard URL).
https://www.softwireapp.in/api/v1/workspaces/{workspace}/…
Copy
Inbound webhooks use a separate base without bearer auth:
https://www.softwireapp.in/api/webhooks/{workspace}/…
Copy
Token scopes
When creating a token, select only the scopes your integration needs. Requests without the required scope return 403 Forbidden.
tickets:read
List workspace tickets
Live
tickets:write
Create tickets
Live
tasks:write
Create tasks
Live
projects:read
List workspace projects
Live
hrms:read
List HRMS employee profiles
Live
hrms:write
Record attendance punches (API)
Live
crm:read
List CRM pipeline deals
Live
crm:write
Create CRM leads
Live
webhooks:manage
Manage outbound webhook subscriptions (UI today)
Planned
Endpoints overview
Read endpoints return JSON with a top-level data array. Lists are capped at 50 records and sorted by recency unless noted.
Method Path Scope Description
GET
/api/v1/workspaces/{workspace}/tickets
tickets:read
List recent tickets with assignee and status.
POST
/api/v1/workspaces/{workspace}/tickets
tickets:write
Create a new support ticket.
POST
/api/v1/workspaces/{workspace}/tasks
tasks:write
Create a workspace or project task.
GET
/api/v1/workspaces/{workspace}/projects
projects:read
List workspace projects and delivery status.
GET
/api/v1/workspaces/{workspace}/hrms/employees
hrms:read
Employee profiles with employee_code and attendance_uid.
POST
/api/v1/workspaces/{workspace}/hrms/attendance/punch
hrms:write
Record check-in/out from integrations (same rules as device webhook).
GET
/api/v1/workspaces/{workspace}/crm/deals
crm:read
CRM deals with stage, amount, and account.
POST
/api/v1/workspaces/{workspace}/crm/leads
crm:write
Create a CRM lead in the workspace pipeline.
GET
/api/webhooks/{workspace}/attendance
—
Ping attendance device webhook; returns registered device IDs.
POST
/api/webhooks/{workspace}/attendance
—
Ingest biometric/device punches into HRMS attendance.
GET
/api/webhooks/{workspace}/leads/{source}
—
Ping CRM lead capture webhook (facebook, google, website, …).
POST
/api/webhooks/{workspace}/leads/{source}
—
Ingest inbound leads from ads, forms, or automation tools.
GET
/api/webhooks/{workspace}/{provider}
—
Ping Git provider webhook (github, gitlab, bitbucket).
POST
/api/webhooks/{workspace}/{provider}
—
Receive Git push/issue events into workspace activity.
GET
/api/webhooks/{workspace}/errors
—
Ping error monitor webhook endpoint.
POST
/api/webhooks/{workspace}/errors
—
Ingest application error reports as tickets.
Platform
Platform modules
Every Softwire module is documented here. REST endpoints marked Live are available today; Planned scopes are on the roadmap.
Module REST API Webhooks Description
Tickets
Read + Create
Inbound + outbound
Support tickets, assignments, error-to-ticket pipeline.
Projects
Read
Outbound events
Delivery milestones, status, and schedule windows.
Tasks
Create
Outbound events
Assignments and workflow tasks inside workspaces.
HRMS
Read + Write
Attendance inbound
Employee profiles, device attendance sync, and punch ingestion.
CRM
Read + Create
Lead inbound
Deals, accounts, pipeline stages, and lead ingestion.
Integrations
—
Git + error + leads
GitHub, GitLab, Bitbucket, error monitor, and CRM lead capture.
Billing
Planned
—
Invoices, payments, and subscription status.
Time & HR
Partial
—
Time logs and leave records (attendance via HRMS webhooks).
Work
Tickets API
Read and create support tickets for a workspace. Lists are sorted by newest first and capped at 50 records.
GET
https://www.softwireapp.in/api/v1/workspaces/1/tickets
List tickets
Returns ticket number, title, status, priority, category, assignee IDs, and timestamps.
Scope: tickets:read
Requires Authorization: Bearer softwire_… with scope tickets:read.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/v1/workspaces/1/tickets\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tickets';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tickets';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"data": [
{
"id": 12,
"ticket_number": "TKT-012",
"title": "Login issue on mobile",
"status": "open",
"priority": "high",
"category": "support",
"assigned_to": 4,
"created_by": 1,
"created_at": "2026-08-20T10:00:00.000000Z",
"updated_at": "2026-08-20T11:30:00.000000Z",
"assignee": { "id": 4, "name": "Alice Johnson" },
"creator": { "id": 1, "name": "Anil Kumar" }
}
]
}
POST
https://www.softwireapp.in/api/v1/workspaces/1/tickets
Create ticket
Creates a ticket and runs SLA/automation hooks. Optional fields: description, priority, category, assigned_to, due_at, project_id, tags.
Scope: tickets:write
Requires Authorization: Bearer softwire_… with scope tickets:write.
Request body
{
"title": "Payment gateway timeout",
"description": "Checkout fails after 30 seconds on mobile Safari.",
"priority": "high",
"category": "bug",
"assigned_to": 4,
"project_id": 3,
"due_at": "2026-08-25",
"tags": ["checkout", "mobile"]
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/v1/workspaces/1/tickets\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\" \
-H "Content-Type: application/json\" \
-d '{"title":"Payment gateway timeout","description":"Checkout fails after 30 seconds on mobile Safari.","priority":"high","category":"bug","assigned_to":4,"project_id":3,"due_at":"2026-08-25","tags":["checkout","mobile"]}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tickets';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"title":"Payment gateway timeout","description":"Checkout fails after 30 seconds on mobile Safari.","priority":"high","category":"bug","assigned_to":4,"project_id":3,"due_at":"2026-08-25","tags":["checkout","mobile"]}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tickets';
$request = Http::withToken($token)->acceptJson();
$payload = array (
'title' => 'Payment gateway timeout',
'description' => 'Checkout fails after 30 seconds on mobile Safari.',
'priority' => 'high',
'category' => 'bug',
'assigned_to' => 4,
'project_id' => 3,
'due_at' => '2026-08-25',
'tags' =>
array (
0 => 'checkout',
1 => 'mobile',
),
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"title\":\"Payment gateway timeout\",\"description\":\"Checkout fails after 30 seconds on mobile Safari.\",\"priority\":\"high\",\"category\":\"bug\",\"assigned_to\":4,\"project_id\":3,\"due_at\":\"2026-08-25\",\"tags\":[\"checkout\",\"mobile\"]}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var json = @"{"title":"Payment gateway timeout","description":"Checkout fails after 30 seconds on mobile Safari.","priority":"high","category":"bug","assigned_to":4,"project_id":3,"due_at":"2026-08-25","tags":["checkout","mobile"]}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json",
}
payload = {
"title": "Payment gateway timeout",
"description": "Checkout fails after 30 seconds on mobile Safari.",
"priority": "high",
"category": "bug",
"assigned_to": 4,
"project_id": 3,
"due_at": "2026-08-25",
"tags": [
"checkout",
"mobile"
]
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/tickets";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"title": "Payment gateway timeout",
"description": "Checkout fails after 30 seconds on mobile Safari.",
"priority": "high",
"category": "bug",
"assigned_to": 4,
"project_id": 3,
"due_at": "2026-08-25",
"tags": [
"checkout",
"mobile"
]
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"data": {
"id": 16,
"ticket_number": "TKT-016",
"title": "Payment gateway timeout",
"status": "open",
"priority": "high",
"category": "bug",
"assigned_to": 4,
"created_by": 1,
"created_at": "2026-08-20T12:00:00.000000Z",
"assignee": { "id": 4, "name": "Alice Johnson" },
"creator": { "id": 1, "name": "Anil Kumar" },
"project": { "id": 3, "name": "Mobile app v2" }
}
}
Work
Tasks API
Create tasks in a workspace or link them to projects, tickets, and parent tasks.
POST
https://www.softwireapp.in/api/v1/workspaces/1/tasks
Create task
Creates a task with optional project, ticket, parent, assignee, and schedule fields.
Scope: tasks:write
Requires Authorization: Bearer softwire_… with scope tasks:write.
Request body
{
"title": "Investigate checkout timeout",
"description": "Profile API latency on staging.",
"priority": "high",
"status": "todo",
"project_id": 3,
"ticket_id": 16,
"assigned_to": 4,
"due_at": "2026-08-22",
"tags": ["backend", "perf"]
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/v1/workspaces/1/tasks\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\" \
-H "Content-Type: application/json\" \
-d '{"title":"Investigate checkout timeout","description":"Profile API latency on staging.","priority":"high","status":"todo","project_id":3,"ticket_id":16,"assigned_to":4,"due_at":"2026-08-22","tags":["backend","perf"]}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tasks';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"title":"Investigate checkout timeout","description":"Profile API latency on staging.","priority":"high","status":"todo","project_id":3,"ticket_id":16,"assigned_to":4,"due_at":"2026-08-22","tags":["backend","perf"]}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/tasks';
$request = Http::withToken($token)->acceptJson();
$payload = array (
'title' => 'Investigate checkout timeout',
'description' => 'Profile API latency on staging.',
'priority' => 'high',
'status' => 'todo',
'project_id' => 3,
'ticket_id' => 16,
'assigned_to' => 4,
'due_at' => '2026-08-22',
'tags' =>
array (
0 => 'backend',
1 => 'perf',
),
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/tasks";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"title\":\"Investigate checkout timeout\",\"description\":\"Profile API latency on staging.\",\"priority\":\"high\",\"status\":\"todo\",\"project_id\":3,\"ticket_id\":16,\"assigned_to\":4,\"due_at\":\"2026-08-22\",\"tags\":[\"backend\",\"perf\"]}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/tasks";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var json = @"{"title":"Investigate checkout timeout","description":"Profile API latency on staging.","priority":"high","status":"todo","project_id":3,"ticket_id":16,"assigned_to":4,"due_at":"2026-08-22","tags":["backend","perf"]}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/tasks"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json",
}
payload = {
"title": "Investigate checkout timeout",
"description": "Profile API latency on staging.",
"priority": "high",
"status": "todo",
"project_id": 3,
"ticket_id": 16,
"assigned_to": 4,
"due_at": "2026-08-22",
"tags": [
"backend",
"perf"
]
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/tasks";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"title": "Investigate checkout timeout",
"description": "Profile API latency on staging.",
"priority": "high",
"status": "todo",
"project_id": 3,
"ticket_id": 16,
"assigned_to": 4,
"due_at": "2026-08-22",
"tags": [
"backend",
"perf"
]
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"data": {
"id": 42,
"title": "Investigate checkout timeout",
"status": "todo",
"priority": "high",
"project_id": 3,
"ticket_id": 16,
"assigned_to": 4,
"created_by": 1,
"due_at": "2026-08-22T00:00:00.000000Z",
"created_at": "2026-08-20T12:05:00.000000Z",
"assignee": { "id": 4, "name": "Alice Johnson" },
"project": { "id": 3, "name": "Mobile app v2" },
"ticket": { "id": 16, "ticket_number": "TKT-016", "title": "Payment gateway timeout" }
}
}
Work
Projects API
Export project portfolio data for reporting dashboards or external PM tools.
GET
https://www.softwireapp.in/api/v1/workspaces/1/projects
List projects
Returns project name, delivery status, color, and schedule window.
Scope: projects:read
Requires Authorization: Bearer softwire_… with scope projects:read.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/v1/workspaces/1/projects\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/projects';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/projects';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/projects";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/projects";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/projects"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/projects";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"data": [
{
"id": 3,
"name": "Mobile app v2",
"status": "active",
"color": "#10b981",
"starts_at": "2026-07-01",
"due_at": "2026-10-15",
"created_at": "2026-06-15T08:00:00.000000Z"
}
]
}
People
HRMS API
Sync employee directory data into HRIS, payroll, or identity systems. Map `employee_code` and `attendance_uid` on employee profiles before sending device punches.
GET
https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees
List employee profiles
Includes linked user, department, job title, employment type, employee_code, attendance_uid, and join date.
Scope: hrms:read
Requires Authorization: Bearer softwire_… with scope hrms:read.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/employees";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"data": [
{
"id": 5,
"user_id": 1,
"employee_code": "EMP001",
"attendance_uid": "12345",
"department": "General",
"job_title": "Workspace owner",
"employment_type": "full_time",
"joined_at": "2026-01-10",
"user": { "id": 1, "name": "Anil Kumar", "email": "owner@example.com" }
}
]
}
POST
https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch
Record attendance punch
Same ingestion rules as the device webhook. Identify the employee with employee_code, attendance_uid, user_id, or email. Identify the device with device_id, external_device_id, or source_type (see Attendance sync webhook).
Scope: hrms:write
Requires Authorization: Bearer softwire_… with scope hrms:write.
Request body
{
"employee_code": "EMP001",
"attendance_uid": "12345",
"external_device_id": "mantra-k8x2p4qz",
"source_type": "mantra",
"direction": "toggle",
"timestamp": "2026-08-23T17:30:00+05:30"
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\" \
-H "Content-Type: application/json\" \
-d '{"employee_code":"EMP001","attendance_uid":"12345","external_device_id":"mantra-k8x2p4qz","source_type":"mantra","direction":"toggle","timestamp":"2026-08-23T17:30:00+05:30"}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"employee_code":"EMP001","attendance_uid":"12345","external_device_id":"mantra-k8x2p4qz","source_type":"mantra","direction":"toggle","timestamp":"2026-08-23T17:30:00+05:30"}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch';
$request = Http::withToken($token)->acceptJson();
$payload = array (
'employee_code' => 'EMP001',
'attendance_uid' => '12345',
'external_device_id' => 'mantra-k8x2p4qz',
'source_type' => 'mantra',
'direction' => 'toggle',
'timestamp' => '2026-08-23T17:30:00+05:30',
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"employee_code\":\"EMP001\",\"attendance_uid\":\"12345\",\"external_device_id\":\"mantra-k8x2p4qz\",\"source_type\":\"mantra\",\"direction\":\"toggle\",\"timestamp\":\"2026-08-23T17:30:00+05:30\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var json = @"{"employee_code":"EMP001","attendance_uid":"12345","external_device_id":"mantra-k8x2p4qz","source_type":"mantra","direction":"toggle","timestamp":"2026-08-23T17:30:00+05:30"}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json",
}
payload = {
"employee_code": "EMP001",
"attendance_uid": "12345",
"external_device_id": "mantra-k8x2p4qz",
"source_type": "mantra",
"direction": "toggle",
"timestamp": "2026-08-23T17:30:00+05:30"
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/hrms/attendance/punch";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"employee_code": "EMP001",
"attendance_uid": "12345",
"external_device_id": "mantra-k8x2p4qz",
"source_type": "mantra",
"direction": "toggle",
"timestamp": "2026-08-23T17:30:00+05:30"
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"recorded": true,
"action": "check_in",
"duplicate": false,
"user_id": 1,
"check_in_at": "2026-08-23T12:00:00.000000Z",
"check_out_at": null,
"device_id": 4,
"punch_id": 88
}
Business
CRM API
Pull pipeline deals for revenue forecasting and CRM sync.
GET
https://www.softwireapp.in/api/v1/workspaces/1/crm/deals
List deals
Returns deal title, stage, amount, linked account, owner, and expected close date.
Scope: crm:read
Requires Authorization: Bearer softwire_… with scope crm:read.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/v1/workspaces/1/crm/deals\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/crm/deals';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/crm/deals';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/deals";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/deals";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/deals"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/deals";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"data": [
{
"id": 8,
"title": "Acme annual contract",
"stage": "negotiation",
"amount": "125000.00",
"account_id": 2,
"owner_id": 4,
"expected_close_at": "2026-09-30",
"created_at": "2026-08-01T09:00:00.000000Z",
"account": { "id": 2, "name": "Acme Corp" },
"owner": { "id": 4, "name": "Alice Johnson" }
}
]
}
POST
https://www.softwireapp.in/api/v1/workspaces/1/crm/leads
Create lead
Creates a CRM lead in the workspace pipeline. source must match an active lead source key (website, facebook, google, …). Returns 409 if an open lead with the same email already exists.
Scope: crm:write
Requires Authorization: Bearer softwire_… with scope crm:write.
Request body
{
"name": "Priya Sharma",
"email": "priya@example.com",
"phone": "+919876543210",
"company": "Acme Retail",
"source": "website",
"notes": "Interested in HRMS demo",
"estimated_value": 50000
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/v1/workspaces/1/crm/leads\" \
-H "Accept: application/json\" \
-H "Authorization: Bearer softwire_your_token_here\" \
-H "Content-Type: application/json\" \
-d '{"name":"Priya Sharma","email":"priya@example.com","phone":"+919876543210","company":"Acme Retail","source":"website","notes":"Interested in HRMS demo","estimated_value":50000}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/crm/leads';
$headers = [
'Accept: application/json',
'Authorization: Bearer softwire_your_token_here',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"name":"Priya Sharma","email":"priya@example.com","phone":"+919876543210","company":"Acme Retail","source":"website","notes":"Interested in HRMS demo","estimated_value":50000}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/v1/workspaces/1/crm/leads';
$request = Http::withToken($token)->acceptJson();
$payload = array (
'name' => 'Priya Sharma',
'email' => 'priya@example.com',
'phone' => '+919876543210',
'company' => 'Acme Retail',
'source' => 'website',
'notes' => 'Interested in HRMS demo',
'estimated_value' => 50000,
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/leads";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Authorization", "Bearer softwire_your_token_here")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"name\":\"Priya Sharma\",\"email\":\"priya@example.com\",\"phone\":\"+919876543210\",\"company\":\"Acme Retail\",\"source\":\"website\",\"notes\":\"Interested in HRMS demo\",\"estimated_value\":50000}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/leads";
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var json = @"{"name":"Priya Sharma","email":"priya@example.com","phone":"+919876543210","company":"Acme Retail","source":"website","notes":"Interested in HRMS demo","estimated_value":50000}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/leads"
headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json",
}
payload = {
"name": "Priya Sharma",
"email": "priya@example.com",
"phone": "+919876543210",
"company": "Acme Retail",
"source": "website",
"notes": "Interested in HRMS demo",
"estimated_value": 50000
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/v1/workspaces/1/crm/leads";
const headers = {
"Accept": "application/json",
"Authorization": "Bearer softwire_your_token_here",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"name": "Priya Sharma",
"email": "priya@example.com",
"phone": "+919876543210",
"company": "Acme Retail",
"source": "website",
"notes": "Interested in HRMS demo",
"estimated_value": 50000
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"data": {
"id": 42,
"name": "Priya Sharma",
"email": "priya@example.com",
"phone": "+919876543210",
"company": "Acme Retail",
"source": "website",
"status": "new",
"estimated_value": "50000.00",
"created_at": "2026-08-23T12:00:00.000000Z"
}
}
Integrations
Inbound Git webhooks
Connect GitHub, GitLab, or Bitbucket under Integrations → Git. Use these URLs as webhook targets — no bearer token required.
GET
https://www.softwireapp.in/api/webhooks/1/github
Ping endpoint
Verify reachability before saving the webhook URL in your Git provider. Replace github with gitlab or bitbucket.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/webhooks/1/github\" \
-H "Accept: application/json\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/github';
$headers = [
'Accept: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/github';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/github";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/github";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/github"
headers = {
"Accept": "application/json",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/github";
const headers = {
"Accept": "application/json"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"status": "ok",
"message": "Webhook endpoint is reachable. Git providers must send POST requests here.",
"workspace": "acme-team",
"provider": "github",
"configured": true,
"supported_methods": ["POST"]
}
POST
https://www.softwireapp.in/api/webhooks/1/github
Receive Git events
Accepts native provider payloads. Issue events may auto-create tickets when enabled.
Headers
Name Description
X-GitHub-Event
GitHub event name (push, issues, …)
X-Gitlab-Event
GitLab event name
X-Event-Key
Bitbucket event key
Request body
{
"action": "opened",
"issue": {
"number": 42,
"title": "Fix checkout timeout",
"html_url": "https://github.com/org/repo/issues/42"
}
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/webhooks/1/github\" \
-H "Accept: application/json\" \
-H "X-GitHub-Event: your_value\" \
-H "X-Gitlab-Event: your_value\" \
-H "X-Event-Key: your_value\" \
-H "Content-Type: application/json\" \
-d '{"action":"opened","issue":{"number":42,"title":"Fix checkout timeout","html_url":"https://github.com/org/repo/issues/42"}}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/github';
$headers = [
'Accept: application/json',
'X-GitHub-Event: your_value',
'X-Gitlab-Event: your_value',
'X-Event-Key: your_value',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"action":"opened","issue":{"number":42,"title":"Fix checkout timeout","html_url":"https://github.com/org/repo/issues/42"}}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/github';
$request = Http::withToken($token)->acceptJson();
$request = $request->withHeaders(['X-GitHub-Event' => 'YOUR_X_GITHUB_EVENT']);
$request = $request->withHeaders(['X-Gitlab-Event' => 'YOUR_X_GITLAB_EVENT']);
$request = $request->withHeaders(['X-Event-Key' => 'YOUR_X_EVENT_KEY']);
$payload = array (
'action' => 'opened',
'issue' =>
array (
'number' => 42,
'title' => 'Fix checkout timeout',
'html_url' => 'https://github.com/org/repo/issues/42',
),
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/github";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("X-GitHub-Event", "your_value")
.header("X-Gitlab-Event", "your_value")
.header("X-Event-Key", "your_value")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"action\":\"opened\",\"issue\":{\"number\":42,\"title\":\"Fix checkout timeout\",\"html_url\":\"https://github.com/org/repo/issues/42\"}}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/github";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("X-GitHub-Event", "YOUR_SECRET");
client.DefaultRequestHeaders.Add("X-Gitlab-Event", "YOUR_SECRET");
client.DefaultRequestHeaders.Add("X-Event-Key", "YOUR_SECRET");
var json = @"{"action":"opened","issue":{"number":42,"title":"Fix checkout timeout","html_url":"https://github.com/org/repo/issues/42"}}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/github"
headers = {
"Accept": "application/json",
"X-GitHub-Event": "your_value",
"X-Gitlab-Event": "your_value",
"X-Event-Key": "your_value",
"Content-Type": "application/json",
}
payload = {
"action": "opened",
"issue": {
"number": 42,
"title": "Fix checkout timeout",
"html_url": "https://github.com/org/repo/issues/42"
}
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/github";
const headers = {
"Accept": "application/json",
"X-GitHub-Event": "your_value",
"X-Gitlab-Event": "your_value",
"X-Event-Key": "your_value",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"action": "opened",
"issue": {
"number": 42,
"title": "Fix checkout timeout",
"html_url": "https://github.com/org/repo/issues/42"
}
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"received": true,
"event": "issues",
"stored": 1,
"ticket_created": true,
"ticket_number": "TKT-015"
}
Integrations
Error monitor webhook
Send application exceptions from Laravel, .NET, mobile, WordPress, Sentry-style tools, and more. Configure under Integrations → Error monitor.
GET
https://www.softwireapp.in/api/webhooks/1/errors
Ping endpoint
Health check for your monitoring stack before enabling production alerts.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/webhooks/1/errors\" \
-H "Accept: application/json\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/errors';
$headers = [
'Accept: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/errors';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/errors";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/errors";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/errors"
headers = {
"Accept": "application/json",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/errors";
const headers = {
"Accept": "application/json"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"status": "ok",
"message": "Error monitor endpoint is reachable. Send POST requests with X-Softwire-Webhook-Secret header.",
"workspace": "acme-team",
"configured": true,
"supported_methods": ["POST"]
}
POST
https://www.softwireapp.in/api/webhooks/1/errors
Report an error
Creates or deduplicates support tickets from error payloads. Supports multiple framework formats.
Headers
Name Description
X-Softwire-Webhook-Secret
Secret from Integrations → Error monitor (or Bearer token)
Content-Type
application/json
Request body
{
"status_code": 500,
"message": "Payment gateway timeout",
"exception": "RuntimeException",
"file": "/app/Services/PaymentService.php",
"line": 88,
"url": "/checkout",
"method": "POST",
"framework": "laravel",
"environment": "production",
"app_name": "softwire-store"
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/webhooks/1/errors\" \
-H "Accept: application/json\" \
-H "X-Softwire-Webhook-Secret: your_webhook_secret\" \
-H "Content-Type: your_value\" \
-H "Content-Type: application/json\" \
-d '{"status_code":500,"message":"Payment gateway timeout","exception":"RuntimeException","file":"/app/Services/PaymentService.php","line":88,"url":"/checkout","method":"POST","framework":"laravel","environment":"production","app_name":"softwire-store"}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/errors';
$headers = [
'Accept: application/json',
'X-Softwire-Webhook-Secret: your_webhook_secret',
'Content-Type: your_value',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"status_code":500,"message":"Payment gateway timeout","exception":"RuntimeException","file":"/app/Services/PaymentService.php","line":88,"url":"/checkout","method":"POST","framework":"laravel","environment":"production","app_name":"softwire-store"}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/errors';
$request = Http::withToken($token)->acceptJson();
$request = $request->withHeaders(['X-Softwire-Webhook-Secret' => 'YOUR_X_SOFTWIRE_WEBHOOK_SECRET']);
$request = $request->withHeaders(['Content-Type' => 'YOUR_CONTENT_TYPE']);
$payload = array (
'status_code' => 500,
'message' => 'Payment gateway timeout',
'exception' => 'RuntimeException',
'file' => '/app/Services/PaymentService.php',
'line' => 88,
'url' => '/checkout',
'method' => 'POST',
'framework' => 'laravel',
'environment' => 'production',
'app_name' => 'softwire-store',
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/errors";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("X-Softwire-Webhook-Secret", "your_webhook_secret")
.header("Content-Type", "your_value")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"status_code\":500,\"message\":\"Payment gateway timeout\",\"exception\":\"RuntimeException\",\"file\":\"/app/Services/PaymentService.php\",\"line\":88,\"url\":\"/checkout\",\"method\":\"POST\",\"framework\":\"laravel\",\"environment\":\"production\",\"app_name\":\"softwire-store\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/errors";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("X-Softwire-Webhook-Secret", "YOUR_SECRET");
client.DefaultRequestHeaders.Add("Content-Type", "YOUR_SECRET");
var json = @"{"status_code":500,"message":"Payment gateway timeout","exception":"RuntimeException","file":"/app/Services/PaymentService.php","line":88,"url":"/checkout","method":"POST","framework":"laravel","environment":"production","app_name":"softwire-store"}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/errors"
headers = {
"Accept": "application/json",
"X-Softwire-Webhook-Secret": "your_webhook_secret",
"Content-Type": "your_value",
"Content-Type": "application/json",
}
payload = {
"status_code": 500,
"message": "Payment gateway timeout",
"exception": "RuntimeException",
"file": "/app/Services/PaymentService.php",
"line": 88,
"url": "/checkout",
"method": "POST",
"framework": "laravel",
"environment": "production",
"app_name": "softwire-store"
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/errors";
const headers = {
"Accept": "application/json",
"X-Softwire-Webhook-Secret": "your_webhook_secret",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"status_code": 500,
"message": "Payment gateway timeout",
"exception": "RuntimeException",
"file": "/app/Services/PaymentService.php",
"line": 88,
"url": "/checkout",
"method": "POST",
"framework": "laravel",
"environment": "production",
"app_name": "softwire-store"
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"received": true,
"ticket_created": true,
"ticket_number": "TKT-016",
"ticket_id": 16
}
Integrations
Attendance sync webhook
Push biometric and device punches from Mantra, Morpho, ZKTeco, RFID, NFC, and other agents. Enable under HRMS → Attendance → Auto attendance sync, then copy the webhook URL and secret. Device IDs are listed on that page — placeholder IDs return device_not_found.
GET
https://www.softwireapp.in/api/webhooks/1/attendance
Ping endpoint
Health check plus payload example and registered device IDs for this workspace.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/webhooks/1/attendance\" \
-H "Accept: application/json\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/attendance';
$headers = [
'Accept: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/attendance';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/attendance";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/attendance";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/attendance"
headers = {
"Accept": "application/json",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/attendance";
const headers = {
"Accept": "application/json"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"status": "ok",
"message": "Attendance sync endpoint is reachable. Send POST with X-Softwire-Webhook-Secret header.",
"workspace": "acme-team",
"configured": true,
"supported_methods": ["POST"],
"payload_example": {
"employee_code": "EMP001",
"attendance_uid": "12345",
"external_device_id": "mantra-k8x2p4qz",
"source_type": "mantra",
"direction": "toggle",
"timestamp": "2026-08-23T17:30:00+05:30"
},
"registered_devices": [
{
"id": 4,
"source_type": "mantra",
"device_name": "Lobby biometric pad",
"external_device_id": "mantra-k8x2p4qz"
}
],
"note": "Use external_device_id from HRMS → Attendance. Regenerate secret from the same page when rotating credentials."
}
POST
https://www.softwireapp.in/api/webhooks/1/attendance
Ingest device punch
Creates attendance logs from device agents. Auth with workspace webhook secret (X-Softwire-Webhook-Secret) or a per-device secret (X-Device-Secret). direction supports in, out, or toggle.
Headers
Name Description
X-Softwire-Webhook-Secret
Secret from HRMS → Attendance (shown once after enable/regenerate)
X-Device-Secret
Optional per-device secret instead of workspace secret
Content-Type
application/json
Request body
{
"employee_code": "EMP001",
"attendance_uid": "12345",
"external_device_id": "mantra-k8x2p4qz",
"source_type": "mantra",
"direction": "toggle",
"timestamp": "2026-08-23T17:30:00+05:30"
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/webhooks/1/attendance\" \
-H "Accept: application/json\" \
-H "X-Softwire-Webhook-Secret: your_webhook_secret\" \
-H "X-Device-Secret: your_webhook_secret\" \
-H "Content-Type: your_value\" \
-H "Content-Type: application/json\" \
-d '{"employee_code":"EMP001","attendance_uid":"12345","external_device_id":"mantra-k8x2p4qz","source_type":"mantra","direction":"toggle","timestamp":"2026-08-23T17:30:00+05:30"}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/attendance';
$headers = [
'Accept: application/json',
'X-Softwire-Webhook-Secret: your_webhook_secret',
'X-Device-Secret: your_webhook_secret',
'Content-Type: your_value',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"employee_code":"EMP001","attendance_uid":"12345","external_device_id":"mantra-k8x2p4qz","source_type":"mantra","direction":"toggle","timestamp":"2026-08-23T17:30:00+05:30"}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/attendance';
$request = Http::withToken($token)->acceptJson();
$request = $request->withHeaders(['X-Softwire-Webhook-Secret' => 'YOUR_X_SOFTWIRE_WEBHOOK_SECRET']);
$request = $request->withHeaders(['X-Device-Secret' => 'YOUR_X_DEVICE_SECRET']);
$request = $request->withHeaders(['Content-Type' => 'YOUR_CONTENT_TYPE']);
$payload = array (
'employee_code' => 'EMP001',
'attendance_uid' => '12345',
'external_device_id' => 'mantra-k8x2p4qz',
'source_type' => 'mantra',
'direction' => 'toggle',
'timestamp' => '2026-08-23T17:30:00+05:30',
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/attendance";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("X-Softwire-Webhook-Secret", "your_webhook_secret")
.header("X-Device-Secret", "your_webhook_secret")
.header("Content-Type", "your_value")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"employee_code\":\"EMP001\",\"attendance_uid\":\"12345\",\"external_device_id\":\"mantra-k8x2p4qz\",\"source_type\":\"mantra\",\"direction\":\"toggle\",\"timestamp\":\"2026-08-23T17:30:00+05:30\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/attendance";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("X-Softwire-Webhook-Secret", "YOUR_SECRET");
client.DefaultRequestHeaders.Add("X-Device-Secret", "YOUR_SECRET");
client.DefaultRequestHeaders.Add("Content-Type", "YOUR_SECRET");
var json = @"{"employee_code":"EMP001","attendance_uid":"12345","external_device_id":"mantra-k8x2p4qz","source_type":"mantra","direction":"toggle","timestamp":"2026-08-23T17:30:00+05:30"}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/attendance"
headers = {
"Accept": "application/json",
"X-Softwire-Webhook-Secret": "your_webhook_secret",
"X-Device-Secret": "your_webhook_secret",
"Content-Type": "your_value",
"Content-Type": "application/json",
}
payload = {
"employee_code": "EMP001",
"attendance_uid": "12345",
"external_device_id": "mantra-k8x2p4qz",
"source_type": "mantra",
"direction": "toggle",
"timestamp": "2026-08-23T17:30:00+05:30"
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/attendance";
const headers = {
"Accept": "application/json",
"X-Softwire-Webhook-Secret": "your_webhook_secret",
"X-Device-Secret": "your_webhook_secret",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"employee_code": "EMP001",
"attendance_uid": "12345",
"external_device_id": "mantra-k8x2p4qz",
"source_type": "mantra",
"direction": "toggle",
"timestamp": "2026-08-23T17:30:00+05:30"
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"received": true,
"recorded": true,
"action": "check_in",
"duplicate": false,
"user_id": 1,
"check_in_at": "2026-08-23T12:00:00.000000Z",
"check_out_at": null,
"device_id": 4,
"punch_id": 88
}
POST
https://www.softwireapp.in/api/webhooks/1/attendance
422 — device not found
Returned when external_device_id does not match a registered device. The response includes registered_devices to help fix agent configuration.
Request body
{
"employee_code": "EMP001",
"external_device_id": "mantra-wrong-id",
"direction": "toggle"
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/webhooks/1/attendance\" \
-H "Accept: application/json\" \
-H "Content-Type: application/json\" \
-d '{"employee_code":"EMP001","external_device_id":"mantra-wrong-id","direction":"toggle"}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/attendance';
$headers = [
'Accept: application/json',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"employee_code":"EMP001","external_device_id":"mantra-wrong-id","direction":"toggle"}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/attendance';
$request = Http::withToken($token)->acceptJson();
$payload = array (
'employee_code' => 'EMP001',
'external_device_id' => 'mantra-wrong-id',
'direction' => 'toggle',
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/attendance";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"employee_code\":\"EMP001\",\"external_device_id\":\"mantra-wrong-id\",\"direction\":\"toggle\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/attendance";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var json = @"{"employee_code":"EMP001","external_device_id":"mantra-wrong-id","direction":"toggle"}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/attendance"
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
}
payload = {
"employee_code": "EMP001",
"external_device_id": "mantra-wrong-id",
"direction": "toggle"
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/attendance";
const headers = {
"Accept": "application/json",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"employee_code": "EMP001",
"external_device_id": "mantra-wrong-id",
"direction": "toggle"
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"received": true,
"recorded": false,
"reason": "device_not_found",
"hint": "Register the device in HRMS → Attendance and send its external_device_id, source_type, or device_id in the payload.",
"registered_devices": [
{
"id": 4,
"source_type": "mantra",
"device_name": "Lobby biometric pad",
"external_device_id": "mantra-k8x2p4qz"
}
]
}
Integrations
Lead capture webhooks
Ingest leads from Meta, Google, WhatsApp, website forms, Zapier, or n8n. Configure under CRM → Lead sources and copy the webhook URL and secret.
GET
https://www.softwireapp.in/api/webhooks/1/leads/website
Ping endpoint
Replace website with facebook, instagram, google, whatsapp, or meta. Verifies reachability before connecting ads or forms.
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X GET "https://www.softwireapp.in/api/webhooks/1/leads/website\" \
-H "Accept: application/json\"
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/leads/website';
$headers = [
'Accept: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/leads/website';
$request = Http::withToken($token)->acceptJson();
$response = $request->get($url);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/leads/website";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/leads/website";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = await client.getAsync(url);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/leads/website"
headers = {
"Accept": "application/json",
}
response = requests.get(url, headers=headers)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/leads/website";
const headers = {
"Accept": "application/json"
};
const options = {
method: 'GET',
headers,
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"status": "ok",
"message": "Lead capture endpoint is reachable. Send POST with X-Softwire-Webhook-Secret header.",
"workspace": "acme-team",
"configured": true,
"supported_sources": ["meta", "facebook", "instagram", "whatsapp", "website", "google"],
"source_hint": "website",
"supported_methods": ["POST"]
}
POST
https://www.softwireapp.in/api/webhooks/1/leads/website
Ingest lead
Accepts JSON lead payloads. Auth with X-Softwire-Webhook-Secret from CRM → Lead sources.
Headers
Name Description
X-Softwire-Webhook-Secret
Lead capture secret (regenerate from CRM → Sources)
Content-Type
application/json
Request body
{
"name": "Priya Sharma",
"email": "priya@example.com",
"phone": "+919876543210",
"company": "Acme Retail",
"message": "Interested in HRMS demo"
}
cURL
PHP
Laravel
Java
.NET
Python
Node.js
Request
Copy
curl -X POST "https://www.softwireapp.in/api/webhooks/1/leads/website\" \
-H "Accept: application/json\" \
-H "X-Softwire-Webhook-Secret: your_webhook_secret\" \
-H "Content-Type: your_value\" \
-H "Content-Type: application/json\" \
-d '{"name":"Priya Sharma","email":"priya@example.com","phone":"+919876543210","company":"Acme Retail","message":"Interested in HRMS demo"}'
Request
Copy
<?php
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/leads/website';
$headers = [
'Accept: application/json',
'X-Softwire-Webhook-Secret: your_webhook_secret',
'Content-Type: your_value',
'Content-Type: application/json',
];
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => '{"name":"Priya Sharma","email":"priya@example.com","phone":"+919876543210","company":"Acme Retail","message":"Interested in HRMS demo"}',
CURLOPT_HTTPHEADER => $headers,
]);
$response = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo $status.PHP_EOL;
echo $response.PHP_EOL;
Request
Copy
<?php
use Illuminate\Support\Facades\Http;
$token = 'softwire_your_token_here';
$url = 'https://www.softwireapp.in/api/webhooks/1/leads/website';
$request = Http::withToken($token)->acceptJson();
$request = $request->withHeaders(['X-Softwire-Webhook-Secret' => 'YOUR_X_SOFTWIRE_WEBHOOK_SECRET']);
$request = $request->withHeaders(['Content-Type' => 'YOUR_CONTENT_TYPE']);
$payload = array (
'name' => 'Priya Sharma',
'email' => 'priya@example.com',
'phone' => '+919876543210',
'company' => 'Acme Retail',
'message' => 'Interested in HRMS demo',
);
$response = $request->post($url, $payload);
$response->throw();
$data = $response->json();
return $data;
Request
Copy
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String token = "softwire_your_token_here";
String url = "https://www.softwireapp.in/api/webhooks/1/leads/website";
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Accept", "application/json")
.header("X-Softwire-Webhook-Secret", "your_webhook_secret")
.header("Content-Type", "your_value")
.header("Content-Type", "application/json")
.method("POST", HttpRequest.BodyPublishers.ofString("{\"name\":\"Priya Sharma\",\"email\":\"priya@example.com\",\"phone\":\"+919876543210\",\"company\":\"Acme Retail\",\"message\":\"Interested in HRMS demo\"}"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.statusCode());
System.out.println(response.body());
Request
Copy
using System.Net.Http.Headers;
using System.Text;
var token = "softwire_your_token_here";
var url = "https://www.softwireapp.in/api/webhooks/1/leads/website";
using var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("X-Softwire-Webhook-Secret", "YOUR_SECRET");
client.DefaultRequestHeaders.Add("Content-Type", "YOUR_SECRET");
var json = @"{"name":"Priya Sharma","email":"priya@example.com","phone":"+919876543210","company":"Acme Retail","message":"Interested in HRMS demo"}";
using var content = new StringContent(json, Encoding.UTF8, "application/json");
var response = await client.postAsync(url, content);
response.EnsureSuccessStatusCode();
var result = await response.Content.ReadAsStringAsync();
Console.WriteLine(result);
Request
Copy
import requests
url = "https://www.softwireapp.in/api/webhooks/1/leads/website"
headers = {
"Accept": "application/json",
"X-Softwire-Webhook-Secret": "your_webhook_secret",
"Content-Type": "your_value",
"Content-Type": "application/json",
}
payload = {
"name": "Priya Sharma",
"email": "priya@example.com",
"phone": "+919876543210",
"company": "Acme Retail",
"message": "Interested in HRMS demo"
}
response = requests.post(url, headers=headers, json=payload)
response.raise_for_status()
print(response.status_code)
print(response.json())
Request
Copy
const url = "https://www.softwireapp.in/api/webhooks/1/leads/website";
const headers = {
"Accept": "application/json",
"X-Softwire-Webhook-Secret": "your_webhook_secret",
"Content-Type": "application/json"
};
const options = {
method: 'POST',
headers,
body: JSON.stringify({
"name": "Priya Sharma",
"email": "priya@example.com",
"phone": "+919876543210",
"company": "Acme Retail",
"message": "Interested in HRMS demo"
}),
};
const response = await fetch(url, options);
if (!response.ok) throw new Error('HTTP ' + response.status);
const data = await response.json();
console.log(data);
Response 200
Copy
{
"received": true,
"lead_created": true,
"duplicate": false,
"skipped": false,
"reason": null,
"lead_id": 42,
"source": "website"
}
Integrations
Outbound webhooks
Subscribe to workspace events under Integrations → Webhooks . Softwire POSTs JSON to your URL with HMAC signature verification.
Delivery headers
Header Description
Content-Typeapplication/json
X-Softwire-EventEvent name (e.g. ticket.created)
X-Softwire-SignatureHMAC-SHA256 of the raw body using your webhook secret
Supported events
Event Description
ticket.created
Fired when a new ticket is created in the workspace.
ticket.updated
Fired when ticket fields or assignment change.
ticket.resolved
Fired when a ticket moves to a resolved/closed state.
task.created
Fired when a task is created.
task.updated
Fired when a task is updated.
message.created
Fired when a channel message is posted.
project.updated
Fired when project metadata or status changes.
Example payload
{
"event": "ticket.created",
"workspace_id": 1,
"timestamp": "2026-08-20T10:00:00+00:00",
"ticket": {
"id": 12,
"ticket_number": "TKT-012",
"title": "Login issue on mobile",
"status": "open",
"priority": "high"
}
}
Copy
Rate limits
Authenticated v1 endpoints and inbound webhook routes share a limit of 120 requests per minute per IP or token. Exceeding the limit returns 429 Too Many Requests with a standard Laravel throttle response.
Errors
Error responses use JSON when possible. Common status codes:
Status Meaning
401Missing or invalid bearer token
403Token lacks required scope or workspace mismatch
404Workspace or integration not found / not configured
422Validation failed — e.g. missing employee/device fields, device_not_found, employee_not_found (attendance webhooks include registered_devices)
429Rate limit exceeded
500Unexpected server error