Softwire API
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.

Request · list tickets
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
<?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
<?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
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
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
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
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

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.

ScopeAccessStatus
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

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}/…

Inbound webhooks use a separate base without bearer auth:

https://www.softwireapp.in/api/webhooks/{workspace}/…

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.

MethodPathScopeDescription
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 modules

Every Softwire module is documented here. REST endpoints marked Live are available today; Planned scopes are on the roadmap.

ModuleREST APIWebhooksDescription
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).

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.

Request
curl -X GET "https://www.softwireapp.in/api/v1/workspaces/1/tickets\" \
  -H "Accept: application/json\" \
  -H "Authorization: Bearer softwire_your_token_here\"
Request
<?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
<?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
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
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
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
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
{
  "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"]
}
Request
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
<?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
<?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
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
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
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
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
{
  "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" }
  }
}

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"]
}
Request
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
<?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
<?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
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
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
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
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
{
  "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" }
  }
}

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.

Request
curl -X GET "https://www.softwireapp.in/api/v1/workspaces/1/projects\" \
  -H "Accept: application/json\" \
  -H "Authorization: Bearer softwire_your_token_here\"
Request
<?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
<?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
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
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
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
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
{
  "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"
    }
  ]
}

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.

Request
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
<?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
<?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
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
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
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
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
{
  "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"
}
Request
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
<?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
<?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
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
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
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
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
{
  "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
}

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.

Request
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
<?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
<?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
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
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
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
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
{
  "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
}
Request
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
<?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
<?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
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
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
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
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
{
  "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"
  }
}

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.

Request
curl -X GET "https://www.softwireapp.in/api/webhooks/1/github\" \
  -H "Accept: application/json\"
Request
<?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
<?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
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
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
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
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
{
  "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

NameDescription
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"
  }
}
Request
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
<?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
<?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
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
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
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
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
{
  "received": true,
  "event": "issues",
  "stored": 1,
  "ticket_created": true,
  "ticket_number": "TKT-015"
}

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.

Request
curl -X GET "https://www.softwireapp.in/api/webhooks/1/errors\" \
  -H "Accept: application/json\"
Request
<?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
<?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
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
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
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
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
{
  "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

NameDescription
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"
}
Request
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
<?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
<?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
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
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
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
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
{
  "received": true,
  "ticket_created": true,
  "ticket_number": "TKT-016",
  "ticket_id": 16
}

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.

Request
curl -X GET "https://www.softwireapp.in/api/webhooks/1/attendance\" \
  -H "Accept: application/json\"
Request
<?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
<?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
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
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
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
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
{
  "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

NameDescription
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"
}
Request
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
<?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
<?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
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
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
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
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
{
  "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"
}
Request
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
<?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
<?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
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
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
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
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
{
  "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"
    }
  ]
}

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.

Request
curl -X GET "https://www.softwireapp.in/api/webhooks/1/leads/website\" \
  -H "Accept: application/json\"
Request
<?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
<?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
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
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
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
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
{
  "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

NameDescription
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"
}
Request
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
<?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
<?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
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
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
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
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
{
  "received": true,
  "lead_created": true,
  "duplicate": false,
  "skipped": false,
  "reason": null,
  "lead_id": 42,
  "source": "website"
}

Outbound webhooks

Subscribe to workspace events under Integrations → Webhooks. Softwire POSTs JSON to your URL with HMAC signature verification.

Delivery headers

HeaderDescription
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

EventDescription
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

ticket.created.json
{
  "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"
  }
}

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:

StatusMeaning
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