{ "aid": "precisely.se:precisely-1.0.0", "name": "Precisely Public API", "type": "Index", "description": "# Documentation\n\nRead more about our API in our help center [Precisely’s Contract Automation API](https://help.precisely.se/en/articles/4135833-precisely-s-contract-automation-api)\n\nThe Precisely API allows developers to create applications and modules that communicate with the Precisely platform.\n\n## Authentication\n\nAuthentication can be done in two ways.\n\n- bearerAuth, with a jwt from the /authenticate endpoint\n\n- apiKeyAuth, with an api key in the X-API-KEY header [Helpcenter api-tokens](https://help.precisely.se/en/articles/5733009-api-tokens-in-precisely).\n\n## Rate limiting\n\nFor API authenticated requests, you can make up 30 requests / minute per\norganization.\n\nThe returned HTTP headers of any API request show your current rate limit\nstatus:\n\n| Header Name | Description |\n|-----------------------|------------------------------------------------------------------------------|\n| X-Ratelimit-Limit | The maximum number of requests you're permitted to make per minute. |\n| X-Ratelimit-Remaining | The number of requests remaining in the current rate limit window. |\n| X-Ratelimit-Reset | The time at which the current rate limit window resets in UTC epoch seconds. |\n\n## Templates, Projects and Documents\n\nThis is the structure of Precisely, everything starts with the template defining what a Project should contain.\n\n### Template\n\nThe template consists of documentTemplates, references, approval rules and much more.\n\n### DocumentTemplate\n\nDefines the content of the document, default signees and default metadata.\n\n### References\n\nDefines questions to be asked when drafting a project, and the answers can be used in the content of documents as well as document metadata.\n\n### Project\n\nThis is the result of using a template and answering the questions specified, a process we call drafting. It can contain one or more documents.\n\nApprovals are applied on this level, and can be depending on answers given in the drafting process.\n\n### Document\n\nThis is the actual document which can be sent for signing etc.\n\n## Code examples\n\nIn our public repository with examples you can see how different usecases have been solved. If there is something missing let us know and we will try to expand the collection.\n\n[public api examples](https://github.com/Preciselyco/public-api-examples)\n\n## Resthooks\n\nIn order to avoid pulling the api for changes, there is now support for subscribing to events and receiving webhook callbacks when those events happen. This functionality in under development and a bit experimental, the related endpoints might change, before a final release.\n\n### Security\n\nIn order to provide a way of verifying that the origin and payload is valid, the webhook callbacks carry a Precisely-Signature header.\n\n```\n\"Precisely-Signature\": [\n \"t=1660034650,s=KdAi3tIpRM07fjjW6iAu6R97y5WYyGRXNBIHE41V4/c=\"\n ],\n```\n\nThe signature is calculated as:\n\n*t=the time of the event also included in the header. (unix time)*\n\n*payload=the body content as json*\n\n*endpoint secret=is returned when creating a subscription*\n\n\nA SHA-256 hash, using the *endpoint secret* as key, of **t.payload\\n** which then gets encoded with base64.\n\n### Implementation examples\n\n```python\n# python example\nimport hashlib\nimport hmac\nimport base64\n\ndef computeRequestSignature(t, secret, payload):\n mac = hmac.new(bytes(secret, 'utf-8'), digestmod='sha256')\n mac.update(bytes(t, 'utf-8'))\n mac.update(bytes(\".\", 'utf-8'))\n mac.update(payload)\n mac.update(bytes(\"\\n\"))\n digest = mac.digest()\n return base64.b64encode(digest).decode()\n```\n\n```go\n// go example\nfunc computeRequestSignature(t uint64, payload []byte, secret string) string {\n\tmac := hmac.New(sha256.New, []byte(secret))\n\tmac.Write([]byte(fmt.Sprintf(\"%d\", t)))\n\tmac.Write([]byte(\".\"))\n\tmac.Write(payload)\n\tmac.Write([]byte(\"\\n\"))\n\treturn base64.StdEncoding.EncodeToString(mac.Sum(nil))\n}\n```\n\n```c#\n// c# example\nstatic string ComputeRequestSignature(string secret, string t, string payload)\n{\n HMAC mac = new HMACSHA256();\n mac.Key = Encoding.UTF8.GetBytes(secret);\n byte[] hash = mac.ComputeHash(Encoding.UTF8.GetBytes(t + \".\" + payload + \"\\n\"));\n return Convert.ToBase64String(hash);\n}\n\n```\n\n```\nexample information to test with\n\nsecret: 0cbb9eda-d89c-4b83-8faf-fd9f88217894\npayload: {\"id\":\"1699361960656-0\",\"event\":\"events.document.status_changed\",\"data\":{\"type\":\"document_event\",\"object\":{\"id\":\"yd8sqKy\",\"name\":\"combinedDocument\",\"status\":\"draft\",\"fromByName\":\"Tord Holmqvist\",\"message\":\"\",\"fromById\":\"gLdYiOg\"},\"link\":\"http://app.localho.st:80/archive/imported/862?organization=15\",\"organizationId\":15,\"organizationName\":\"local\"},\"subscriptionId\":\"gb8bSEe\"}\nt: 1699361961 (2023-11-07T13:59:21+01:00)\n\nPrecisely-Signature:t=1699361961,s=+XK6b/ECp4AuQ63gBHF9tHzKq4HXdbAYrJ3UbtYci+k=\n\n```\n\n### Events payload\n\nThe events have id, event, data and subscription id properties. Different events can have different data.object payloads, while the type, link, organizationId and organizationName exist for all events.\n\n```\n# events.document.status_changed example\n{\n \"id\": \"1699361960656-0\",\n \"event\": \"events.document.status_changed\",\n \"data\": {\n \"type\": \"document_event\",\n \"object\": {\n \"id\": \"yd8sqKy\",\n \"name\": \"combinedDocument\",\n \"status\": \"draft\",\n \"fromByName\": \"Tord Holmqvist\",\n \"message\": \"\",\n \"fromById\": \"gLdYiOg\"\n },\n \"link\": \"http://app.localho.st:80/archive/imported/862?organization=15\",\n \"organizationId\": 15,\n \"organizationName\": \"local\"\n },\n \"subscriptionId\": \"gb8bSEe\"\n}\n\n```\n\n### Supported events\n\nWhich events that can be subscribed to can be listed with the [Events endpoint](#tag/Experimental/operation/getSubscriptionEventsUsingGET).\n\n### Follow up / Troubleshooting\n\nTo see which events that were triggered for a specific subscription the [Callbacks endpoint](#tag/Experimental/operation/getSubscriptionCallbacksUsingGet) can be used. It lists the events from the last 30 days and if it was delivered successfully.\n\nYou can also resend an event by using the [Resend Callback endpoint](#tag/Experimental/operation/resendSubscriptionEventUsingPost).\n\n#### Resends and disabling of failing subscriptions\n\nEach attempt to deliver the callback will be retried 3 times.\n\nEach subscription with failed deliveries will be retried every hour until there are 10 failed deliveries, in a row. Then the subscription is going to be disabled and must be activated again. A warning email will be sent to the creator of the subscription when this happens.\n\nTo enabled the subscription, use the [Update subscription endpoint](#tag/Experimental/operation/patchSubscriptionsUsingPatch)", "url": "https://raw.githubusercontent.com/jentic/jentic-public-apis/refs/heads/main/apis/openapi/precisely.se/precisely/1.0.0/apis.json", "tags": [ "precisely.se", "precisely" ], "created": "2026-04-08", "modified": "2026-04-08", "specificationVersion": "0.19", "access": "3rd-Party", "maintainers": [ { "FN": "Jentic", "X-github": "jentic", "url": "https://github.com/jentic" } ], "apis": [ { "aid": "precisely.se:precisely-1.0.0", "name": "Precisely Public API", "description": "# Documentation\n\nRead more about our API in our help center [Precisely’s Contract Automation API](https://help.precisely.se/en/articles/4135833-precisely-s-contract-automation-api)\n\nThe Precisely API allows developers to create applications and modules that communicate with the Precisely platform.\n\n## Authentication\n\nAuthentication can be done in two ways.\n\n- bearerAuth, with a jwt from the /authenticate endpoint\n\n- apiKeyAuth, with an api key in the X-API-KEY header [Helpcenter api-tokens](https://help.precisely.se/en/articles/5733009-api-tokens-in-precisely).\n\n## Rate limiting\n\nFor API authenticated requests, you can make up 30 requests / minute per\norganization.\n\nThe returned HTTP headers of any API request show your current rate limit\nstatus:\n\n| Header Name | Description |\n|-----------------------|------------------------------------------------------------------------------|\n| X-Ratelimit-Limit | The maximum number of requests you're permitted to make per minute. |\n| X-Ratelimit-Remaining | The number of requests remaining in the current rate limit window. |\n| X-Ratelimit-Reset | The time at which the current rate limit window resets in UTC epoch seconds. |\n\n## Templates, Projects and Documents\n\nThis is the structure of Precisely, everything starts with the template defining what a Project should contain.\n\n### Template\n\nThe template consists of documentTemplates, references, approval rules and much more.\n\n### DocumentTemplate\n\nDefines the content of the document, default signees and default metadata.\n\n### References\n\nDefines questions to be asked when drafting a project, and the answers can be used in the content of documents as well as document metadata.\n\n### Project\n\nThis is the result of using a template and answering the questions specified, a process we call drafting. It can contain one or more documents.\n\nApprovals are applied on this level, and can be depending on answers given in the drafting process.\n\n### Document\n\nThis is the actual document which can be sent for signing etc.\n\n## Code examples\n\nIn our public repository with examples you can see how different usecases have been solved. If there is something missing let us know and we will try to expand the collection.\n\n[public api examples](https://github.com/Preciselyco/public-api-examples)\n\n## Resthooks\n\nIn order to avoid pulling the api for changes, there is now support for subscribing to events and receiving webhook callbacks when those events happen. This functionality in under development and a bit experimental, the related endpoints might change, before a final release.\n\n### Security\n\nIn order to provide a way of verifying that the origin and payload is valid, the webhook callbacks carry a Precisely-Signature header.\n\n```\n\"Precisely-Signature\": [\n \"t=1660034650,s=KdAi3tIpRM07fjjW6iAu6R97y5WYyGRXNBIHE41V4/c=\"\n ],\n```\n\nThe signature is calculated as:\n\n*t=the time of the event also included in the header. (unix time)*\n\n*payload=the body content as json*\n\n*endpoint secret=is returned when creating a subscription*\n\n\nA SHA-256 hash, using the *endpoint secret* as key, of **t.payload\\n** which then gets encoded with base64.\n\n### Implementation examples\n\n```python\n# python example\nimport hashlib\nimport hmac\nimport base64\n\ndef computeRequestSignature(t, secret, payload):\n mac = hmac.new(bytes(secret, 'utf-8'), digestmod='sha256')\n mac.update(bytes(t, 'utf-8'))\n mac.update(bytes(\".\", 'utf-8'))\n mac.update(payload)\n mac.update(bytes(\"\\n\"))\n digest = mac.digest()\n return base64.b64encode(digest).decode()\n```\n\n```go\n// go example\nfunc computeRequestSignature(t uint64, payload []byte, secret string) string {\n\tmac := hmac.New(sha256.New, []byte(secret))\n\tmac.Write([]byte(fmt.Sprintf(\"%d\", t)))\n\tmac.Write([]byte(\".\"))\n\tmac.Write(payload)\n\tmac.Write([]byte(\"\\n\"))\n\treturn base64.StdEncoding.EncodeToString(mac.Sum(nil))\n}\n```\n\n```c#\n// c# example\nstatic string ComputeRequestSignature(string secret, string t, string payload)\n{\n HMAC mac = new HMACSHA256();\n mac.Key = Encoding.UTF8.GetBytes(secret);\n byte[] hash = mac.ComputeHash(Encoding.UTF8.GetBytes(t + \".\" + payload + \"\\n\"));\n return Convert.ToBase64String(hash);\n}\n\n```\n\n```\nexample information to test with\n\nsecret: 0cbb9eda-d89c-4b83-8faf-fd9f88217894\npayload: {\"id\":\"1699361960656-0\",\"event\":\"events.document.status_changed\",\"data\":{\"type\":\"document_event\",\"object\":{\"id\":\"yd8sqKy\",\"name\":\"combinedDocument\",\"status\":\"draft\",\"fromByName\":\"Tord Holmqvist\",\"message\":\"\",\"fromById\":\"gLdYiOg\"},\"link\":\"http://app.localho.st:80/archive/imported/862?organization=15\",\"organizationId\":15,\"organizationName\":\"local\"},\"subscriptionId\":\"gb8bSEe\"}\nt: 1699361961 (2023-11-07T13:59:21+01:00)\n\nPrecisely-Signature:t=1699361961,s=+XK6b/ECp4AuQ63gBHF9tHzKq4HXdbAYrJ3UbtYci+k=\n\n```\n\n### Events payload\n\nThe events have id, event, data and subscription id properties. Different events can have different data.object payloads, while the type, link, organizationId and organizationName exist for all events.\n\n```\n# events.document.status_changed example\n{\n \"id\": \"1699361960656-0\",\n \"event\": \"events.document.status_changed\",\n \"data\": {\n \"type\": \"document_event\",\n \"object\": {\n \"id\": \"yd8sqKy\",\n \"name\": \"combinedDocument\",\n \"status\": \"draft\",\n \"fromByName\": \"Tord Holmqvist\",\n \"message\": \"\",\n \"fromById\": \"gLdYiOg\"\n },\n \"link\": \"http://app.localho.st:80/archive/imported/862?organization=15\",\n \"organizationId\": 15,\n \"organizationName\": \"local\"\n },\n \"subscriptionId\": \"gb8bSEe\"\n}\n\n```\n\n### Supported events\n\nWhich events that can be subscribed to can be listed with the [Events endpoint](#tag/Experimental/operation/getSubscriptionEventsUsingGET).\n\n### Follow up / Troubleshooting\n\nTo see which events that were triggered for a specific subscription the [Callbacks endpoint](#tag/Experimental/operation/getSubscriptionCallbacksUsingGet) can be used. It lists the events from the last 30 days and if it was delivered successfully.\n\nYou can also resend an event by using the [Resend Callback endpoint](#tag/Experimental/operation/resendSubscriptionEventUsingPost).\n\n#### Resends and disabling of failing subscriptions\n\nEach attempt to deliver the callback will be retried 3 times.\n\nEach subscription with failed deliveries will be retried every hour until there are 10 failed deliveries, in a row. Then the subscription is going to be disabled and must be activated again. A warning email will be sent to the creator of the subscription when this happens.\n\nTo enabled the subscription, use the [Update subscription endpoint](#tag/Experimental/operation/patchSubscriptionsUsingPatch)", "image": "", "baseURL": "https://api.precisely.se", "humanURL": "https://github.com/jentic/jentic-public-apis/tree/main/apis/openapi/precisely.se/precisely/1.0.0", "version": "1.0.0", "tags": [ "precisely.se", "precisely" ], "properties": [ { "type": "OpenAPI", "name": "OpenAPI definition", "url": "https://raw.githubusercontent.com/jentic/jentic-public-apis/refs/heads/main/apis/openapi/precisely.se/precisely/1.0.0/openapi.json", "mediaType": "application/openapi+json" }, { "type": "GitHubRepo", "url": "https://github.com/jentic/jentic-public-apis/tree/main/apis/openapi/precisely.se/precisely/1.0.0" } ], "contact": [ { "FN": "Precisely", "email": "hello@precisely.se", "url": "https://preciselycontracts.com/" } ] } ] }