Back to neotek ↗Get Sandbox Access

Sadq Signature Lite

POSThttps://test.api.neotek.sa/digital-signature-lite/v1/sign-documents

Sandbox URL · in Production call https://api.neotek.sa

Signs a PDF through Sadq and returns it base64-encoded.

Body — everything sits under a top-level Data object.

Data.KYCInformation identifies the signatory and the organisation vouching for them:

ParameterRequiredDescription
UserConsentObtainedRequiredmust be true. You are legally undertaking that you informed the user and took explicit consent
RKANameRequiredlegal name of the organisation acting as Reliable KYC Agency
KYCIdRequiredthe signatory's unique id in the RKA database
ArabicNameRequiredname in Arabic, up to 100 characters
RegionProvinceRequiredup to 25 characters
CountryRequiredISO 3166 alpha-2, for example SA
EnglishNameOptionalup to 100 characters
MobileNumberOptionalup to 15 characters
EmailOptionalvalid format, up to 100 characters
AddressOptionalup to 100 characters

Data.DocumentDetails is an array, one entry per document:

ParameterRequiredDescription
DocumentRequiredthe PDF as a base64 string
SignerInformation.SignedByRequiredname of the signer
SignerInformation.AllowMultipleSigningsRequiredwhether the document can be signed more than once
SignerInformation.LocationOptional
SignerInformation.ReasonOptional
SigningFormatOptionalomit the whole block to accept the defaults below

SigningFormat — every field is optional:

FieldDefaultValues
PageSigningModeAllAll, Even, Odd, Last, First, PageLevel, Specify
SigningPositionBottomRightNine positions, TopLeft through BottomRight
PagesToBeSignedComma-separated. Only used with PageSigningMode: Specify
SigningCoordinatesPerPagepage,x1,y1,x2,y2, semicolon-separated for several pages
SignatureHasImageNoImageNoImage, CustomLogo, EmdhaLogo
SignatureImageBase64. Only used with CustomLogo
SignatureImagePositionLeftOfTextLeftOfText, RightOfText. Only with CustomLogo
SignatureContentDigitally Signed. Name: Date:Overrides the default signature text
SignatureFontSize8Positive integers only

Headers:

ParameterRequiredDescription
authorizationRequiredBearer <ACCESS_TOKEN>, with scope digital_signature
content-typeRequiredapplication/json
x-request-idOptionalan RFC 4122 UUID you generate; quote it when raising a support ticket
sub-clientOptionalidentifies the downstream consumer when one client fronts several
cURL
curl -X POST 'https://test.api.neotek.sa/digital-signature-lite/v1/sign-documents' \  -H 'Authorization: Bearer <ACCESS_TOKEN>' \  -H 'Content-Type: application/json' \  -d '{  "Data": {    "KYCInformation": {      "UserConsentObtained": true,      "RKAName": "<organisation legal name>",      "KYCId": "<signatory id>",      "EnglishName": "<name in English>",      "ArabicName": "<name in Arabic>",      "MobileNumber": "<mobile>",      "Email": "<email>",      "Address": null,      "RegionProvince": "Central Region",      "Country": "SA"    },    "DocumentDetails": [      {        "Document": "<base64 PDF>",        "SignerInformation": {          "SignedBy": "<signer name>",          "Location": null,          "Reason": null,          "AllowMultipleSignings": false        },        "SigningFormat": {          "PageSigningMode": "All",          "SigningPosition": "BottomRight",          "PagesToBeSigned": null,          "SigningCoordinatesPerPage": null,          "SignatureHasImage": "EmdhaLogo",          "SignatureImage": null,          "SignatureImagePosition": "LeftOfText",          "SignatureContent": null,          "SignatureFontSize": 8        }      }    ]  }}'

Response (Document truncated — the real value is the full base64-encoded signed PDF)

JSON
{  "Data": {    "DocumentDetails": [      {        "Document": "JVBERi0xLjUNCiW1tbW1DQoxIDAgb2JqDQo8PC9UeXBlL0NhdGFsb2cvUGFnZXMgMiAwIFIvTGFuZyhlbi1VUykgL1N0cnVjdFRyZWVSb290IDE2IDAgUi9NYXJrSW5mbzw8L01hcmtlZCB0cnVlPj4+Pg…",        "SignerInformation": {          "SignedBy": "<signer name>",          "AllowMultipleSignings": false        }      }    ]  }}

Errors

CodeStatusCause and Action
400Bad RequestMissing required field, or a value that fails validation — check Code and Path in the body
401UnauthorizedBearer token missing, expired, or invalid
403ForbiddenToken doesn't carry the digital_signature scope
404Not FoundNo resource matches the identifier provided
405Method Not AllowedHTTP verb not supported on that path
406Not AcceptableAccept header doesn't match a supported representation
415Unsupported Media TypeContent-Type missing or wrong
429Too Many RequestsRate limit exceeded
500Internal Server ErrorServer error — retry with backoff, quote your x-request-id