home

Indirect Tax

Sovos Docs

Show Page Sections

Serbia

Enabling support for Serbia involves confirming prerequisites and product IDs, registering with the Serbian Tax Administration (STA) through the SEF (Sistem e-Faktura) platform, and setting up credentials or registering Sovos as an intermediary.

Prerequisites

  1. Download the API (Application Programming Interface) key from the SEF Portal:
    1. Log in to the SEF portal.

    2. Go to Settings > Company Details.
      Note:

      If necessary, enter or update your company's bank account information.

    3. Click the API icon to generate and download your API authentication key.

  2. Set up the webhooks:
    1. Go to Settings > API Management.

    2. Look for the option Notification endpoint for outgoing documents.

    3. Update the outgoing notification endpoint with the appropriate links for your environment.

    4. Look for the option Notification endpoint for incoming documents.

    5. Update the incoming notification endpoint with the appropriate links for your environment.

UATPROD

SEF portal

https://demoefaktura.mfin.gov.rs/login

https://efaktura.mfin.gov.rs/login

Notification endpoint for outgoing documents

http://mapi.dsp-test.unimaze.com/api/v1/webhooks/rsgov/outbound-invoices

https://mapi.sendill.is/api/v1/webhooks/rsgov/outbound-invoices

Notification endpoint for incoming documents

http://mapi.dsp-test.unimaze.com/api/v1/webhooks/rsgov/inbound-invoices

https://mapi.sendill.is/api/v1/webhooks/rsgov/inbound-invoices

Available products

RS_INV
Category
rs_UBLInvoice__1.0
Outbound product
rs_UBLInvoice_Polling_1.0
Inbound product

Configuration

Create a Company and Assign a Product.

Call the Indirect Tax API companies endpoint and provide the Serbia products:
  • Category: RS_INV

  • Outbound product: rs_UBLInvoice__1.0

  • Inbound product: rs_UBLInvoice_Polling_1.0

Note:

Upload transmission credentials: Credentials need to be set up by Professional Services.

Issue invoice

Invoice clearance in Serbia is based on the Default business process, which follows this order: Mapping, validation, transmission, PDF Generation, distribution, response retrieval, and archive.

The following diagram provides a detailed overview:

Step 1: Supplier creates the Standard Business Document

Every invoice sent to Sovos must be part of a Standard Business Document (SBD). This document includes a Standard Business Document Header (SBDH) and a Sovos Document node, which in turn includes a Sovos Canonical Invoice (SCI). To create the SBD, follow the detailed instructions in the SBDH, Sovos Document, and SCI pages. Here are some key elements that should be included in the SBD and in the invoice.

Besides the SCI format the payload can be also of Serbian UBL 2.1 format.

SCI - Invoice
Use the following values in the SBDH for documents that use the SCI format:
NodeRequiredAttributesValue
StandardBusinessDocumentHeader.Sender.IdentifierYesAuthority="RS" Supplier's tax ID
StandardBusinessDocumentHeader.Receiver.IdentifierYesAuthority="RS"
StandardBusinessDocumentHeader.DocumentIdentification.StandardYesurn:oasis:names:specification:ubl:schema:xsd:Invoice-2
StandardBusinessDocumentHeader.DocumentIdentification.TypeVersionYes2.1
StandardBusinessDocumentHeader.DocumentIdentification.TypeYes Invoice
StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: Country

Child node Identifier: RS

StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: ProcessType

Child node Identifier: Outbound

StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: CompanyCode

Child node Identifier: Supplier's tax ID

StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: SenderDocumentId

Child node Identifier: A unique document ID, whereby the ERP document ID is recommended.

StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: SenderSystemId

Child node Identifier: The system ID configured in the backend. This parameter is used to determine which notifications are returned to the client and what attachments they include. If SenderSystemId is not configured on the client side, it'll assume the default value of "DefaultSystemERP". For more information, see this topic.

StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: Mapping.OutputSchema

Child node Identifier: UBLInvoice

StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: Mapping.TransformDocument

Child node Identifier: SCI-TO-LEGAL_INVOICE

StandardBusinessDocumentHeader.BusinessScope.Scope.BusinessService.BusinessServiceNameYesDefault
StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: BusinessCategory

Child node Identifier: B2B or B2G

SovosDocument.SovosCanonicalInvoice.InvoiceYesSCI
StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: Version

Child node Identifier : 1.0

Local format - Invoice
Alternatively, the supplier can use the local format (XML) instead of SCI. Use the following values in the SBDH for documents that use the local format:
NodeRequiredValue
StandardBusinessDocumentHeader.BusinessScope.Scope (with child nodes)Yes

Child node Type: Mapping.TransformDocument

Child node Identifier: LEGAL-TO-SCI_INVOICE

SovosDocument.SovosLegalDocument.Base64DocumentYesA local format document encoded in base 64.
Note:

The Local Format (XML) document must be Base64-encoded before it can be added as part of the SBD.

</sbd:StandardBusinessDocumentHeader>
<svs:SovosDocument>
	<svs:SovosLegalDocument>
		<enc:Base64Document>
			<enc:EmbeddedDocument id="1" filename="invoice.xml" mimeCode="application/xml">PD94bWwgdmVyc...FRdHVyYT4NCg==<enc:EmbeddedDocument>
		</enc:Base64Document>
	</svs:SovosLegalDocument>
</svs:SovosDocument>
</sbd:StandardBusinessDocument>
Note:

Include all the required nodes as specified in the SBDH schema. If the information cannot be provided, and the respective required node has not been mentioned on the current page, for example the receiver.identifier, the node can be left empty but must still be included in the SBDH.

SBD Sample
Below is a sample of the SBD.
<?xml version="1.0" encoding="UTF-8"?>
<StandardBusinessDocument xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ad="http://www.sovos.com/namespaces/additionalData" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:n0="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2" xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2" xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2" xmlns:cct="urn:un:unece:uncefact:data:specification:CoreComponentTypeSchemaModule:2" xmlns:crn="urn:oasis:names:specification:ubl:schema:xsd:CreditNote-2" xmlns:dbn="urn:oasis:names:specification:ubl:schema:xsd:DebitNote-2" xmlns:enc="http://www.sovos.com/namespaces/base64Document" xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2" xmlns:inv="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2" xmlns:leg="http://www.sovos.com/namespaces/sovosExtensions/LegalExtension" xmlns:qdt="urn:oasis:names:specification:ubl:schema:xsd:QualifiedDataTypes-2" xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2" xmlns:sbc="urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2" xmlns:sbd="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" xmlns:sci="http://www.sovos.com/namespaces/sovosCanonicalInvoice" xmlns:sov="http://www.sovos.com/namespaces/sovosExtensions" xmlns:svs="http://www.sovos.com/namespaces/sovosDocument" xmlns:udt="urn:oasis:names:specification:ubl:schema:xsd:UnqualifiedDataTypes-2" xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" xsi:schemaLocation="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader">
<sbd:StandardBusinessDocumentHeader>
<sbd:HeaderVersion>1.0</sbd:HeaderVersion>
<sbd:Sender>
<sbd:Identifier Authority="RS">SUPPLIER_TAX_ID</sbd:Identifier>
<sbd:ContactInformation>
<sbd:Contact/>
<sbd:EmailAddress/>
<sbd:FaxNumber/>
<sbd:TelephoneNumber/>
<sbd:ContactTypeIdentifier/>
</sbd:ContactInformation>
</sbd:Sender>
<sbd:Receiver>
<sbd:Identifier Authority="RS">BUYER_TAX_ID</sbd:Identifier>
<sbd:ContactInformation>
<sbd:Contact/>
<sbd:EmailAddress/>
<sbd:FaxNumber/>
<sbd:TelephoneNumber/>
<sbd:ContactTypeIdentifier/>
</sbd:ContactInformation>
</sbd:Receiver>
<sbd:DocumentIdentification>
<sbd:Standard>urn:oasis:names:specification:ubl:schema:xsd:Invoice-2</sbd:Standard>
<sbd:TypeVersion>2.1</sbd:TypeVersion>
<sbd:InstanceIdentifier/>
<sbd:Type>Invoice</sbd:Type>
<sbd:MultipleType>false</sbd:MultipleType>
<sbd:CreationDateAndTime>2025-07-04T00:00:00Z</sbd:CreationDateAndTime>
</sbd:DocumentIdentification>
<sbd:BusinessScope>
<sbd:Scope>
<sbd:Type>Country</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>RS</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>Mapping.TransformDocument</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>SCI-TO-LEGAL_INVOICE</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>Mapping.OutputSchema</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>UBLInvoice</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>CompanyCode</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>SUPPLIER_TAX_ID</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>SenderDocumentId</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>RS2025/7/00000007</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>SenderSystemId</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>ERPSystem</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>ProcessType</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>Outbound</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>BusinessProcess</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:BusinessService>
<sbd:BusinessServiceName>Default</sbd:BusinessServiceName>
</sbd:BusinessService>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>BusinessCategory</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>B2G</sbd:Identifier>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>SubSchema</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier/>
</sbd:Scope>
<sbd:Scope>
<sbd:Type>Version</sbd:Type>
<sbd:InstanceIdentifier/>
<sbd:Identifier>1.0</sbd:Identifier>
</sbd:Scope>
</sbd:BusinessScope>
</sbd:StandardBusinessDocumentHeader>
<svs:SovosDocument>
<sci:SovosCanonicalInvoice>
<inv:Invoice>
				*UBL Elements*
</inv:Invoice>
</sci:SovosCanonicalInvoice>
</svs:SovosDocument>
</StandardBusinessDocument>

Step 2: Supplier sends the SBD to Sovos

The supplier sends a POST request to the /documents endpoint.

The request must include the following request body parameters:

NameTypeRequiredDescription
datastringYesSet it to the SBD encoded in Base64, as created in step 1.
dataEncodingstringYes Always set it to "base64".
Request Sample
curl --location --request POST 'https://api-test.sovos.com/v1/documents' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--data-raw '{
	"data": "PD9...d4=",
	"dataEncoding" : "base64"
}'
Response Sample
{
    "timestamp": 1605282724079,
    "status": 202,
    "success": true,
    "message": "Document Received",
    "data": {
        "documentId": "DOCUMENT-ID"
    }
}

Step 3: Sovos maps the SCI into XML

Upon receiving the SCI file, Sovos maps it into the required XML format.

Note:

This step will be skipped if the SBD contains the invoice in the local format (Serbian UBL in XML representation supported only, not Serbian UBL in JSON representation).

Step 4: Sovos validates the XML

Sovos validates the schema based on the information provided by the Tax Authority. If the client's document has errors, Sovos detects them instead of waiting for the Tax Authority's response. This allows Sovos to return errors in a clear and concise manner, which is often not the case when they come from the Tax Authority.

Step 5: Sovos transmits the XML

Sovos transmits the document to the Tax Authority's e-Invoice system (SEF).

Step 6: SEF processes the XML and sends the response to Sovos

SEF validates the schema and verifies that business logic, taxpayer information and duplicates are checked.

After performing its services, the SEF system sends either a success message or a rejection message to Sovos.

Step 7: PDF generation

Sovos generates a PDF that contains the content of the invoice XML in a human-readable format.

Step 8: Distribution

Either Sovos or the taxpayer can communicate the invoice to the Counterparty.

Sovos shares the invoice with the Counterparty

For Sovos to be able to distribute the invoice to the Counterparty, the Taxpayer must have configured an email distribution channel. For more information contact Sovos Professional Services.

Once a distribution channel has been configured, the Taxpayer should no longer send the invoice to the Counterparty.

Taxpayer shares the invoice with their Counterparty

If a distribution channel has not been configured, the Taxpayer is responsible for distributing the invoice to the Counterparty.

When communicating the invoice, it's important to ensure the invoice's authenticity and integrity.

Step 9: Retrieve Counterparty's response

The XML is made available for the Counterparty to retrieve, and potentially accept or reject within 20 days. To make sure the document is correctly categorized, the Scope BusinessCategory in the SBDH is required and should be set, by the client, to either B2B or B2G.

In a B2B flow, if the Counterparty does not respond within 20 days, the document will be deemed rejected (per law).

For B2G flows, when 20 days are due, the document is deemed authorized (also per law).

Taxpayer retrieves the application responses

Clients should configure their Application Response attachments as download links instead of base64-encoded data to avoid potential size limitations when retrieving responses. The default option is download links.

  • When using download links the response contains a URL from where the file can be downloaded.

  • When using binary data, the file itself is embedded in the response encoded in base64.

The ERP system configuration is available through our Professional Services team.

As a response to the initial sending of the document, the client will receive a JSON response message with an HTTP status code of 202 (asynchronous transaction). This means that the supplier must retrieve the application responses that become available during the transaction, which provide status information and also contain the signed XML encoded in Base64.

Clients have the option to retrieve application responses (notifications) in one of two ways:

Fetch everything in one single response (notification)
This means, when polling for responses, Sovos will only return one final notification with SCICloudStatusCode 209 that contains all the relevant attachments/data. Detailed description follows.
Fetch multiple responses (notifications) containing different information
In this case, when polling for responses, Sovos will return multiple notifications with different SCICloudStatusCode values containing different attachments/data until the final one (with status 209) is returned. Detailed description follows.
Single response

To complete a transaction, the supplier retrieves only one notification, the complete workflow one, with SCICloudStatusCode of 209 and all the necessary attachments/data. Afterwards, the notification needs to be parsed for SCIResponseCode value. Possible values for SCIResponseCode:

  • "AP", meaning the document's compliance status has been accepted with all the necessary attachments/data present.

  • "RE", meaning the document's compliance status has been rejected, and more parsing is needed:

    • if SCIGovtStatusCode is present, the error can be found by reading StatusReason

    • if SCIInternalValidationCode is present, the error can be found by reading StatusReason

Note:

Receiving a notification containing SCICloudStatusCode with a value in the 5xx range, still remains an option as it indicates a server error. In this case, the workflow would not be considered complete since it would not return a notification with SCICloudStatusCode of 209.

SCICloudStatusCodeSCIResponseCodeSample
209

AP

UBLExtensions in the ApplicationResponse will contain:

  • salesInvoiceId - SEF ID for the current invoice.

  • uniqueId - unique UUID generated by SEF.

  • invoiceId - an echo of the invoice ID that is sent in the document.

Workflow successfully completed
209REWorkflow successfully completed
Multiple response

To complete a transaction, the supplier must retrieve the application responses until the transaction has finished. If the supplier has subscribed to multiple notifications, the transaction can generate different application responses, as shown in the table below. The transaction finishes when a notification containing SCICloudStatusCode with value of 209 has been received.

Note:

Receiving a notification containing SCICloudStatusCode with a value in the 5xx range, still remains an option as it indicates a server error. In this case the workflow would not complete in a sense that it will not return a notification with SCICloudStatusCode of 209.

SCICloudStatusCodeSCIResponseCodeSample
100IPDocument received successfully
101IPDocument mapped successfully
200IP/AP

Initially IP is sent and when the workflow finishes (after 72h) AP is sent.

UBLExtensions in the ApplicationResponse will contain:
  • salesInvoiceId - SEF ID for the current invoice.

  • uniqueId - unique UUID generated by SEF.

  • invoiceId - an echo of the invoice ID that is sent in the document.

Authorized by the Tax Authority
207APPDF created successfully
209APWorkflow successfully completed
400RERejected by the Tax Authority or the counterparty
400 (401)RERejected by the Tax Authority or the counterparty
Note:

In order to configure notifications for your company, or update your current configuration, contact our Professional Services team.

The taxpayer can use the following Indirect Tax API endpoints to retrieve application responses:

  • GET /notifications/RS

  • GET /documents/RS/{documentId}/notifications

We'll discuss these endpoints in the following subsections.

GET /notifications/RS

The supplier can send a GET request to the /notifications/RS endpoint to retrieve application responses that match the set search criteria. This endpoint allows setting the following query parameters:

NameTypeRequiredDefaultDescription
taxIdstringNo

Set it to include only notifications related to the specified taxId. This value relates to the CompanyCode set in the SBDH.

Note:

If a request doesn't include this parameter, it will return all the notifications related to the country and the sourceSystemId parameter.

pageintegerNo1To specify the page to be returned, set the value between 1 and 10.
perPageintegerNo10

To specify the number of results for the returned page, set its value between 1 and 100.

Important:

If the attachment file is configured to return the binary content, instead of a link, it's recommended to use only values between 1 and 10.

sourceSystemIdstringYes Set it to include only notifications related to documents that originate from the given source system. This value is related to the SenderSystemId in the SBDH.
includeAckwnowledgedbooleanNofalseSet it to "true" to specify whether previously acknowledged notifications, within 24 hours of their acknowledgment, must be included in the result.
processTypestringNoSet it to "0" to only include notifications related to outbound documents.
Request Sample
curl --location --request GET 'https://api-test.sovos.com/v1/notifications/RS?page=1&perPage=2&taxId={taxId}&sourceSystemId={sourceSystemId}&processType=0' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN'
Response Sample
{
    "timestamp": 1633685509314,
    "status": 200,
    "success": true,
    "message": "Notifications Listed",
    "data": {
        "pageState": {
            "page": 1,
            "perPage": 50,
            "totalEntries": 1
        },
        "notifications": [
            {
                "createdDate": 1633681296,
                "metadata": {
                    "productId": "rs_UBLInvoice__1.0",
                    "documentId": "DOCUMENT-ID",
                    "erpDocumentId": "321412",
                    "erpSystemId": "UAT101",
                    "processType": "0",
                    "taxId": "YOUR-TAXID",
                    "sciCloudStatusCode": "200",
                    "sciResponseCode": "AP",
                    "sciStatusAction": "NOA",
                    "sciGovtStatusCode": "100"
                },
                "appPrefix": "DLT",
                "notificationId": "a8dc1aa2-fbe6-45ce-9e4c-97a3d5fdb91c",
                "content": "PEF...NlPg=="
            }
        ]
    }
}
GET /documents/RS/{documentId}/notifications
The supplier can send a GET request to the /documents/RS/{documentId}/notifications endpoint to retrieve application responses related to a single document.

To make this request, set the following parameter:

NameTypeRequiredParameter typeDescription
documentIdstringYesPathSet it to the ID of the document returned in step 2
Request Sample
curl --location --request GET 'https://api-test.sovos.com/v1/documents/RS/{documentId}/notifications?' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE'
Response Sample
{
    "timestamp": 1633685509314,
    "status": 200,
    "success": true,
    "message": "Notifications Listed",
    "data": {
        "pageState": {
            "page": 1,
            "perPage": 50,
            "totalEntries": 1
        },
        "notifications": [
            {
                "createdDate": 1633681296,
                "metadata": {
                    "productId": "rs_UBLInvoice__1.0",
                    "documentId": "DOCUMENT-ID",
                    "erpDocumentId": "321412",
                    "erpSystemId": "UAT101",
                    "processType": "0",
                    "taxId": "YOUR-TAXID",
                    "sciCloudStatusCode": "200",
                    "sciResponseCode": "AP",
                    "sciStatusAction": "NOA",
                    "sciGovtStatusCode": "100"
                },
                "appPrefix": "DLT",
                "notificationId": "a8dc1aa2-fbe6-45ce-9e4c-97a3d5fdb91c",
                "content": "PEF...NlPg=="
            }
        ]
    }
}

Step 10: Supplier marks the application responses as acknowledged

After retrieving application responses, the supplier must process them and mark them as acknowledged. This can be done by sending a PUT request to the /notifications/RS endpoint.

To make this request, set the following request body parameters:

NameTypeRequiredDescription
statusstringYesSet it to read.
notificationIdstringYesSet it to the ID of the notification that must be marked as acknowledged.
Note:

Multiple notificationId values can be acknowledged through one Indirect Tax call by including them in a single request.

Request Sample
curl --location --request PUT 'https://api-test.sovos.com/v1/notifications/RS' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--data-raw '[
    {
        "status": "read",
        "notificationId": "51341d39-fd3e-4dcf-aea3-a73d73e0de76"
    }
]'
Response Sample
{
    "timestamp": 1601673284,
    "status": 200,
    "success": true,
    "message": "Notifications acknowledged successfully."
}

Archiving

Archiving can be done as a bundle, for example as part of the Clearance flow, and is recommended for suppliers integrating with the Sovos solution for Serbia for the first time. It can also be done separately, through an explicit API call, which uses another archive. For more information on standalone archiving, see the e-Archiving documentation page.

Bundled e-invoice archiving on the new platform is optional. Existing customers can choose to use their current solution and include e-Archiving.

When bundled archiving is set, the XML document is archived for 11 years along with the keys that the Tax Authority returns: invoiceId, salesInvoiceId and uniqueId.

Error Handling

Customers need to adhere to the error handling principles outlined on the responses page.

In general, all error codes in the 400 range are client errors, so the customer needs to analyze them. After fixing the error, it's possible to resend the request. Error codes 408 and 429 are exceptions: in these cases, customers should wait at least 60 seconds before retrying. The error codes in the 500 range are server errors. In that case, customers need to resend the request, according to the instructions given on the responses page, which also includes a full list of error codes the Indirect Tax API can return.

Cancel invoice

The following figure gives a detailed overview of the process for Invoice Cancellation in Serbia based on the Default business process. The text below describes the process step by step.

Step 1: Supplier sends a POST Request to Sovos

The buyer sends a POST request to the /documents/RS/action endpoint.

To make this request, set the following request body parameters:

NameTypeRequiredDescription
actionCodestringYesSet it to document.cancellation
documentsarray of objectsYesAn array of objects to include the metadata and the inbound document ID.
metadataobjectNoAn object that includes the required metadata.
reasonstringNoThis field can be used to provide the reason for cancelling the invoice. The max length is 300 characters.
documentIdstringYesThe ID of the document to be cancelled. This is the documentId that Sovosreturns when sending the document.
Request Sample
curl --location 'https://api-test.sovos.com/v1/documents/RS/action' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--data '{
    "actionCode": "document.cancellation",
    "documents": [
      {
        "metadata": {
            "reason": "Wrong total submitted"
        },
        "documentId": "DOCUMENT-ID"
      }
    ]
  }'
Response Sample
{
    "status": 202,
    "message": "Accepted",
    "success": true,
    "timestamp": 1708018192828,
    "data": [
        {
            "status": 202,
            "documentId": "DOCUMENT-ID"
        }
    ]
}

Step 2: Sovos transmits Request (to SEF)

Sovos finds the corresponding document in the system and transmits the cancellation request to SEF.

Step 3: SEF processes the Request

SEF validates the request and verifies business logic before returning a success or error message.

Step 4: SEF returns the Response

SEF returns the success message, or the error message if the cancellation could not be performed.

Step 5: Taxpayer retrieves the Application Responses

It is highly recommended that clients configure their Application Response attachments as download links instead of base64 encoded data to avoid potential size limitations when retrieving responses. The default option is "download links".

  • When using "download links" the response contains a URL from where the file can be downloaded.

  • When using "binary data", the file itself is embedded in the response encoded in base64.

This configuration is available through our Professional Services team.

As a response to the initial sending of the document, the client will receive a JSON response message with an HTTP status code of 202 (asynchronous transaction). This means that the taxpayer must retrieve the application responses that become available during the transaction, which provide status information.

Clients have the option to retrieve application responses (notifications) in one of two ways:

Fetch everything in one single response (notification)
This means, when polling for responses, Sovoswill only return one final notification with SCICloudStatusCode 209 that contains all the relevant attachments/data. Detailed description follows.
Fetch multiple responses (notifications) containing different information
In this case, when polling for responses, Sovoswill return multiple notifications with different SCICloudStatusCode values containing different attachments/data until the final one (with status 209) is returned. Detailed description follows.
Single response

To complete a transaction, the buyer retrieves only one notification, the complete workflow one, with SCICloudStatusCode of 209 and all the necessary attachments/data. Afterwards, the notification needs to be parsed for SCIResponseCode value. Possible values for SCIResponseCode:

  • "AP", meaning the document's compliance status has been accepted with all the necessary attachments/data present.

  • "RE", meaning the document's compliance status has been rejected, and more parsing is needed:

    • if SCIGovtStatusCode is present, the error can be found by reading StatusReason

    • if SCIInternalValidationCode is present, the error can be found by reading StatusReason

Note:

Receiving a notification containing SCICloudStatusCode with a value in the 5xx range, still remains an option as it indicates a server error. In this case, the workflow would not be considered complete since it would not return a notification with SCICloudStatusCode of 209.

SCICloudStatusCodeSCIResponseCodeSample
209APWorkflow successfully completed
209REWorkflow succesfully completed
Multiple responses

To complete a transaction, the buyer retrieves only one notification, the complete workflow one, with SCICloudStatusCode of 209 and all the necessary attachments/data. Afterwards, the notification needs to be parsed for SCIResponseCode value. Possible values for SCIResponseCode:

  • "AP", meaning the document's compliance status has been accepted with all the necessary attachments/data present.

  • "RE", meaning the document's compliance status has been rejected, and more parsing is needed:

    • if SCIGovtStatusCode is present, the error can be found by reading StatusReason

    • if SCIInternalValidationCode is present, the error can be found by reading StatusReason

Note:

Receiving a notification containing SCICloudStatusCode with a value in the 5xx range, still remains an option as it indicates a server error. In this case the workflow would not be considered complete since it would not return a notification with SCICloudStatusCode of 209.

SCICloudStatusCodeSCIResponseCodeSample
101IPDocument mapped successfully
201APCancelled
209APWorkflow successfully completed

The buyer can use the following Indirect Tax API endpoints to retrieve application responses:

  • GET /notifications/RS

  • GET /documents/RS/{documentId}/notifications

We'll discuss these endpoints in the following subsections.

GET /notifications/RS

The buyer can send a GET request to the /notifications/RS endpoint to retrieve application responses that match the set search criteria. This endpoint allows setting the following query parameters:

NameTypeRequiredDefaultDescription
taxIdstringNo

Set it to include only notifications related to the specified taxId. This value relates to the CompanyCode set in the SBDH.

Note:

If a request doesn't include this parameter, it will return all the notifications related to the country and the sourceSystemId parameter.

pageintegerNo1 To specify the page to be returned, set the value between 1 and 10.
perPageintegerNo10To specify the number of results for the returned page, set its value between 1 and 100.
Important:

If the attachment file is configured to return the binary content, instead of a link, it's recommended to use only values between 1 and 10.

sourceSystemIdstringYesSet it to include only notifications related to documents that originate from the given source system. This value is related to the SenderSystemId in the SBDH.
includeAcknowledgedbooleanNofalseSet it to "true" to specify whether previously acknowledged notifications must be included in the result.
processTypestringNo Set it to "0" to only include notifications related to outbound documents.
Request Sample
curl --location 'https://api-test.sovos.com/v1/documents/RS/DOCUMENT-ID/notifications?includeAcknowledged=false' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN' \
Response Sample
"status": 200,
"message": "Notifications Listed",
"success": true,
"timestamp": 1708533734893,
"data": {
    "pageState": {
        "page": 1,
        "perPage": 20,
        "totalEntries": 52,
        "totalPages": 3
    },
    "notifications": [
        {
            "notificationId": "40e2ef57-...-8e1c9e8de016",
            "correlationId": "SET-TO-UNIQUE-VALUE",
            "appPrefix": "DLT",
            "metadata": {
                "productId": "rs_UBLInvoice__1.0",
                "transactionId": "78...5f0",
                "documentId": "DOCUMENT-ID",
                "erpDocumentId": "172012265",
                "erpSystemId": "ERPSystem",
                "processType": "0",
                "taxId": SUPPLIER_TAX_ID,
                "sciCloudStatusCode": "209",
                "sciResponseCode": "AP",
                "sciStatusAction": "NOA",
                "sciGovtStatusCode": "Success"
            },
            "content": "PD...2U+",
            "createdDate": 1708533707255
GET /documents/RS/{documentId}/notifications

The buyer can send a GET request to the /documents/RS/{documentId}/notifications endpoint to retrieve application responses related to a single document.

To make this request, set the following parameters:

NameTypeRequiredParameter typeDefaultDescription
documentIdstringYesPathSet it to the ID of the document returned in step 1.
includeAcknowledgedbooleanNoQueryfalse Set it to "true" to specify whether previously acknowledged notifications must be included in the result.
Request Sample
curl --location 'https://api-test.sovos.com/v1/documents/RS/DOCUMENT-ID/notifications?includeAcknowledged=false' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN'
Response Sample
"status": 200,
"message": "Notifications Listed",
"success": true,
"timestamp": 1708533734893,
"data": {
    "pageState": {
        "page": 1,
        "perPage": 20,
        "totalEntries": 52,
        "totalPages": 3
    },
    "notifications": [
        {
            "notificationId": "40e2ef57-...-8e1c9e8de016",
            "correlationId": "SET-TO-UNIQUE-VALUE",
            "appPrefix": "DLT",
            "metadata": {
                "productId": "rs_UBLInvoice__1.0",
                "transactionId": "78...5f0",
                "documentId": "DOCUMENT-ID",
                "erpDocumentId": "172012265",
                "erpSystemId": "ERPSystem",
                "processType": "0",
                "taxId": SUPPLIER_TAX_ID,
                "sciCloudStatusCode": "209",
                "sciResponseCode": "AP",
                "sciStatusAction": "NOA",
                "sciGovtStatusCode": "Success"
            },
            "content": "PD...2U+",
            "createdDate": 1708533707255

Step 6: Taxpayer marks the Application Responses as Acknowledged

After retrieving application responses, the supplier must process them and mark them as acknowledged. This can be done by sending a PUT request to the /notifications/RS endpoint.

To make this request, set the following request body parameters:

NameTypeRequiredDescription
statusstringYesSet it to "read".
notificationIdstringYesSet it to the ID of the notification that must be marked as acknowledged.
Note:

Multiple notificationId values can be acknowledged using one Indirect Tax API call by including them in a single request.

Request Sample
curl --location --request PUT 'https://api-test.sovos.com/v1/notifications/RS' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN' \
--data '[
    {
        "status": "read",
        "notificationId": "e7b32eda-cb67-43b9-91de-f6d9c90f60d9"
    }
]'
Response Sample
{
    "status": 200,
    "message": "OK",
    "success": true,
    "timestamp": 1708509282198,
    "data": {}
}

Error Handling

Customers need to adhere to the error handling principles outlined on the responses page.

In general, all error codes in the 400 range are client errors, so the customer needs to analyze them. After fixing the error, it's possible to resend the request. Error codes 408 and 429 are exceptions: in these cases, customers should wait at least 60 seconds before retrying. The error codes in the 500 range are server errors. In that case, customers need to resend the request, according to the instructions given on the responses page, which also includes a full list of error codes the Indirect Tax API can return.

Errors coming from the SEF system will be shown in the application response. This means that, in the case of a rejection, the SCIResponseCode will be set to "RE" and any error codes coming from the system will be shown in the SCIGovtStatusCode element. The customer is responsible for taking action upon receiving an error code and a message from the SEF system.

Accept or reject invoice

The following figure gives a detailed overview of the process for Invoice Rejection/Acceptance in Serbia based on the Default business process. The text below describes the process step by step.

Overview process for invoice rejection/acceptance in Serbia.

Step 1: Buyer sends a POST Request to Sovos

The buyer sends a POST request to the /documents/RS/action endpoint.

To make this request, set the following request body parameters:

NameTypeRequiredDescription
actionCodestringYesSet it to document.rejection
documentsarray of objectsYesAn array of objects to include the metadata and the inbound document ID.
metadataobjectNoAn object that includes the required metadata.
reasonstringNoThis field can be used to provide the reason for rejecting the invoice. The max length is 300 characters.
documentIdstringYesThe ID of the document to be rejected. This is the documentId that Sovos returns when receiving the document.
Note:

You can reject more than one document at the same time.

Request Sample for rejection
curl --location 'https://api-test.sovos.com/v1/documents/RS/action' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--data '{
  "actionCode": "document.reject",
  "documents": [
    {
      "metadata": {
        "reason": "reject action test"
      },
      "documentId": DOCUMENT_ID
    }
  ]
}
Request Sample for Acceptance
curl --location 'https://api-test.sovos.com/v1/documents/RS/action' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--data '{
    "actionCode": "document.accept",
    "documents": [
      {
        "documentId": "DOCUMENT_ID"
      }
    ]
  }'
Response Sample
{
	"status": 202,
	"message": "Accepted",
	"success": true,
	"timestamp": 1724404345626
	"data":[
		{
			"status": 202,
			"transactionId": TRANSACTION_ID,
			"documentId": DOCUMENT_ID
		}
	]
}

Step 2: Sovos transmits Request (to SEF)

Sovos finds the corresponding document in the system and transmits the acceptance or rejection request to SEF.

Step 3: SEF processes the Request

SEF verifies that the 20 days window has not passed since the original document was issued, and that the document can be rejected/accepted successfully.

Step 4: SEF returns the Response

SEF returns the success message, or the error message if the rejection or acceptance could not be performed.

Step 5: Buyer retrieves the Application Responses

It is highly recommended that clients configure their Application Response attachments as download links instead of base64 encoded data to avoid potential size limitations when retrieving responses. The default option is "download links".

  • When using "download links" the response contains a URL from where the file can be downloaded.

  • When using "binary data", the file itself is embedded in the response encoded in base64.

This configuration is available through our Professional Services team.

As a response to the initial sending of the document, the client will receive a JSON response message with an HTTP status code of 202 (asynchronous transaction). This means that the supplier must retrieve the application responses that become available during the transaction, which provide status information.

Clients have the option to retrieve application responses (notifications) in one of two ways:

Fetch everything in one single response (notification)
This means, when polling for responses, Sovos will only return one final notification with SCICloudStatusCode 209 that contains all the relevant attachments/data. Detailed description follows.
Fetch multiple responses (notifications) containing different information
In this case, when polling for responses, Sovos will return multiple notifications with different SCICloudStatusCode values containing different attachments/data until the final one (with status 209) is returned. Detailed description follows.
Single response

To complete a transaction, the buyer retrieves only one notification, the complete workflow one, with SCICloudStatusCode of 209 and all the necessary attachments/data. Afterwards, the notification needs to be parsed for SCIResponseCode value. Possible values for SCIResponseCode:

  • "AP", meaning the document's compliance status has been accepted with all the necessary attachments/data present.

  • "RE", meaning the document's compliance status has been rejected, and more parsing is needed:

    • if SCIGovtStatusCode is present, the error can be found by reading StatusReason

    • if SCIInternalValidationCode is present, the error can be found by reading StatusReason

Note:

Receiving a notification containing SCICloudStatusCode with a value in the 5xx range, still remains an option as it indicates a server error. In this case, the workflow would not be considered complete since it would not return a notification with SCICloudStatusCode of 209.

SCICloudStatusCodeSCIResponseCodeSample
209APWorkflow successfully completed
209REWorkflow succesfully completed
Multiple responses

To complete a transaction, the buyer retrieves only one notification, the complete workflow one, with SCICloudStatusCode of 209 and all the necessary attachments/data. Afterwards, the notification needs to be parsed for SCIResponseCode value. Possible values for SCIResponseCode:

  • "AP", meaning the document's compliance status has been accepted with all the necessary attachments/data present.

  • "RE", meaning the document's compliance status has been rejected, and more parsing is needed:

    • if SCIGovtStatusCode is present, the error can be found by reading StatusReason

    • if SCIInternalValidationCode is present, the error can be found by reading StatusReason

Note:

Receiving a notification containing SCICloudStatusCode with a value in the 5xx range, still remains an option as it indicates a server error. In this case the workflow would not be considered complete since it would not return a notification with SCICloudStatusCode of 209.

SCICloudStatusCodeSCIResponseCodeSample
101IPDocument mapped successfully
212APRejection Request Accepted
209APWorkflow successfully completed

The buyer can use the following Indirect Tax API (Application Programming Interface) endpoints to retrieve application responses:

  • GET /notifications/RS

  • GET /documents/RS/{documentId}/notifications

We'll discuss these endpoints in the following subsections.

GET /notifications/RS

The buyer can send a GET request to the /notifications/RS endpoint to retrieve application responses that match the set search criteria. This endpoint allows setting the following query parameters:

NameTypeRequiredDefaultDescription
taxIdstringNo

Set it to include only notifications related to the specified taxId. This value relates to the CompanyCode set in the SBDH.

Note:

If a request doesn't include this parameter, it will return all the notifications related to the country and the sourceSystemId parameter.

pageintegerNo1 To specify the page to be returned, set the value between 1 and 10.
perPageintegerNo10To specify the number of results for the returned page, set its value between 1 and 100.
Important:

If the attachment file is configured to return the binary content, instead of a link, it's recommended to use only values between 1 and 10.

sourceSystemIdstringYesSet it to include only notifications related to documents that originate from the given source system. This value is related to the SenderSystemId in the SBDH.
includeAcknowledgedbooleanNofalseSet it to "true" to specify whether previously acknowledged notifications must be included in the result.
processTypestringNo Set it to "0" to only include notifications related to outbound documents.
Request Sample
curl --location 'https://api-test.sovos.com/v1/documents/RS/DOCUMENT-ID/notifications?includeAcknowledged=false' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN' \
Response Sample
"status": 200,
"message": "Notifications Listed",
"success": true,
"timestamp": 1708533734893,
"data": {
    "pageState": {
        "page": 1,
        "perPage": 20,
        "totalEntries": 52,
        "totalPages": 3
    },
    "notifications": [
        {
            "notificationId": "78bd5a18-...-73bfbdb3bf21",
            "correlationId": "SET-TO-UNIQUE-VALUE",
            "appPrefix": "DLT",
            "metadata": {
                "productId": "rs_UBLInvoice_Polling_1.0",
                "transactionId": "43...d94",
                "documentId": "DOCUMENT-ID",
                "erpDocumentId": "192714478",
                "erpSystemId": "ERPSystem",
                "processType": "1",
                "taxId": "C873686030",
                "sciCloudStatusCode": "209",
                "sciResponseCode": "AP",
                "sciStatusAction": "NOA",
                "sciGovtStatusCode": "Success"
            },
            "content": "PD...2U+",
            "createdDate": 1708533707255
GET /documents/RS/{documentId}/notifications

The buyer can send a GET request to the /documents/RS/{documentId}/notifications endpoint to retrieve application responses related to a single document.

To make this request, set the following parameters:

NameTypeRequiredParameter typeDefaultDescription
documentIdstringYesPathSet it to the ID of the document returned in step 1.
includeAcknowledgedbooleanNoQueryfalse Set it to "true" to specify whether previously acknowledged notifications must be included in the result.
Request Sample
curl --location 'https://api-test.sovos.com/v1/documents/RS/DOCUMENT-ID/notifications?includeAcknowledged=false' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN'
Response Sample
"status": 200,
"message": "Notifications Listed",
"success": true,
"timestamp": 1708533734893,
"data": {
    "pageState": {
        "page": 1,
        "perPage": 20,
        "totalEntries": 52,
        "totalPages": 3
    },
    "notifications": [
        {
            "notificationId": "78bd5a18-...-73bfbdb3bf21",
            "correlationId": "SET-TO-UNIQUE-VALUE",
            "appPrefix": "DLT",
            "metadata": {
                "productId": "rs_UBLInvoice_Polling_1.0",
                "transactionId": "43...d94",
                "documentId": "DOCUMENT-ID",
                "erpDocumentId": "192714478",
                "erpSystemId": "ERPSystem",
                "processType": "1",
                "taxId": "C873686030",
                "sciCloudStatusCode": "209",
                "sciResponseCode": "AP",
                "sciStatusAction": "NOA",
                "sciGovtStatusCode": "Success"
            },
            "content": "PD...2U+",
            "createdDate": 1708533707255

Step 6: Buyer marks the Application Responses as Acknowledged

After retrieving application responses, the buyer must process them and mark them as acknowledged. This can be done by sending a PUT request to the /notifications/RS endpoint.

To make this request, set the following request body parameters:

NameTypeRequiredDescription
statusstringYesSet it to "read".
notificationIdstringYesSet it to the ID of the notification that must be marked as acknowledged.
Note:

Multiple notificationId values can be acknowledged via one Indirect Tax API (Application Programming Interface) call by including them in a single request.

Request Sample
curl --location --request PUT 'https://api-test.sovos.com/v1/notifications/RS' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN' \
--data '[
    {
        "status": "read",
        "notificationId": "e7b32eda-cb67-43b9-91de-f6d9c90f60d9"
    }
]'
Response Sample
{
    "status": 200,
    "message": "OK",
    "success": true,
    "timestamp": 1708509282198,
    "data": {}
}

Error Handling

Customers need to adhere to the error handling principles outlined on the responses page.

In general, all error codes in the 400 range are client errors, so the customer needs to analyze them. After fixing the error, it's possible to resend the request. Error codes 408 and 429 are exceptions: in these cases, customers should wait at least 60 seconds before retrying. The error codes in the 500 range are server errors. In that case, customers need to resend the request, according to the instructions given on the responses page, which also includes a full list of error codes the Indirect Tax API (Application Programming Interface) can return.

Errors coming from the SEF system will be shown in the application response. This means that, in the case of a rejection, the SCIResponseCode will be set to "RE" and any error codes coming from the system will be shown in the SCIGovtStatusCode element. The customer is responsible for taking action upon receiving an error code and a message from the SEF system.

Retrieve invoice

The diagram below provides an overview of the inbound flow process for Invoice Retrieval in Serbia:

Inbound flow process for invoice retrieval in Serbia

Step 1: Sovos Retrieves the Documents from the SEF System

Sovos uses the buyer's credentials to authenticate with the SEF system to collect the documents that have been made available (either in JSON or XML formats).

Step 2: Sovos Maps the Retrieved Document into SCI and Makes them Available

Sovos stores the retrieved documents, maps them to SCI, and makes them available for buyers to get. The PDF version of the documents is also made available.

Step 3: Sovos Generates the PDF

Sovos generates a PDF for this document.

Step 4: Sovos Distributes the PDF

Sovos can distribute the PDF via email to a configurable email address.�

Step 5: Buyer Retrieves the Available Documents

It is highly recommended that clients configure their Application Response attachments as download links instead of base64 encoded data to avoid potential size limitations when retrieving responses. The default option is "download links".

  • When using "download links" the response contains a URL from where the file can be downloaded.

  • When using "binary data", the file itself is embedded in the response encoded in base64.

This configuration is available through our Professional Services team.

The buyer can use the following Indirect Tax API endpoint to retrieve application responses:

GET /notifications/RS

To complete a transaction, the buyer must retrieve the application responses until the transaction has finished. If the buyer has subscribed to all notifications, the transaction can generate different application responses, as shown in the table below:

SCICloudStatusCodeSCIResponseCodeSample
100IPDocument received successfully
101IPDocument mapped successfully
207APPDF created successfully

The PDF is part of the attachments in the notification (see the attached document)

209APWorkflow successfully completed
GET /notifications/RS
The buyer can send a GET request to the /notifications/RS endpoint to retrieve application responses that match the set search criteria. This endpoint allows setting the following query parameters:
NameTypeRequiredDefaultDescription
taxIdstringNo

Set it to include only notifications related to the specified taxId.

pageintegerNo1To specify the page to be returned, set the value between 1 and 10.
perPageintegerNo10

To specify the number of results for the returned page, set its value between 1 and 100.

Important:

If the attachment file is configured to return the binary content, instead of a link, it's recommended to use only values between 1 and 10.

sourceSystemIdstringYes Set it to include only notifications related to documents that originate from the given source system.
includeAckwnowledgedbooleanNofalse Set it to "true" to specify whether previously acknowledged notifications must be included in the result.
processTypestringNoSet it to "1" to only include notifications related to inbound documents.
Request Sample
curl --location --request GET 'https://api-test.sovos.com/v1/notifications/RS?page=1&perPage=2&taxId={taxId}&sourceSystemId={sourceSystemId}&processType=1' \
--header 'Content-Type: application/json' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--header 'Authorization: Bearer TOKEN'
Response Sample
{
    "timestamp": 1633685509314,
    "status": 200,
    "success": true,
    "message": "Notifications Listed",
    "data": {
        "pageState": {
            "page": 1,
            "perPage": 50,
            "totalEntries": 1
        },
        "notifications": [
            {
                "createdDate": 1633681296,
                "metadata": {
                    "productId": "rs_UBLInvoice_Polling_1.0",
                    "documentId": "DOCUMENT-ID",
                    "erpDocumentId": "321412",
                    "erpSystemId": "UAT101",
                    "processType": "0",
                    "taxId": "YOUR-TAXID",
                    "sciCloudStatusCode": "200",
                    "sciResponseCode": "AP",
                    "sciStatusAction": "NOA",
                    "sciGovtStatusCode": "100"
                },
                "appPrefix": "DLT",
                "notificationId": "a8dc1aa2-fbe6-45ce-9e4c-97a3d5fdb91c",
                "content": "PEF...NlPg=="
            }
        ]
    }
}

Step 6: Buyer Acknowledges the Retrieved Documents

After retrieving the documents, the buyer must process them and mark them as acknowledged. This can be done by sending a PUT request to the /notifications/RS endpoint.

To make this request, set the following request body parameters:

NameTypeRequiredDescription
statusstringYes Set it to "read".
notificationIdstringYesSet it to the ID of the notification that must be marked as acknowledged.
Note:

Multiple notificationId values can be acknowledged using one Indirect Tax API call by including them in a single request.

Request Sample
curl --location --request PUT 'https://api-test.sovos.com/v1/notifications/RS' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer TOKEN' \
--header 'x-correlationId: SET-TO-UNIQUE-VALUE' \
--data-raw '[
    {
        "status": "read",
        "notificationId": "51341d39-fd3e-4dcf-aea3-a73d73e0de76"
    }
]'
Response Sample
{
    "timestamp": 1601673284,
    "status": 200,
    "success": true,
    "message": "Notifications acknowledged successfully."
}

Mock tax authority integration

It's possible to use a mock service created by Sovos, which replaces the Tax Authority communication in the solution and allows limited testing of business scenarios.

Customers can dynamically distinguish between mock services and testing against the real Tax Authority UAT environment on a document-by-document basis.

Testing with Sovos' mocked service is not a replacement for UAT/Sandbox environment testing, so UAT/Sandbox environment testing should still be performed before moving to the Production environment. This is because Sovos' mocked service cannot fully simulate the Tax Authority behavior and validations due to the vast amount of different business scenarios that are applicable for Serbia.