VideoPD APIs
Video PD API
Signzy Video Personal Discussion – Integration Specification
Prepared By | Signzy Team |
|---|---|
Creation Date | 15 September 2026 |
Last Updated | 16 September 2026 |
Document Version | 1.1.0 |
Environment | Demo / Pre-production |
Purpose:
This document describes the Signzy Video PD (Video Personal Discussion) APIs that are to be consumed for integrating the Video PD journey into a third-party system (for example, Salesforce or a Loan Origination System). The integration flow, request and response contracts remain identical irrespective of the calling system.
APIs:
The below Signzy APIs are to be used, in the sequence given:
- Agent Login API – generates the bearer token used to authorise the subsequent calls.
- Create Call API – schedules a new Video PD call and returns the session ID.
- Follow-up Call API – schedules a follow-up call against an already created session.
Base URL
https://videopd-demo.signzy.app
Portal Access (Demo Environment)
Role | Portal URL | Username | Password |
|---|---|---|---|
Agent | https://videopd-demo.signzy.app/agent/login | XXXXX | YYYYYY |
Auditor | https://videopd-demo.signzy.app/auditor/login | WWWW | ZZZZZZ |
Note: The above are demo-environment credentials only. Production credentials and the production base URL will be shared separately over a secure channel (1:1).
Before You Start — Rate Limits
The Agent Login endpoint is throttled. Exceeding any of the limits below returns HTTP 429 with the remaining wait time.
Limit | Threshold | Window |
|---|---|---|
Failed logins per account | 5 | 30 minutes |
Failed logins per IP address | 10 | 30 minutes |
Total requests per IP address | 50 | 30 minutes |
Cache the agent token for its full lifetime and reuse it across calls; do not log in before every Create Call or Follow-up Call request — a per-request login loop will exhaust these limits and lock the integration out for 30 minutes.
Two-Factor Authentication
If the agent account has requires2FA set to true, the agent portal (UI) will prompt for an OTP on login. This does not affect the API: the token returned by the Agent Login API is issued and fully usable regardless of the requires2FA value. It is recommended to use an agent account with 2FA disabled for the integration.
Token Lifetime
The 24-hour default applies to both the agent token and the auditor portal token, and both are configurable per environment. The participant’s joining link is not.
Token | Default Lifetime | Configurable |
|---|---|---|
Agent API token (this document) | 24 hours | Yes |
Auditor portal token | 24 hours | Yes |
Participant joining link | 24 hours | No |
Note: there is currently no token revocation or refresh mechanism. Extending the lifetime enlarges the exposure window of a bearer token that cannot be revoked; if the goal is simply to avoid frequent logins, caching the token for its existing 24-hour lifetime (see Rate Limits above) is the safer fix.
1. Agent Login API
This API authenticates the agent and returns a JWT bearer token, already prefixed with "Bearer ". The token returned here must be passed in the Authorization header of the Create Call and Follow-up Call APIs exactly as received.
Endpoint
POST https://videopd-demo.signzy.app/backend/agent/login
Headers
Header | Value | Mandatory |
|---|---|---|
Content-Type | application/json | Y |
Request –
{
"username": "XXXX",
"password": "YYYYY"
}Field Name | Sample Data | Type | Mandatory |
|---|---|---|---|
username | XXXXX | String | Y |
password | YYYYY | String | Y |
Response –
The response returns the agent profile along with the token. The token payload contains the agentId, auditorId, email and role, and carries an expiry (exp) claim — the default validity is 24 hours from the time of issue, but this can be configured based on requirement.
{
"_id": "6948acba636e214f44f43a45",
"username": "<AGENT_USERNAME>",
"name": "Agent Name",
"email": "[email protected]",
"companyName": "Example Financial Services",
"requires2FA": false,
"token": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.<payload>.<signature>"
}Field Name | Description | Type |
|---|---|---|
_id | Unique internal identifier of the agent record. | String |
username | Login username of the authenticated agent. | String |
name | Full name of the agent. | String |
Registered email address of the agent. | String | |
companyName | Name of the company / organisation the agent is associated with. | String |
requires2FA | Whether 2FA is enabled for this agent on the portal. Does not affect API token usability. | Boolean |
token | JWT bearer token, already prefixed with "Bearer ", to be used in the Authorization header of all subsequent Video PD API calls exactly as returned. Default validity 24 hours, configurable. | String |
Agent Login cURL
curl --location 'https://videopd-demo.signzy.app/backend/agent/login' \
--header 'Content-Type: application/json' \
--data-raw '{
"username": "XXXXX",
"password": "YYYYY"
}'
2. Create Call API
This API schedules a new Video PD call for one or more participants. On success it returns a session object (HTTP 201) containing session.sessionId, which must be retained by the calling system as it is required to raise a follow-up call against the same case.
Endpoint
POST https://videopd-demo.signzy.app/backend/session/create
Headers
Header | Value | Mandatory |
|---|---|---|
Content-Type | application/json | Y |
Accept | application/json | N |
Authorization | Bearer <AGENT_ACCESS_TOKEN> (token from the Agent Login API, used exactly as returned) | Y |
Request –
{
"title": "title6",
"date": "2026-10-08T00:00:00.000Z",
"startTime": "2026-10-08T10:30:00.000Z",
"endTime": "2026-10-08T11:00:00.000Z",
"participants": [
{
"name": "Sample User",
"email": "[email protected]",
"mobile": "9876543210",
"scheduledLocation": {
"address": "XYZ, 560078",
"latitude": 12.8978624,
"longitude": 77.58450839999999
}
}
],
"identifier": "4471982",
"questionnaireId": "6948ae1c636e214f44f4xxxx",
"location": {
"address": "XYZ, 560078",
"latitude": 12.8978624,
"longitude": 77.58450839999999
}
}
Up to four participants can be added in the array above — the agent portal supports four per call, but the API does not enforce a hard limit; cap the count on your side.
Field Name | Description | Type | Mandatory |
|---|---|---|---|
title | Title/label for the Video PD call. | String | Y |
date | Date on which the call is being scheduled (ISO 8601, UTC). | String | Y |
startTime | Scheduled start time of the call (ISO 8601, UTC). | String | Y |
endTime | Scheduled end time of the call (ISO 8601, UTC). | String | Y |
participants | Array of participant objects. The agent portal supports up to four per call; the API itself does not enforce this cap. | Array | Y |
participants[].name | Full name of the call participant. | String | Y |
participants[].email | Email address of the call participant. Must be a valid email — it is format-validated and receives the joining link. | String | Y |
participants[].mobile | Mobile number of the call participant. Must be a valid Indian mobile number — 10 digits starting 6–9, optionally prefixed +91. | String | Y |
participants[].scheduledLocation | Location at which the participant is expected to join the call. | Object | N |
address | Address text for the participant’s location. | String | N |
latitude | Latitude of the participant’s location. | Number | N |
longitude | Longitude of the participant’s location. | Number | N |
identifier | Caller’s own unique reference for this case (e.g. LOS application number). Must be unique across every Video PD call. | String | Y |
questionnaireId | ID of the questionnaire (use case configured in Auditor Portal) to run during the call. IDs come from GET /backend/questionnaire/use-cases/agent. | String | N |
location | Call-level location, same shape as scheduledLocation. | Object | N |
Note: identifier must be unique across every Video PD call. Creating a second call with an identifier that already exists is rejected — treat this as "this case already has a Video PD call" and look up the existing one rather than retrying with the same value. The same identifier must also be passed again while raising a follow-up call, so that the follow-up is linked to the correct Video PD case. Unrecognised body fields are silently dropped, not rejected — a misspelled field will not error, it will simply be missing from the created call.
Response –
The record is returned nested under session. Remaining bookkeeping fields inside it (_id, createdAt, updatedAt, participants[]._id, etc.) can be ignored by the integration.
201 Created
{
"session": {
"sessionId": "01KPQFY68T4ZS0CY78JNP8XXXX",
"title": "title6",
"date": "2026-10-08T00:00:00.000Z",
"startTime": "2026-10-08T10:30:00.000Z",
"endTime": "2026-10-08T11:00:00.000Z",
"identifier": "4471982",
"questionnaireId": "6948ae1c636e214f44f4xxxx",
"applicationStatus": "incomplete",
"isFollowUpCall": false,
"parentSessionId": null,
"participants": [
{
"_id": "...",
"name": "Sample User",
"email": "[email protected]",
"mobile": "9876543210",
"scheduledLocation": { "..." : "..." },
"inviteStatus": "pending",
"joined": false
}
],
"_id": "...",
"createdAt": "...",
"updatedAt": "..."
}
}
Field Name | Description | Type |
|---|---|---|
session.sessionId | Unique ID of the scheduled Video PD session. To be stored by the calling system and used in the Follow-up Call API URL. | String |
session.identifier | Echo of the case identifier submitted in the request. | String |
Create Call cURL
curl --location 'https://videopd-demo.signzy.app/backend/session/create' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <AGENT_ACCESS_TOKEN>' \
--data-raw '{
"title": "title6",
"date": "2026-10-08T00:00:00.000Z",
"startTime": "2026-10-08T10:30:00.000Z",
"endTime": "2026-10-08T11:00:00.000Z",
"participants": [
{
"name": "Sample User",
"email": "[email protected]",
"mobile": "9876543210",
"scheduledLocation": {
"address": "XYZ, 560078",
"latitude": 12.8978624,
"longitude": 77.58450839999999
}
}
],
"identifier": "4471982",
"questionnaireId": "6948ae1c636e214f44f4xxxx"
}'
3. Follow-up Call API
This API schedules a follow-up call against an existing Video PD session. The session ID returned by the Create Call API is appended to the URL, and the same identifier used at the time of creation must be passed in the request body so that the follow-up is mapped to the correct case.
Endpoint
POST https://videopd-demo.signzy.app/backend/session/follow-up/{sessionId}
Path Parameter
Parameter | Description | Sample Data | Type | Mandatory |
|---|---|---|---|---|
sessionId | The parent call’s sessionId — the 26-character ULID returned as session.sessionId in the Create Call response (not the _id field alongside it). | 01KPQFY68T4ZS0CY78JNP8XXXX | String | Y |
Headers
Header | Value | Mandatory |
|---|---|---|
Content-Type | application/json | Y |
Accept | application/json | N |
Authorization | Bearer <AGENT_ACCESS_TOKEN> (token from the Agent Login API, used exactly as returned) | Y |
Request –
{
"title": "Follow-up: title6",
"date": "2026-10-09T07:45:00.000Z",
"startTime": "2026-10-09T07:45:00.000Z",
"endTime": "2026-10-09T08:15:00.000Z",
"participants": [
{
"name": "Sample User",
"email": "[email protected]",
"mobile": "9876543210",
"scheduledLocation": {
"address": "XYZ, 560078",
"latitude": 12.8978624,
"longitude": 77.58450839999999
}
}
],
"identifier": "4471982",
"questionnaireId": "6948ae1c636e214f44f4xxxx"
}
Field Name | Description | Type | Mandatory |
|---|---|---|---|
title | Title/label for the follow-up call. | String | Y |
date | Date on which the follow-up call is being scheduled (ISO 8601, UTC). | String | Y |
startTime | Scheduled start time of the follow-up call (ISO 8601, UTC). | String | Y |
endTime | Scheduled end time of the follow-up call (ISO 8601, UTC). | String | Y |
participants | Array of participant objects, same structure and rules as the Create Call API. | Array | Y |
identifier | Identifier of the original call against which the follow-up is being raised. Must be passed, and must match the identifier used at the time of creation exactly. | String | Y |
questionnaireId | ID of the questionnaire to be used for the follow-up call session. Defaults to none if omitted. | String | N |
Response –
The follow-up is created as a new call with its own session.sessionId; the parent call’s applicationStatus flips to "follow-up scheduled".
201 Created
{
"message": "Follow-up created",
"session": {
"sessionId": "01KPQFY68T4ZS0CY78JNP8YYYY",
"title": "Follow-up: title6",
"date": "2026-10-09T07:45:00.000Z",
"startTime": "2026-10-09T07:45:00.000Z",
"endTime": "2026-10-09T08:15:00.000Z",
"identifier": "4471982",
"questionnaireId": "6948ae1c636e214f44f4xxxx",
"applicationStatus": "incomplete",//"completed", "follow-up", "incomplete", "follow-up scheduled", "cancelled", "Feedback Pending", "In Progress"],
default: "incomplete"
"isFollowUpCall": true,
"parentSessionId": "<parent _id>",
"participants": [ "..." ],
"_id": "...",
"createdAt": "...",
"updatedAt": "..."
}
}
Follow-up Call cURL
curl --location 'https://videopd-demo.signzy.app/backend/session/follow-up/01KPQFY68T4ZS0CY78JNP8XXXX' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <AGENT_ACCESS_TOKEN>' \
--data-raw '{
"title": "Follow-up: title6",
"date": "2026-10-09T07:45:00.000Z",
"startTime": "2026-10-09T07:45:00.000Z",
"endTime": "2026-10-09T08:15:00.000Z",
"participants": [
{
"name": "Sample User",
"email": "[email protected]",
"mobile": "9876543210",
"scheduledLocation": {
"address": "XYZ, 560078",
"latitude": 12.8978624,
"longitude": 77.58450839999999
}
}
],
"identifier": "4471982",
"questionnaireId": "6948ae1c636e214f44f4xxxx"
}'
Error Responses
Every error follows the same shape:
{
"status": "error",
"statusCode": 0,
"message": "..."
}
Status Code | Meaning |
|---|---|
400 | Schema validation failure — invalid mobile number or email format, missing required field. |
401 | Bad credentials at login; a doubled or expired Authorization token; agent has no linked auditor. |
403 | Authenticated, but wrong role for this endpoint. |
422 | Addresses could not be geocoded (see Geocoding note under Create Call API). |
429 | Login rate limit exceeded (see Before You Start — Rate Limits). |
500 | Currently returned for a duplicate identifier or a follow-up identifier mismatch. These are user-input validation failures, not server errors — do not treat as transient / retryable. A fix to return 409 / 400 instead is tracked internally. |
Steps To Be Followed
The cURL requests given above are to be set up and executed in the following sequence.
Step 1: Import all three cURL requests (Agent Login, Create Call, Follow-up Call) into Postman as a single collection.
Step 2: Trigger the Agent Login cURL by providing the agent username and password. Demo credentials are given in the Portal Access section above; production credentials will be shared separately over a secure channel.
Step 3: Copy the token returned in the Agent Login response. Its default validity is 24 hours, but this can be configured based on requirement.
Step 4: Set the token value as the Authorization header of the Create Call cURL exactly as returned — it already includes the Bearer prefix, so do not add the word Bearer yourself. The placeholder <AGENT_ACCESS_TOKEN> in the cURL is to be replaced with this value. Cache the token for its lifetime; do not call Agent Login before every Create Call or Follow-up Call request.
Step 5: Trigger the Create Call cURL with the required scheduling details — title, date, startTime, endTime, participant details (name, email, mobile and scheduled location) and the case identifier. The agent portal supports up to four participants per call; the API itself does not enforce this as a hard limit.
Step 6: From the Create Call response, note session.sessionId and retain it against the case in the calling system (Salesforce / LOS). The scheduled call will now be visible on the agent dashboard. The participant will receive the joining link by email always, and by SMS only where SMS invitations are enabled for that environment — both are best-effort, so a 201 response is not proof the participant was reached.
Step 7: To raise a follow-up, append the parent’s session.sessionId received in Step 6 to the Follow-up Call URL, and add the same agent bearer token in the Authorization header.
Step 8: In the Follow-up Call request body, pass the same identifier used in the Create Call request — it is mandatory and must match exactly, or the follow-up is rejected — along with the optional questionnaireId, so that the follow-up is linked to the correct Video PD case. Then trigger the request.
Step 9: Log in to the Auditor portal using the auditor credentials to review the completed Video PD sessions and their recordings.
Sequence Summary
# | API | Method | Endpoint | Auth |
|---|---|---|---|---|
1 | Agent Login | POST | /backend/agent/login | None (public, rate-limited) |
2 | Create Call | POST | /backend/session/create | Bearer token |
3 | Follow-up Call | POST | /backend/session/follow-up/{sessionId} | Bearer token |
Getting Help
If you have any questions, need clarification, or have suggestions to enhance our documentation or services, please don't hesitate to contact us.
Reach out to us at [email protected]