Bitcoin & NOM-151 Timestamps

Cincel API Reference

Automated machine-to-machine (M2M) API for Legal Timestamps (NOM-151 & Bitcoin Distributed Timestamp Server) and Digital Signatures across Mexico and Latin America.

Service Primary Use Cases Compliance & Proofs
Timestamps Data integrity, binary hashing, compliance archives NOM-151 (PSC Cert), Bitcoin Blockchain, RFC 3161
Digital Signatures Contracts, NDA agreements, onboarding workflows Advanced & Simple E-Signature, Audit Trail PDF, NOM-151

Timestamps

Certification for data messages and files with legally binding NOM-151 certificates and Bitcoin proof.

Quickstart:

  1. Create a Personal Access Token (PAT):

  2. Exchange PAT for a JWT:

    • Request a short-lived token via GET /tokens/jwt with Basic Auth using your PAT as the username and an empty password ({pat}:):
      curl -X GET "https://api.cincel.digital/v3/tokens/jwt" -u "{pat}:"

    Token Lifecycle & Rate Limits: JWTs remain valid for 2 hours. Cache and reuse the Bearer token across requests until expiration. Excessive token generation will trigger HTTP 429 (Too Many Requests).

  3. Request a NOM-151 Certificate (CCMD):

    • Compute the SHA-256 hash (64 hex characters) of your file and request certification via GET /timestamps/{hash}.asn1:
      curl -X GET "https://api.cincel.digital/v3/timestamps/{sha256_hash}.asn1" \
        -H "Authorization: Bearer {jwt}" \
        --output "{sha256_hash}.asn1"
    • Returns the official DER-encoded ASN.1 binary certificate issued by an accredited PSC.
    • For all available formats (.asn1, .asn1.pdf, .tsr, .xml), use GET /timestamps/{hash}.
  4. Public Verification:

    • Verify validity, legal timestamp, and blockchain record anytime at:
      https://audit.cincel.digital/timestamps/{sha256_hash}

Explore the full catalog: Timestamps Endpoints & Schema


Digital Signatures

End-to-end orchestration of legally binding electronic signature workflows with full legal evidence.

Quickstart:

  1. Authenticate via PAT & JWT:

  2. Prepare Team & Folder:

  3. Upload Document & Configure Signers:

  4. Dispatch Signing Invitations:

  5. Download Signed Assets & Evidence:

Explore the full catalog: Digital Signature Endpoints & Schema

🔑AUTHENTICATION REQUIRED
Server: https://api.cincel.digital/v3

Requests to the Cincel API require authorized credentials. Configure your credentials below and Try It Out will automatically inject them into all requests:

get

/teams/{team}/folders/{folder}/documents/{document}/{timestamp*}

Obtain timestamps from a signed document

Downloads a specific legal certificate or cryptographic timestamp generated for a fully signed document.

Prerequisites & Business Rules

  • Document Status: The document must be fully executed (status: signed). Requesting certificates for unsigned or partially signed documents returns HTTP 400 Bad Request ("Document is not fully signed").
  • Certification Completion: Certificates are generated asynchronously upon document execution using the final signed PDF's hash (doc_signed_sha256). If certification is still settling, returns HTTP 404 Not Found.

Supported Formats (timestamp path suffix)

Format File Content Type Certificate Standard
timestamp.asn1 application/octet-stream Official NOM-151 Data Message Conservation Certificate (CCMD) in binary DER format.
timestamp.asn1.pdf application/pdf Human-readable one-page representation of the NOM-151 CCMD.
timestamp.tsr application/octet-stream RFC 3161 Time-Stamp Response binary token.
timestamp.xml application/xml Bitcoin blockchain transaction receipt and cryptographic proof in XML.
timestamp.pdf application/pdf Human-readable blockchain audit certificate PDF.

Example cURL Request

# Download official NOM-151 ASN.1 certificate
curl -X GET "https://api.cincel.digital/v3/teams/{team}/folders/{folder}/documents/{document}/timestamp.asn1" \
  -H "Authorization: Bearer <jwt>" \
  --output "nom151_certificate.asn1"

Related Endpoints

PATH PARAMETERS
teamstringrequired
folderstringrequired
documentstringrequired
timestampstringrequired
DEFINED RESPONSES
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
500Internal server error

Internal server error

Server was not able to process the request due to an unexpected condition.

Please consider creating a support ticket to report this issue

  • Provide as much information as possible
  • Include the resource ID
  • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "Internal server error",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/teams/{team}/folders/{folder}/documents/{document}/{timestamp*}"
get

/timestamps/{hash}

Request a Timestamp

Requests and secures a multi-provider timestamp certification (NOM-151, Bitcoin blockchain, TSR) for a given SHA-256 hash.

Workflow & Credit Rules:

  1. Compute SHA-256 hash: 64 hexadecimal characters representing your file or data payload.
  2. First request (Issuance): Deducts 1 timestamping credit from your team. If asynchronous generation is in progress, returns 202 Accepted.
  3. Idempotency: Once certified, subsequent calls with the same hash return existing certification records without deducting further credits.
  4. Download Formats: Returns 300 Multiple Choices pointing to specific certificate endpoints:
    • GET /timestamps/{hash}.asn1 — Official NOM-151 CCMD binary certificate.
    • GET /timestamps/{hash}.asn1.pdf — Human-readable one-page NOM-151 constancia (PDF).
    • GET /timestamps/{hash}.tsr — RFC 3161 Time-Stamp Response.
    • GET /timestamps/{hash}.xml — Bitcoin blockchain proof XML.

Public Verification:

Anyone can independently audit and verify this timestamp without authentication at:
https://audit.cincel.digital/timestamps/{hash}

Example cURL Request:

curl -X GET "https://api.cincel.digital/v3/timestamps/2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e" \
  -H "Authorization: Bearer <jwt>"
PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
402Payment Required

Payment Required

Request was rejected because relevant account has an outstanding balance.

To fix this

  • Additional credits need to be purchased
  • If required, please consider opening a billing ticket to request a credit limit increase
JSON RESPONSE
{
  "statusCode": 402,
  "error": "Payment Required",
  "message": "Payment Required",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
500Internal server error

Internal server error

Server was not able to process the request due to an unexpected condition.

Please consider creating a support ticket to report this issue

  • Provide as much information as possible
  • Include the resource ID
  • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "Internal server error",
  "validation": {}
}
502Bad Gateway

Bad Gateway

Server was not able to process the request because it received an invalid response from an upstream server.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 502,
  "error": "Bad Gateway",
  "message": "Bad Gateway",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}"
get

/timestamps/{hash}.asn1

Obtain the NOM-151 Timestamp

Requests and downloads the official NOM-151 Data Message Conservation Certificate (Constancia de Conservación de Mensajes de Datos - CCMD) for a given SHA-256 hash.

About NOM-151 CCMD:

In Mexican commercial law (Código de Comercio) and technical standard NOM-151-SCFI-2016, the CCMD certifies that an electronic document or data message has existed and remained unaltered since the moment of certification. It is issued by an authorized Certification Service Provider (Prestador de Servicios de Certificación - PSC) accredited by the Ministry of Economy (Secretaría de Economía).

Prerequisites:

  • SHA-256 Hash: Exactly 64 hexadecimal characters computed from the original binary file or data message.
  • Authentication: A valid JWT token passed via the Authorization: Bearer <jwt> header (see GET /tokens/jwt).
  • Credits: At least 1 timestamping credit available in your team.

API Request:

  • Method & Path: GET /v3/timestamps/{sha256_hash}.asn1
  • Header: Authorization: Bearer <jwt>
curl -X GET "https://api.cincel.digital/v3/timestamps/2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e.asn1" \
  -H "Authorization: Bearer <jwt>" \
  --output "2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e.asn1"

HTTP Responses & Behavior:

  • HTTP 200 OK:
    • The CCMD has been successfully issued and delivered.
    • Content-Type: application/octet-stream
    • Body: Raw binary file containing the ASN.1 structure encoded in DER (Distinguished Encoding Rules), containing the digital signature and certificate chain of the accredited PSC.
  • HTTP 202 Accepted:
    • The request has been accepted and credited: the PSC is currently processing and generating the certificate in the background.
    • Frequent polling is unnecessary—the certification process settles asynchronously within seconds. Once generated, the verification details and legal timestamp become available directly at the public audit page:
      https://audit.cincel.digital/timestamps/{hash}
    • Subsequent requests to this endpoint for the same hash return 200 OK with the cached binary, without consuming additional credits.
  • HTTP 400 Bad Request: Malformed SHA-256 hash (must be exactly 64 hexadecimal characters).
  • HTTP 401 Unauthorized: Missing or expired JWT.
  • HTTP 402 Payment Required: Insufficient timestamping credits on your team. Please contact your sales representative or account manager to purchase additional credits.

Public Verification:

Once issued, any third party or auditor can independently inspect and verify the validity, legal timestamp, and integrity of the CCMD at:
https://audit.cincel.digital/timestamps/{hash}

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
402Payment Required

Payment Required

Request was rejected because relevant account has an outstanding balance.

To fix this

  • Additional credits need to be purchased
  • If required, please consider opening a billing ticket to request a credit limit increase
JSON RESPONSE
{
  "statusCode": 402,
  "error": "Payment Required",
  "message": "Payment Required",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
500Internal server error

Internal server error

Server was not able to process the request due to an unexpected condition.

Please consider creating a support ticket to report this issue

  • Provide as much information as possible
  • Include the resource ID
  • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "Internal server error",
  "validation": {}
}
502Bad Gateway

Bad Gateway

Server was not able to process the request because it received an invalid response from an upstream server.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 502,
  "error": "Bad Gateway",
  "message": "Bad Gateway",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}.asn1"
get

/timestamps/{hash}.asn1.pdf

Obtain the NOM-151 constancia as a PDF

Requests and downloads the NOM-151 Data Message Conservation Certificate (Constancia de Conservación de Mensajes de Datos - CCMD) as a single human-readable PDF page for a given SHA-256 hash.

About NOM-151 Graphical Constancia:

Same certificate as GET /timestamps/{hash}.asn1, rendered as one legible PDF page instead of the binary DER.

Prerequisites:

  • SHA-256 Hash: Exactly 64 hexadecimal characters computed from the original binary file or data message.
  • Authentication: A valid JWT token via Authorization: Bearer <jwt> (see GET /tokens/jwt) for the first request of an unpaid hash.
  • Credits: The first request of an unpaid hash spends 1 credit; any later request on the same hash is free.

API Request:

  • Method & Path: GET /v3/timestamps/{sha256_hash}.asn1.pdf
  • Header: Authorization: Bearer <jwt>
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}.asn1.pdf" \
  -H "Authorization: Bearer <jwt>" \
  --output "{file_name}.pdf"

HTTP Responses & Behavior:

  • HTTP 200 OK: The constancia PDF is delivered (Content-Type: application/pdf).
  • HTTP 202 Accepted: First request only, constancia not stored yet: the PSC is processing. Poll again within seconds; once generated it answers 200 OK without consuming additional credits.
  • HTTP 204 No Content: Hash already paid, no stored constancia. Empty body, same as the ASN.1 route.
  • HTTP 400 Bad Request: Malformed SHA-256 hash (must be exactly 64 hexadecimal characters).
  • HTTP 401 Unauthorized: Missing or expired JWT on the first request of an unpaid hash.
  • HTTP 402 Payment Required: Insufficient credits. Contact your sales representative to purchase more.
  • HTTP 404 Not Found: Unknown hash, or a stored constancia that cannot be rendered as PDF. The ASN.1 route keeps working.

Public Verification:

Verify validity, legal timestamp and integrity at: https://audit.cincel.digital/timestamps/{hash}

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
402Payment Required

Payment Required

Request was rejected because relevant account has an outstanding balance.

To fix this

  • Additional credits need to be purchased
  • If required, please consider opening a billing ticket to request a credit limit increase
JSON RESPONSE
{
  "statusCode": 402,
  "error": "Payment Required",
  "message": "Payment Required",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
500Internal server error

Internal server error

Server was not able to process the request due to an unexpected condition.

Please consider creating a support ticket to report this issue

  • Provide as much information as possible
  • Include the resource ID
  • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "Internal server error",
  "validation": {}
}
502Bad Gateway

Bad Gateway

Server was not able to process the request because it received an invalid response from an upstream server.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 502,
  "error": "Bad Gateway",
  "message": "Bad Gateway",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}.asn1.pdf"
get

/timestamps/{hash}.bitcoin

Obtain the bitcoin timestamp in XML Format

The "Bitcoin Timestamp to XML" API allows you to obtain a Bitcoin timestamp in XML format for a specific hash.
Provides a certified XML representation of the Bitcoin timestamp for the content associated with the provided hash.
You can use this API to obtain a certified XML representation of the Bitcoin timestamp for a specific piece of content
identified by its hash. This is especially valuable for validating the existence and status of a document or data at a specific
time, which can be useful in legal situations, smart contracts, or storing immutable data on the Bitcoin blockchain.

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
200

Successful

XML RESPONSE
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<node value="5e92ec09501a5d39e251a151f84b5e2228312c445eb23b4e1de6360e27bad54b" type="key">
  <left value="7811e3130908fd2678eb2dd3928d245db7f3ed578c21f2ae4fbe680424dc735e" type="mesh">
    <left value="61f48c118002c0e7681e425a3b0e2396475fe0d037ebb0360231b95c2fd60c2f" type="mesh">
      <left value="54280d75669fb9f3ff976c66d03daefa02b691f1aa25558a85f86a5c60961c69" type="mesh">
        <left value="43e89c93c4247511a6eabfe24dfcd331453e04bdde13e688865bf73c3243280a" type="mesh"/>
        <right value="6c127084785466791190c1b4673635274d21e065b9ad9c70d246ef41ba960220" type="mesh">
          <left value="34789458c3010230cef61b6053626ee25f1d79762a76de3517ec5ac2e76ae2e9" type="mesh"/>
          <right value="f375cd66a5552b189a2bfe5f8be433236ff6829dea7bca710e611e98bc7baf0e" type="mesh">
            <left value="5e8d9839b88965971e8f8eb06d2d6bf2f72f75b16100ea175350179c6a82807e" type="mesh">
              <left value="55ed3f4915ab9f93e385f655a2c58c62a5fa2d0e7a4b741263102184e2b7a94f" type="mesh">
                <left value="c04c5bb97b65d009582feb32d88498880216aee8e3bda0c5a0f4ba12244aedb0" type="mesh"/>
                <right value="0bee8d27b7fd9129df599166751af1a9e82bf4e7ac91771f9c15ebf0cb05d74d" type="mesh">
                  <left value="88369cb8594af97fb2ee465d5dc3a01e1e23924b8929faca6fdd7293f97e92be" type="mesh">
                    <left value="d7ed34b6b74056df3cfb2836bfd55c4cd27b5237ad4a6641cf7003d21be76c88" type="mesh"/>
                    <right value="af68501bb80cca4c0bc7d4df6aa2a0c347712e1f2cb1b687a0467e2e9aaf545e" type="mesh">
                      <left value="debd8f8a4aa7af602faa9e8e08f5773c6decc29c9f65e80d70ee90a993170f69" type="mesh">
                        <left value="8a477ae8ff3b601e709321b17f00117159a7efd861abc74286f7ee6479fe46ce" type="mesh">
                          <left value="6a2368efa74c641f2f32d6be8f90a7b6ab5a3235d816faf4034d53d49ce5537c" type="mesh"/>
                          <right value="2796b0a5986fe8f497057da457cdcf51ab9fc0ffb996445434bd08e2257b29e8" type="mesh">
                            <left value="2c5838c92697fe3d5b8aa14e8f67f6fd2ff4c9e12d536332f57434ebcf0f0196" type="mesh"/>
                            <right value="2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e" type="hash"/>
                          </right>
                        </left>
                        <right value="3d2466ee2746f818708f8f396649e0cc4d13738248e8ee051a767474ac2f87d3" type="mesh"/>
                      </left>
                      <right value="130921ae3e04ea13d237a9ed09e33c18574068e8db52e3d7d3d4855d7df3b3ce" type="mesh"/>
                    </right>
                  </left>
                  <right value="8a5d691e559e95448c9aab2d92ba6d58ec9f814ee345e10aee81cf47790d7c2e" type="mesh"/>
                </right>
              </left>
              <right value="55562de568950252020816b6204cbc76820c7c9874c2a4672c99437d99068cf5" type="mesh"/>
            </left>
            <right value="f5fef74b0d216ca6221b024cc5f53d5aee7c9bc33f7289c529f465a0ff2969ea" type="mesh"/>
          </right>
        </right>
      </left>
      <right value="584d06e48bbfe9c5319495b7b3be9eaf7e11aa546ae777575e7e422aafa68fcd" type="mesh"/>
    </left>
    <right value="bf11a94cc0028fe2e0fe476d897da3417cc72777e523d6f0c030c5141bbeb75b" type="mesh"/>
  </left>
  <right value="a62eedb07080ce5a21ad26230bcd50ef37cac8cca43a2f1d946db2d1d47e1f94" type="mesh"/>
</node>
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
402Payment Required

Payment Required

Request was rejected because relevant account has an outstanding balance.

To fix this

  • Additional credits need to be purchased
  • If required, please consider opening a billing ticket to request a credit limit increase
JSON RESPONSE
{
  "statusCode": 402,
  "error": "Payment Required",
  "message": "Payment Required",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
500Internal server error

Internal server error

Server was not able to process the request due to an unexpected condition.

Please consider creating a support ticket to report this issue

  • Provide as much information as possible
  • Include the resource ID
  • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "Internal server error",
  "validation": {}
}
502Bad Gateway

Bad Gateway

Server was not able to process the request because it received an invalid response from an upstream server.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 502,
  "error": "Bad Gateway",
  "message": "Bad Gateway",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}.bitcoin"
get

/timestamps/{hash}.pdf

Obtain the bitcoin timestamp in PDF format

Note

  • This API allows you to get a Bitcoin timestamp in PDF format for a specific hash. Provides a certified PDF representation of the Bitcoin timestamp for content associated with the provided hash. You can use this API to obtain a certified PDF representation of the Bitcoin timestamp for specific content identified by its hash. This is especially valuable for validating the existence and status of a document or data at a specific time, which can be useful in legal situations, smart contracts, or storing immutable data on the Bitcoin blockchain.

To use this API, you must understand the concepts of Bitcoin timestamps and the blockchain, and ensure that you have the appropriate authorization to access the timestamps and related data.

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}.pdf"
get

/timestamps/{hash}.tsr

Download Timestamp (tsr)

Use this API endpoint to request and retrieve a Timestamp (tsr) for a given SHA-256 hash.

Prerequisites

To obtain a .tsr timestamp:

  • Compute the SHA-256 hash of the file or data to certify.
  • A valid JWT token (see how to generate them).
  • Active timestamping credits within your team.

API call

Obtaining a .tsr is a direct GET request:

  • URI path format: /v3/timestamps/{sha-256-hash-hex-encoded}.tsr
  • Authorization header: Authorization: Bearer <jwt>
curl -X GET   "https://api.cincel.digital/v3/timestamps/2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e.tsr"   -H "Authorization: Bearer <jwt>"   --output 2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e.tsr

Public Verification:

Verify and audit the issued timestamp publicly at:
https://audit.cincel.digital/timestamps/{hash}

API call considerations

given examples use our dev and sandbox environments. Please be sure to switch to our prod env for the actual thing!

API response

Successful responses

HTTP 200
  • Successful response is a raw/binary tsr file
  • Successful response mime-type header is 'application/octet-stream'
  • Successful response HTTP status code is 200 O.K.
HTTP 202
  • If request takes more than ~100ms to be processed, HTTP 202 Accepted response will be sent instead.
  • This is not a Server Exception nor a Client Error. By nature, this API is asynchronous and HTTP 202 Accepted answer is given to let you know .tsr is being obtained from upstream on the background, and will be soon available.
  • Please allow about 60 seconds for any upstream latency to be cleared.

Exceptions - HTTP 4XX, 5XX

A range of 4XX and 5XX HTTP responses are also expected, valid HTTP answers for this endpoint. None of these costs you money. Some of them are:

  • HTTP 401 - Unauthorized; please be sure that yout JWT is up to date before retrying. Our JWT tokens have an exp attribute to help you know when they expire.
  • HTTP 402 - PaymentRequired; please be sure to have enough Timestamping credits before retrying.
  • HTTP 403 - Forbidden; please be sure you're sending Authorization headers before retrying.
  • HTTP 404 - NotFound; please be sure you're sending Authorization headers before retrying.
  • HTTP 500 - InternalError; please consider creating a support ticket and provide all the information you think might be useful for us to debug this. Also, we keep track of this events and debug them async.
  • HTTP 502 - BadGateway; this can happen from time to time in distributed systems, please wait a bit and retry. Consider opening a support ticket if this does not autoresolve within a reasonable amount of time.

Decoding, parsing or reading the .tsr

Decoding, parsing or reading the .tsr is out of the scope of this documentation, however, you might find handy to have this tool on your bookmarks: asn1js.eu is Web based, open source ASN.1 JavaScript decoder that will allow you to /see/ what's the tsr encoding.


Timestamp (tsr) and Timestamp (asn1) are somewhat related but they are two separate assets.

If you're interested on Timestamp (tsr), please see our documentation on how to generate them.

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
402Payment Required

Payment Required

Request was rejected because relevant account has an outstanding balance.

To fix this

  • Additional credits need to be purchased
  • If required, please consider opening a billing ticket to request a credit limit increase
JSON RESPONSE
{
  "statusCode": 402,
  "error": "Payment Required",
  "message": "Payment Required",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
500Internal server error

Internal server error

Server was not able to process the request due to an unexpected condition.

Please consider creating a support ticket to report this issue

  • Provide as much information as possible
  • Include the resource ID
  • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 500,
  "error": "Internal server error",
  "message": "Internal server error",
  "validation": {}
}
502Bad Gateway

Bad Gateway

Server was not able to process the request because it received an invalid response from an upstream server.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 502,
  "error": "Bad Gateway",
  "message": "Bad Gateway",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}.tsr"
get

/timestamps/{hash}.xml

Obtain the bitcoin timestamp in XML format

Note

The "Bitcoin Timestamp to XML" API allows you to obtain a Bitcoin timestamp in XML format for a specific hash. Provides a certified XML representation of the Bitcoin timestamp for the content associated with the provided hash.
You can use this API to obtain a certified XML representation of the Bitcoin timestamp for a specific piece of content identified by its hash. This is especially valuable for validating the existence and status of a document or data at a specific time, which can be useful in legal situations, smart contracts, or storing immutable data on the Bitcoin blockchain.'."
.

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
200

Successful

XML RESPONSE
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<node value="5e92ec09501a5d39e251a151f84b5e2228312c445eb23b4e1de6360e27bad54b" type="key">
  <left value="7811e3130908fd2678eb2dd3928d245db7f3ed578c21f2ae4fbe680424dc735e" type="mesh">
    <left value="61f48c118002c0e7681e425a3b0e2396475fe0d037ebb0360231b95c2fd60c2f" type="mesh">
      <left value="54280d75669fb9f3ff976c66d03daefa02b691f1aa25558a85f86a5c60961c69" type="mesh">
        <left value="43e89c93c4247511a6eabfe24dfcd331453e04bdde13e688865bf73c3243280a" type="mesh"/>
        <right value="6c127084785466791190c1b4673635274d21e065b9ad9c70d246ef41ba960220" type="mesh">
          <left value="34789458c3010230cef61b6053626ee25f1d79762a76de3517ec5ac2e76ae2e9" type="mesh"/>
          <right value="f375cd66a5552b189a2bfe5f8be433236ff6829dea7bca710e611e98bc7baf0e" type="mesh">
            <left value="5e8d9839b88965971e8f8eb06d2d6bf2f72f75b16100ea175350179c6a82807e" type="mesh">
              <left value="55ed3f4915ab9f93e385f655a2c58c62a5fa2d0e7a4b741263102184e2b7a94f" type="mesh">
                <left value="c04c5bb97b65d009582feb32d88498880216aee8e3bda0c5a0f4ba12244aedb0" type="mesh"/>
                <right value="0bee8d27b7fd9129df599166751af1a9e82bf4e7ac91771f9c15ebf0cb05d74d" type="mesh">
                  <left value="88369cb8594af97fb2ee465d5dc3a01e1e23924b8929faca6fdd7293f97e92be" type="mesh">
                    <left value="d7ed34b6b74056df3cfb2836bfd55c4cd27b5237ad4a6641cf7003d21be76c88" type="mesh"/>
                    <right value="af68501bb80cca4c0bc7d4df6aa2a0c347712e1f2cb1b687a0467e2e9aaf545e" type="mesh">
                      <left value="debd8f8a4aa7af602faa9e8e08f5773c6decc29c9f65e80d70ee90a993170f69" type="mesh">
                        <left value="8a477ae8ff3b601e709321b17f00117159a7efd861abc74286f7ee6479fe46ce" type="mesh">
                          <left value="6a2368efa74c641f2f32d6be8f90a7b6ab5a3235d816faf4034d53d49ce5537c" type="mesh"/>
                          <right value="2796b0a5986fe8f497057da457cdcf51ab9fc0ffb996445434bd08e2257b29e8" type="mesh">
                            <left value="2c5838c92697fe3d5b8aa14e8f67f6fd2ff4c9e12d536332f57434ebcf0f0196" type="mesh"/>
                            <right value="2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e" type="hash"/>
                          </right>
                        </left>
                        <right value="3d2466ee2746f818708f8f396649e0cc4d13738248e8ee051a767474ac2f87d3" type="mesh"/>
                      </left>
                      <right value="130921ae3e04ea13d237a9ed09e33c18574068e8db52e3d7d3d4855d7df3b3ce" type="mesh"/>
                    </right>
                  </left>
                  <right value="8a5d691e559e95448c9aab2d92ba6d58ec9f814ee345e10aee81cf47790d7c2e" type="mesh"/>
                </right>
              </left>
              <right value="55562de568950252020816b6204cbc76820c7c9874c2a4672c99437d99068cf5" type="mesh"/>
            </left>
            <right value="f5fef74b0d216ca6221b024cc5f53d5aee7c9bc33f7289c529f465a0ff2969ea" type="mesh"/>
          </right>
        </right>
      </left>
      <right value="584d06e48bbfe9c5319495b7b3be9eaf7e11aa546ae777575e7e422aafa68fcd" type="mesh"/>
    </left>
    <right value="bf11a94cc0028fe2e0fe476d897da3417cc72777e523d6f0c030c5141bbeb75b" type="mesh"/>
  </left>
  <right value="a62eedb07080ce5a21ad26230bcd50ef37cac8cca43a2f1d946db2d1d47e1f94" type="mesh"/>
</node>
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
302Found

Found

JSON RESPONSE
"string"
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/{hash}.xml"
get

/timestamps/eth/{hash}.pdf

Obtain the ethereum tiemestamps in PDF Format

This API provides a service to obtain a timestamp in accordance with the NOM-151 regulation.
A timestamp is a digital timestamp that is used to certify the date and time at which a document
or data was created or modified. In the context of the NOM-151 regulation, it is essential to
guarantee the integrity and authenticity of electronic documents, particularly in environments
where a high degree of security and regulatory compliance is required.'."
.

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/eth/{hash}.pdf"
get

/timestamps/eth/{hash}.xml

Get ethereum timestamp in XML Format

This API provides a service that allows obtaining a timestamp related to the Ethereum blockchain and downloading
it in XML format. A timestamp in this context refers to the timestamp associated with an event or transaction on the
Ethereum blockchain. This service is useful for certifying the occurrence of specific events or transactions on the
Ethereum network and providing proof of their existence and moment in time.'."
.

PATH PARAMETERS
hashstringrequired
DEFINED RESPONSES
200

Successful

XML RESPONSE
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<node value="5e92ec09501a5d39e251a151f84b5e2228312c445eb23b4e1de6360e27bad54b" type="key">
  <left value="7811e3130908fd2678eb2dd3928d245db7f3ed578c21f2ae4fbe680424dc735e" type="mesh">
    <left value="61f48c118002c0e7681e425a3b0e2396475fe0d037ebb0360231b95c2fd60c2f" type="mesh">
      <left value="54280d75669fb9f3ff976c66d03daefa02b691f1aa25558a85f86a5c60961c69" type="mesh">
        <left value="43e89c93c4247511a6eabfe24dfcd331453e04bdde13e688865bf73c3243280a" type="mesh"/>
        <right value="6c127084785466791190c1b4673635274d21e065b9ad9c70d246ef41ba960220" type="mesh">
          <left value="34789458c3010230cef61b6053626ee25f1d79762a76de3517ec5ac2e76ae2e9" type="mesh"/>
          <right value="f375cd66a5552b189a2bfe5f8be433236ff6829dea7bca710e611e98bc7baf0e" type="mesh">
            <left value="5e8d9839b88965971e8f8eb06d2d6bf2f72f75b16100ea175350179c6a82807e" type="mesh">
              <left value="55ed3f4915ab9f93e385f655a2c58c62a5fa2d0e7a4b741263102184e2b7a94f" type="mesh">
                <left value="c04c5bb97b65d009582feb32d88498880216aee8e3bda0c5a0f4ba12244aedb0" type="mesh"/>
                <right value="0bee8d27b7fd9129df599166751af1a9e82bf4e7ac91771f9c15ebf0cb05d74d" type="mesh">
                  <left value="88369cb8594af97fb2ee465d5dc3a01e1e23924b8929faca6fdd7293f97e92be" type="mesh">
                    <left value="d7ed34b6b74056df3cfb2836bfd55c4cd27b5237ad4a6641cf7003d21be76c88" type="mesh"/>
                    <right value="af68501bb80cca4c0bc7d4df6aa2a0c347712e1f2cb1b687a0467e2e9aaf545e" type="mesh">
                      <left value="debd8f8a4aa7af602faa9e8e08f5773c6decc29c9f65e80d70ee90a993170f69" type="mesh">
                        <left value="8a477ae8ff3b601e709321b17f00117159a7efd861abc74286f7ee6479fe46ce" type="mesh">
                          <left value="6a2368efa74c641f2f32d6be8f90a7b6ab5a3235d816faf4034d53d49ce5537c" type="mesh"/>
                          <right value="2796b0a5986fe8f497057da457cdcf51ab9fc0ffb996445434bd08e2257b29e8" type="mesh">
                            <left value="2c5838c92697fe3d5b8aa14e8f67f6fd2ff4c9e12d536332f57434ebcf0f0196" type="mesh"/>
                            <right value="2c5d36be542f8f0e7345d77753a5d7ea61a443ba6a9a86bb060332ad56dba38e" type="hash"/>
                          </right>
                        </left>
                        <right value="3d2466ee2746f818708f8f396649e0cc4d13738248e8ee051a767474ac2f87d3" type="mesh"/>
                      </left>
                      <right value="130921ae3e04ea13d237a9ed09e33c18574068e8db52e3d7d3d4855d7df3b3ce" type="mesh"/>
                    </right>
                  </left>
                  <right value="8a5d691e559e95448c9aab2d92ba6d58ec9f814ee345e10aee81cf47790d7c2e" type="mesh"/>
                </right>
              </left>
              <right value="55562de568950252020816b6204cbc76820c7c9874c2a4672c99437d99068cf5" type="mesh"/>
            </left>
            <right value="f5fef74b0d216ca6221b024cc5f53d5aee7c9bc33f7289c529f465a0ff2969ea" type="mesh"/>
          </right>
        </right>
      </left>
      <right value="584d06e48bbfe9c5319495b7b3be9eaf7e11aa546ae777575e7e422aafa68fcd" type="mesh"/>
    </left>
    <right value="bf11a94cc0028fe2e0fe476d897da3417cc72777e523d6f0c030c5141bbeb75b" type="mesh"/>
  </left>
  <right value="a62eedb07080ce5a21ad26230bcd50ef37cac8cca43a2f1d946db2d1d47e1f94" type="mesh"/>
</node>
202

Accepted

JSON RESPONSE
{
  "statusCode": 202,
  "message": "Accepted"
}
302Found

Found

JSON RESPONSE
"string"
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/timestamps/eth/{hash}.xml"
patch

/pats/{pat}

Update the name of a Personal Access Token

PATH PARAMETERS
patstringrequired
REQUEST BODY (JSON)
namestringrequired
Payload (JSON)
{
  "name": "Updated Token Name"
}
DEFINED RESPONSES
200

Successful

JSON RESPONSE
{
  "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "string",
  "token_last_four": "string",
  "expires_at": "2026-12-31",
  "last_used_at": "2026-12-31",
  "created_at": "2026-10-12T22:57:45.430Z"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
403Forbidden

Forbidden

Request contained known credentials, however it was rejected because provided credentials do not have sufficient permissions to access the requested resource.

Possible reasons include:

  • User does not have sufficient permissions to access the requested resource
JSON RESPONSE
{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "Forbidden",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X PATCH "https://api.cincel.digital/v3/pats/{pat}"
delete

/pats/{pat}

Revoke a Personal Access Token

PATH PARAMETERS
patstringrequired
DEFINED RESPONSES
200

Successful

JSON RESPONSE
{
  "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "string",
  "token_last_four": "string",
  "expires_at": "2026-12-31",
  "last_used_at": "2026-12-31",
  "created_at": "2026-10-12T22:57:45.434Z"
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
403Forbidden

Forbidden

Request contained known credentials, however it was rejected because provided credentials do not have sufficient permissions to access the requested resource.

Possible reasons include:

  • User does not have sufficient permissions to access the requested resource
JSON RESPONSE
{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "Forbidden",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X DELETE "https://api.cincel.digital/v3/pats/{pat}"
get

/tokens/jwt

Generate a JSON Web Token

Generates a short-lived JSON Web Token (JWT) required to authenticate all subsequent API calls across documents, digital signatures, and timestamps.

Authentication Methods:

  • Machine-to-Machine (M2M / Recommended): Authenticate using HTTP Basic Auth with your Personal Access Token (PAT) as username and an empty password (<pat>:), created via POST /users/{user}/pats.
  • Interactive: Authenticate using HTTP Basic Auth with your registered email and a one-time passcode (OTP/TOTP) as password (requested via GET /tokens/otp).

M2M Example:

Credential encoding: echo -n "<pat>:" | base64 (the trailing colon indicates an empty password).

# Option 1: Explicit Authorization Basic header
curl -X GET "https://api.cincel.digital/v3/tokens/jwt" \
  -H "Authorization: Basic <pat_base64>"

# Option 2: cURL shorthand
curl -X GET "https://api.cincel.digital/v3/tokens/jwt" -u "<pat>:"

Rate Limits & Token Caching Policy:

  • The issued JWT is valid for 2 hours and should be passed as Authorization: Bearer <jwt> on authenticated endpoints.
  • Do not request a new JWT per transaction. You must cache and reuse the token in memory until close to its expiration. Calling this endpoint excessively will trigger HTTP 429 (Too Many Requests).
DEFINED RESPONSES
200

Successful response

JSON Web Token (JWT) is delivered in plain text

JSON RESPONSE
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIzIiwiaWF0IjoxNjkwMDAwMDAwfQ.fAdjO6lCzML
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
403Forbidden

Forbidden

Request contained known credentials, however it was rejected because provided credentials do not have sufficient permissions to access the requested resource.

Possible reasons include:

  • User does not have sufficient permissions to access the requested resource
JSON RESPONSE
{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "Forbidden",
  "data": {},
  "validation": {}
}
410Gone

Gone

Request was rejected because the requested resource is no longer available.

Possible reasons include:

  • Owner of the resource deleted the resource
  • Staff member deleted the resource on behalf of the owner
JSON RESPONSE
{
  "statusCode": 410,
  "error": "Gone",
  "message": "Gone",
  "validation": {}
}
502Bad Gateway

Bad Gateway

Server was not able to process the request because it received an invalid response from an upstream server.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 502,
  "error": "Bad Gateway",
  "message": "Bad Gateway",
  "validation": {}
}
503Service Unavailable

Service Unavailable

Server is currently not available to handle the request due to scheduled maintenance or a temporary rollout process.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 503,
  "error": "Service Unavailable",
  "message": "Service Unavailable",
  "validation": {}
}
504Gateway Timeout

Gateway Timeout

Server was not able to process the request because it did not receive a response from an upstream server (e.g. an external provider or a server on a different region)#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 504,
  "error": "Gateway Timeout",
  "message": "Gateway Timeout",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/tokens/jwt"
get

/tokens/otp

Get an email-delivered OTP

Request a passwordless authentication attempt for interactive users.

How it works:

  1. Primary Method (Magic Link): An email is sent containing a secure, direct-access Magic Link valid until the end of the next natural day.
  2. Fallback Method (OTP / TOTP): The email also includes a 6-digit One-Time Password (OTP) valid for a short temporal window, useful if opening the Magic Link directly is not possible. Once received, exchange it for a session JWT at GET /tokens/jwt.

Note: This endpoint is strictly for interactive users. Machine-to-machine integrations must generate a Personal Access Token via POST /users/{user}/pats.

Call this endpoint attaching a Basic Auth header with the user email as username (password can be omitted).

DEFINED RESPONSES
201

Successful response

OTP is sent to user email

JSON RESPONSE
{
  "statusCode": 201,
  "message": "OTP sent to foo@bar.com",
  "otp_expires_at": "2023-01-01T00:00:00.000Z",
  "host": "app.cincel.digital",
  "isPro": true
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
402Payment Required

Payment Required

Request was rejected because relevant account has an outstanding balance.

To fix this

  • Additional credits need to be purchased
  • If required, please consider opening a billing ticket to request a credit limit increase
JSON RESPONSE
{
  "statusCode": 402,
  "error": "Payment Required",
  "message": "Payment Required",
  "data": {},
  "validation": {}
}
410Gone

Gone

Request was rejected because the requested resource is no longer available.

Possible reasons include:

  • Owner of the resource deleted the resource
  • Staff member deleted the resource on behalf of the owner
JSON RESPONSE
{
  "statusCode": 410,
  "error": "Gone",
  "message": "Gone",
  "validation": {}
}
502Bad Gateway

Bad Gateway

Server was not able to process the request because it received an invalid response from an upstream server.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 502,
  "error": "Bad Gateway",
  "message": "Bad Gateway",
  "validation": {}
}
503Service Unavailable

Service Unavailable

Server is currently not available to handle the request due to scheduled maintenance or a temporary rollout process.#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 503,
  "error": "Service Unavailable",
  "message": "Service Unavailable",
  "validation": {}
}
504Gateway Timeout

Gateway Timeout

Server was not able to process the request because it did not receive a response from an upstream server (e.g. an external provider or a server on a different region)#### Most of the time, this should be a temporary issue and automatically resolve itself

  • Please try again in a few minutes
  • If the issue persists, please consider creating a support ticket to report this issue
    • Provide as much information as possible
    • Include the resource ID
    • Include steps to reproduce the issue
JSON RESPONSE
{
  "statusCode": 504,
  "error": "Gateway Timeout",
  "message": "Gateway Timeout",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/tokens/otp"
get

/users/{user}/pats

List active Personal Access Tokens for a specific user

PATH PARAMETERS
userintegerrequired
DEFINED RESPONSES
200

Successful

JSON RESPONSE
[
  {
    "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "string",
    "token_last_four": "string",
    "expires_at": "2026-12-31",
    "last_used_at": "2026-12-31",
    "created_at": "2026-10-12T22:57:45.423Z"
  }
]
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
403Forbidden

Forbidden

Request contained known credentials, however it was rejected because provided credentials do not have sufficient permissions to access the requested resource.

Possible reasons include:

  • User does not have sufficient permissions to access the requested resource
JSON RESPONSE
{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "Forbidden",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X GET "https://api.cincel.digital/v3/users/{user}/pats"
post

/users/{user}/pats

Create a new Personal Access Token for a specific user

Generates a Personal Access Token (PAT) for machine-to-machine (M2M) integrations, automated workflows, or non-interactive system access.

How to create a PAT:

  1. Interactive Setup: Authenticate initially using your account credentials (interactive JWT via GET /tokens/otp and GET /tokens/jwt).
  2. Submit request: Send a POST request to /users/{user}/pats with your numerical user ID and token metadata:
    curl -X POST "https://api.cincel.digital/v3/users/{userId}/pats" \
      -H "Authorization: Bearer <interactive_jwt>" \
      -H "Content-Type: application/json" \
      -d '{
        "name": "M2M Production Integration",
        "expires_at": null
      }'
    • name (string, required): Descriptive label for the token.
    • expires_at (ISO 8601 date or null, optional): Expiration timestamp. Set to null for a non-expiring token.

Lifecycle & Revocation:

Important:

  • One-time display: The raw unhashed token secret (token field) is returned in the response only once. Store it securely immediately.
  • Usage: Personal Access Tokens (PATs) are long-lived credentials designed for machine-to-machine (M2M) and automated systems. A PAT is used in Basic Auth (Basic base64(pat:), with an empty password) exclusively to acquire short-lived JWTs via GET /tokens/jwt.
PATH PARAMETERS
userintegerrequired
REQUEST BODY (JSON)
namestringrequired
expires_atstring (date)optional
Payload (JSON)
{
  "name": "CI/CD Deployment Token",
  "expires_at": "2026-12-31"
}
DEFINED RESPONSES
200

Successful

JSON RESPONSE
{
  "token": "string",
  "pat": {
    "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
    "name": "string",
    "token_last_four": "string",
    "expires_at": "2026-12-31",
    "last_used_at": "2026-12-31",
    "created_at": "2026-10-12T22:57:45.368Z"
  }
}
400Bad Request

Bad Request

Request was rejected because it was malformed.

Possible reasons include:

  • Missing required payload
  • Missing required parameters
  • Missing required headers
  • Missing required query parameters
  • Unexpected payload, parameters, headers, or query parameters
JSON RESPONSE
{
  "statusCode": 400,
  "error": "Bad request",
  "message": "Bad request",
  "validation": {}
}
401Unauthorized

Unauthorized

Request was rejected because it did not contain valid authentication credentials.

Possible reasons include:

  • Missing required Basic authentication header
  • Missing required Bearer authentication header
  • Invalid authentication credentials
  • Expired authentication credentials
  • Revoked authentication credentials
  • Disabled authentication credentials

If you are using Basic authentication

  • Ensure user account exists in this environment
  • Ensure that the username and password are correct
  • Keep in mind that user accounts are tied to their respective environment
  • Keep in mind that Basic authentication is case-sensitive

If you are using Bearer authentication

  • Ensure that the token is valid
  • Ensure that the token was issued by this environment
  • Ensure that the token is not expired
  • Keep in mind that tokens are tied to their respective environment
JSON RESPONSE
{
  "statusCode": 401,
  "error": "Unauthorized",
  "message": "Unauthorized",
  "validation": {}
}
403Forbidden

Forbidden

Request contained known credentials, however it was rejected because provided credentials do not have sufficient permissions to access the requested resource.

Possible reasons include:

  • User does not have sufficient permissions to access the requested resource
JSON RESPONSE
{
  "statusCode": 403,
  "error": "Forbidden",
  "message": "Forbidden",
  "data": {},
  "validation": {}
}
404Not found

Not found

Request was rejected because the requested resource does not exist.

Possible reasons include:

  • Requested resource does not exist
  • Default resource is being used instead of a custom resource
JSON RESPONSE
{
  "statusCode": 404,
  "error": "Not found",
  "message": "Not found",
  "validation": {}
}
⚡TRY IT OUT
cURL
Generated cURL Command:
curl -X POST "https://api.cincel.digital/v3/users/{user}/pats"