Can I create a service application in Visma Connect?
No. Not if you wish to interact with our API. Our only supported client type is web application.
My authorization request failed. What do I do?
You can use the debugger found under "More > Debugger" under "My Applications" in Visma Connect.
What is my Client ID?
Will always start with 'isv_'. You can find your Client ID in Visma Connect. You'll use this in combination with your Client Secret to authenticate yourself.
What is my Client Secret?
This is generated after you've setup your application. You can always return here, if you lose or compromise your secret, and would like to generate a new and secure one.
Which scopes should I use?
Most likely you'll want to use some combination of dineropublicapi:read, dineropublicapi:write and/or offline_access. Depending on your requested and granted scopes from your Visma Connect application and your settings regarding offline access. Check out our Getting Started section, to get started in the right way. Your scopes must match what you've applied for, and your settings in Visma Connect.
What is firmaID / organization ID?
A unique identifier for each company in Dinero.
Can be found in the bottom left once logged in, and is also a part of the URL, directly following app.dinero.dk/.
What is a købsbilag / purchase voucher?
This is our own invention. Serves the same purpose as the ledger, but you can only book expenses, one item at a time. Most of our users expect their expenses to be booked with this voucher type, since they will get assistance in Dinero, by using this template. Keep this in mind.
Once created or booked they can be found in Dinero under: Bogføring > Bilagsoversigt
What is a kassekladdelinje / ledger item?
The ledger is a classic booking tool, where you can add several lines for booking and book them all at once. Very useful if you need to create several postings in one call.
The ledger can be found under: Bogføring > Kassekladde
What endpoint should I use?
In most cases, we recommend using the endpoints which our users would use themselves in app. That means, if you want to book an expense, choose something specific to that. For expenses that would be a purchase voucher.
How do I book sales and invoices?
If you need to book a sale, it might make sense to do it as an invoice, if you don't generate one on your end.
If you create the invoice on your own end, it would make sense to book it as a manual voucher, uploading your invoice as a file, and attach that to the manual voucher.
Does your integration book daily sales, then it would probably make sense to create a manual voucher as well, and probably a few extra accounts for credit card, mobilepay etc.
Why am I getting a 401 unauthorized?
Most likely your user has supplied you with the organizationID, and the logged in user, does not have access to the organization. Try using the /organizations endpoint after user authorization, and let them select their organization from a list of organizations they have access to, to avoid this issue.
This issue also often occurs for new integration partner, who has created a new Visma profile for their Connect application, while using another for Dinero. This means you now have two different accounts, but only one with access to anything in Dinero.
You can always check the user, when authorizing on the accept / deny page. This page will also indicate which user is logged in, and you can log out and change the account before authorizing.
Why am I getting a 403 forbidden?
Most likely the user does not have a Pro subscription, which is required to interact with the API. You can always check out the isPro status on the /organizations endpoint.
How does replay detection work?
If you work with refresh tokens and especially one time refresh tokens that can last forever, you need to handle them very carefully. Visma connect has replay detection. This means that if you try to swap an already used refresh token, then you will invalidate the entire authorization and you need to involve the user again. So be very careful with your refresh tokens.
Is there throttling?
We have a rate limit of 100 request a minute pr. organization, on a ClientID basis.
If you hit the rate limit, this is the body of the HTTP 429 message that you will see: API calls quota exceeded! (...)
We constantly monitor the usage of our API to ensure that it is used as efficient as possible. If we detect that the API can be used more efficient or that the API resources are being exhausted by a single client integration and it is evaluated by Dinero to hurt the general service of the API to other customers, Dinero can decide to revoke the access for single clients.
You can also expect action to be taken, if you hit a lot of 400, 401 or 403 requests. We expect you to mitigate this on your end.
Dinero will always strive to solve such issues in dialog with the integrating partner before any counter measures are taken.
How do I post images?
One of the harder parts of REST API's are images, because they require some extra steps. Here is a CURL example of image upload:
POST https://api.dinero.dk/v1/[organization_id]/files/?fileName=sample-invoice.jpg HTTP/1.1
Authorization: Bearer eyJ0eXAiOiJKV1QiLC....
Accept: application/json
Content-Type: multipart/form-data; boundary="-------abcdefg1234"
Host: api.dinero.dk
Content-Length: 313036
Expect: 100-continue
Connection: Keep-Alive
---------abcdefg1234
Content-Type: image/jpeg
Content-Disposition: form-data; name=image; filename=sample-invoice.jpg; filename\*=utf-8''sample-invoice.jpg
[ReplaceWithYourImage]
---------abcdefg1234--
Luckily this is all extremely well documented online, and you can easily search REST Image upload to find some great resources.
IMPORTANT❗ Files will not be accessible for the user, until you actually attach them to something like a purchase voucher, a manual voucher or a ledger item. Make sure you use the file for something.
How do I use filters?
Filters are not available on all properties, so be sure to check the endpoints queryFilter URI parameter description to see which. If the endpoint do not contain a queryFilter URI parameter, then it does not support filtering.
Each filter command is built after the structure:
[PropertyName]+[Operator]+[Value]
For instance:
/v1//invoices?queryFilter=ContactGuid+eq+'012a5052-af79-4696-826c-709c278ae7f9'
Be aware that the [Value] is not case sensitive.
Each filter command should be separated with: ;
Name | Types | Operator | Example |
---|---|---|---|
Equals | string, int, bool | eq | Name+eq+’John Doe’ |
Contains | string | contains | Name+contains+’John D’ |
How does pagination work?
GET methods, that potentially have a very large output, implements pagination. It can return a maximum of 1000 entries per page. If a higher pageSize is given an Exception with error code 43 is thrown. The pagination defaults to a pageSize of 100 entries, and returns the first page if left empty.
The pagination URI properties are listed below:
Name | Description | Type | Additional information |
---|---|---|---|
page | The 0-based page number | integer | Default value is 0 |
pageSize | The maximum number of items to include in a page. Max 1000. | integer | Default value is 100. Max value is 1000. |