Application Programming Interface forums

0 Subscribers

3 Topics

4922 Conversations

Area for questions and answers about SuperOffice API's.

All conversations (4922)

push_pin lock

Best way to create a new address format in Online

Hi there, i have a customer who'd like a custom address format. In order to do this on-premise i would just copy a layout that already exists, and change the variables i need. Therefore i constructed the following CRM-Script that should copy the 4 other lines, and add them to the addressformat table, with my changed values:   #setLanguageLevel 4; SearchEngine se; se.addField('AddressFormat.addressformat_id'); se.addField('AddressFormat.name'); se.addField('AddressFormat.layout_id'); se.addField('AddressFormat.atype_idx'); se.addField('AddressFormat.address1_line'); se.addField('AddressFormat.address1_subpos'); se.addField('AddressFormat.address1_leadtext'); se.addField('AddressFormat.address1_zip'); se.addField('AddressFormat.address1_length'); se.addField('AddressFormat.address1_flags'); se.addField('AddressFormat.address1_mask'); se.addField('AddressFormat.address2_line'); se.addField('AddressFormat.address2_subpos'); se.addField('AddressFormat.address2_leadtext'); se.addField('AddressFormat.address2_zip'); se.addField('AddressFormat.address2_length'); se.addField('AddressFormat.address2_flags'); se.addField('AddressFormat.address2_mask'); se.addField('AddressFormat.address3_line'); se.addField('AddressFormat.address3_subpos'); se.addField('AddressFormat.address3_leadtext'); se.addField('AddressFormat.address3_zip'); se.addField('AddressFormat.address3_length'); se.addField('AddressFormat.address3_flags'); se.addField('AddressFormat.address3_mask'); se.addField('AddressFormat.city_line'); se.addField('AddressFormat.city_subpos'); se.addField('AddressFormat.city_leadtext'); se.addField('AddressFormat.city_zip'); se.addField('AddressFormat.city_length'); se.addField('AddressFormat.city_flags'); se.addField('AddressFormat.city_mask'); se.addField('AddressFormat.county_line'); se.addField('AddressFormat.county_subpos'); se.addField('AddressFormat.county_leadtext'); se.addField('AddressFormat.county_zip'); se.addField('AddressFormat.county_length'); se.addField('AddressFormat.county_flags'); se.addField('AddressFormat.county_mask'); se.addField('AddressFormat.state_line'); se.addField('AddressFormat.state_subpos'); se.addField('AddressFormat.state_leadtext'); se.addField('AddressFormat.state_zip'); se.addField('AddressFormat.state_length'); se.addField('AddressFormat.state_flags'); se.addField('AddressFormat.state_mask'); se.addField('AddressFormat.zip_line'); se.addField('AddressFormat.zip_subpos'); se.addField('AddressFormat.zip_leadtext'); se.addField('AddressFormat.zip_zip'); se.addField('AddressFormat.zip_length'); se.addField('AddressFormat.zip_flags'); se.addField('AddressFormat.zip_mask'); se.addField('AddressFormat.extraFlags'); se.addField('AddressFormat.labelLayout'); se.addField('AddressFormat.registered'); se.addField('AddressFormat.registered_associate_id'); se.addField('AddressFormat.updated'); se.addField('AddressFormat.updated_associate_id'); se.addField('AddressFormat.updatedCount'); se.addField('AddressFormat.labelLayout2'); se.addField('AddressFormat.isBuiltIn'); se.addCriteria('AddressFormat.addressformat_id', 'In', '211,212,213,214'); //print(se.executeHTMLTable()); SearchEngine sequence; sequence.addField('sequence.id'); sequence.addField('sequence.next_id'); sequence.addField('sequence.TableName'); sequence.addField('sequence.TableNumber'); sequence.addCriteria('sequence.id', 'In', '67'); sequence.execute(); Integer next = sequence.getField('sequence.next_id').toInteger(); //Copy the rows from the search engine to 4 new rows, named "Other - 2 address lines" for(se.execute(); !se.eof(); se.next()){ SearchEngine insert; insert.addData('AddressFormat.addressformat_id', next.toString()); insert.addData('AddressFormat.name', 'Other - 2 address lines'); insert.addData('AddressFormat.layout_id', se.getField('AddressFormat.layout_id')); insert.addData('AddressFormat.atype_idx', se.getField('AddressFormat.atype_idx')); insert.addData('AddressFormat.address1_line', se.getField('AddressFormat.address1_line')); insert.addData('AddressFormat.address1_subpos', se.getField('AddressFormat.address1_subpos')); insert.addData('AddressFormat.address1_leadtext', se.getField('AddressFormat.address1_leadtext')); insert.addData('AddressFormat.address1_zip', se.getField('AddressFormat.address1_zip')); insert.addData('AddressFormat.address1_length', se.getField('AddressFormat.address1_length')); insert.addData('AddressFormat.address1_flags', se.getField('AddressFormat.address1_flags')); insert.addData('AddressFormat.address1_mask', se.getField('AddressFormat.address1_mask')); insert.addData('AddressFormat.address2_line', se.getField('AddressFormat.address2_line')); insert.addData('AddressFormat.address2_subpos', se.getField('AddressFormat.address2_subpos')); insert.addData('AddressFormat.address2_leadtext', se.getField('AddressFormat.address2_leadtext')); insert.addData('AddressFormat.address2_zip', se.getField('AddressFormat.address2_zip')); insert.addData('AddressFormat.address2_length', se.getField('AddressFormat.address2_length')); insert.addData('AddressFormat.address2_flags', se.getField('AddressFormat.address2_flags')); insert.addData('AddressFormat.address2_mask', se.getField('AddressFormat.address2_mask')); insert.addData('AddressFormat.address3_line', '0'); insert.addData('AddressFormat.address3_subpos', '0'); insert.addData('AddressFormat.address3_leadtext', '0'); insert.addData('AddressFormat.address3_zip', se.getField('AddressFormat.address3_zip')); insert.addData('AddressFormat.address3_length', '0'); insert.addData('AddressFormat.address3_flags', se.getField('AddressFormat.address3_flags')); insert.addData('AddressFormat.address3_mask', se.getField('AddressFormat.address3_mask')); insert.addData('AddressFormat.city_line', '3'); insert.addData('AddressFormat.city_subpos', se.getField('AddressFormat.city_subpos')); insert.addData('AddressFormat.city_leadtext', se.getField('AddressFormat.city_leadtext')); insert.addData('AddressFormat.city_zip', se.getField('AddressFormat.city_zip')); insert.addData('AddressFormat.city_length', se.getField('AddressFormat.city_length')); insert.addData('AddressFormat.city_flags', se.getField('AddressFormat.city_flags')); insert.addData('AddressFormat.city_mask', se.getField('AddressFormat.city_mask')); insert.addData('AddressFormat.county_line', se.getField('AddressFormat.county_line')); insert.addData('AddressFormat.county_subpos', se.getField('AddressFormat.county_subpos')); insert.addData('AddressFormat.county_leadtext', se.getField('AddressFormat.county_leadtext')); insert.addData('AddressFormat.county_zip', se.getField('AddressFormat.county_zip')); insert.addData('AddressFormat.county_length', se.getField('AddressFormat.county_length')); insert.addData('AddressFormat.county_flags', se.getField('AddressFormat.county_flags')); insert.addData('AddressFormat.county_mask', se.getField('AddressFormat.county_mask')); insert.addData('AddressFormat.state_line', se.getField('AddressFormat.state_line')); insert.addData('AddressFormat.state_subpos', se.getField('AddressFormat.state_subpos')); insert.addData('AddressFormat.state_leadtext', se.getField('AddressFormat.state_leadtext')); insert.addData('AddressFormat.state_zip', se.getField('AddressFormat.state_zip')); insert.addData('AddressFormat.state_length', se.getField('AddressFormat.state_length')); insert.addData('AddressFormat.state_flags', se.getField('AddressFormat.state_flags')); insert.addData('AddressFormat.state_mask', se.getField('AddressFormat.state_mask')); insert.addData('AddressFormat.zip_line', '3'); insert.addData('AddressFormat.zip_subpos', se.getField('AddressFormat.zip_subpos')); insert.addData('AddressFormat.zip_leadtext', se.getField('AddressFormat.zip_leadtext')); insert.addData('AddressFormat.zip_zip', se.getField('AddressFormat.zip_zip')); insert.addData('AddressFormat.zip_length', se.getField('AddressFormat.zip_length')); insert.addData('AddressFormat.zip_flags', se.getField('AddressFormat.zip_flags')); insert.addData('AddressFormat.zip_mask', se.getField('AddressFormat.zip_mask')); insert.addData('AddressFormat.extraFlags', se.getField('AddressFormat.extraFlags')); insert.addData('AddressFormat.labelLayout', se.getField('AddressFormat.labelLayout')); insert.addData('AddressFormat.registered', se.getField('AddressFormat.registered')); insert.addData('AddressFormat.registered_associate_id', se.getField('AddressFormat.registered_associate_id')); insert.addData('AddressFormat.updated', se.getField('AddressFormat.updated')); insert.addData('AddressFormat.updated_associate_id', se.getField('AddressFormat.updated_associate_id')); insert.addData('AddressFormat.updatedCount', se.getField('AddressFormat.updatedCount')); insert.addData('AddressFormat.labelLayout2', se.getField('AddressFormat.labelLayout2')); insert.addData('AddressFormat.isBuiltIn', 'false'); insert.insert(); next = next + 1; } //Update sequence with the new next_id sequence.addData('sequence.next_id', next.toString()); sequence.addCriteria('sequence.id', 'In', '67'); sequence.update();   This Does not work however. I'm getting the following error, that does not really provide me with any help:   So do i really have to send a SQL command to support for them to execute, or what is best practise for me to create a custom address format with the tools available?   Thanks!  
Dennis Aagaard Mortensgaard
2
0
8 h, 26 m ago | 12:29 PM
Topic:
Service and CRMScript Discussion
push_pin lock

Triggers for "Before saving company" and "After saving company" - Original values and UpdatedBy

I'm trying to make a script where the administration of the company gets an email of important changes on the company card. The logic behind it is finished, but im struggling with the different attributes of the triggers "Before saving company" and "After saving company". In "Before saving company", the :org value of a User Defined Field is showed as the previously set value, and the normal value is the new value that it has been changed to. See below: ContactEntity.CustomFields.SuperOffice:23 = [I:39] ContactEntity.CustomFields.SuperOffice:23:org = [I:41] And in "After saving company", the :org value will always be identical to the new value set.  ContactEntity.CustomFields.SuperOffice:23 = [I:39] ContactEntity.CustomFields.SuperOffice:23:org = [I:39] However, when using "Before saving company", the field " ContactEntity.UpdatedBy.X" will be linked to the last person that made changes to the company, not the person who is changing the company now. I need the trigger to tell me the changes made, and who made these changes, but it seems i have to get this information from 2 different triggers. Here is the script for extracting all the EventData from the triggers, both the TriggerScript for Before and After saving company are logically identical: # setLanguageLevel 4 ; EventData ed = getEventData (); Map fields = ed . getInputValues (); String text ; fields . first (); while ( !fields . eof ()){   text . append ( fields . getKey () + " = " + fields . getVal () + "<br>" );   fields . next (); } Email e ; e . setValue ( "envelopeFrom" , "hidden" ); e . setValue ( "from" , "hidden" ); e . setValue ( "to" , "hidden" ); e . setValue ( "subject" , "Endringer på firmakort | FØR" ); e . setValue ( "bodyHtml" , text ); e . setValue ( "body" , htmlConvToText ( text )); e . send ();

FL

Frederic Lien
1
4
18 Mar 2025 | 01:59 PM
Topic:
Service and CRMScript Discussion

Last reply

Would also like to see changes of the category of the Company. In the example below i changed from "Eksisterende kunde" --> "Potensiell kunde", and it only seems like the value of the Tooltip stays on the old value in the "Before trigger" script. Before Trigger: ContactEntity.Category.Id --> 2 ContactEntity.Category.Tooltip --> Alle eksisterende kunder skal vises her. ContactEntity.Category.Value --> Potensiell kunde After Trigger: ContactEntity.Category.Id --> 2 ContactEntity.Category.Tooltip --> ContactEntity.Category.Value --> Potensiell kunde

FL

by Frederic Lien
8 h, 28 m ago | 12:28 PM
push_pin lock

encodeSHA256 gives wrong hash?

Hi, I'm implementing support for HTTP Message Signatures (https://www.rfc-editor.org/rfc/rfc9421.html), and it requires SHA256 hashing. Up until now I've lived in a happy little bubble where I've assumed that encodeSHA256 produces the correct hash, but now I realize it doesn't. The SHA256 hash of 'foobar' should be 'c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2'. Here are a few ways to verify it:  https://gchq.github.io/CyberChef/#recipe=SHA2('256',64,160)&input=Zm9vYmFy Linux:   echo -n foobar | sha256sum Windows:  echo|set /p="foobar" > %TMP%/hash.txt |certutil -hashfile %TMP%/hash.txt SHA256 | findstr /v "hash" However, using the encodeSHA256 method in CRMScript I get a totally different hash. String NULL; printLine(encodeSHA256("", "foobar")); printLine(encodeSHA256(NULL, "foobar")); Byte[] bytes = encodeHMACSHA256("", "foobar"); foreach (Byte b in bytes) print(b.toHex(2)); // All of these give hash 'd7af9ac43019eb74b1787bc22cc8e81791045f48a94b334dab1a54213c4fc609', not the expected 'c3ab8ff13720e8ad9047dd39466b3c8974e592c2fa383d4a3960714caef0c4f2' Do we know why?
Frode Lillerud
1
4
3 Oct 2024 | 07:37 AM
Topic:
Service and CRMScript Discussion

Last reply

I am not in the position to decide if we will add a SHA256 without HMAC to CRMScript, but if you are able ot use hmac-SHA256, that is probably a better approach. It could also be possible to implement SHA256 in CRMScript as well. ChatGPT can give you a JavaScript implementation which shouldn't be too hard to translate to CRMScript.  As a side note: the above implementation using cmd.exe does not seem very secure (seen from an isolated perspective) as the "value" parameter isn't escaped in any way. 
by Stian Andre Olsen
17 Mar 2025 | 02:19 PM
push_pin lock

Clarification on Local Date Handling in SuperOffice Records

We are currently working on syncing data between SuperOffice and our product, and we need clarification on how timestamps (such as creation and update dates) are handled in SuperOffice records. Are timestamps always stored in Norway local time , or are they determined by tenant settings or the server location ? We understand that the SO-Timezone header can adjust timestamps when retrieving individual records . However, when fetching a list of entities , the SO-Timezone header does not appear to affect the timestamps. Is this behavior expected? Are there any alternative methods to ensure correct time conversion when working with lists of records? Any insights or best practices would be greatly appreciated.

9Y

99x Youtello developer
1
1
14 Mar 2025 | 07:08 AM
Topic:
Online development and web service API's

Last reply

registered and updated timestamp are always in UTC, appointment start and end datetime depended on if timezones are configured/enabled. See docs: https://docs.superoffice.com/en/api/netserver/web-services/so-timezone.html
by David Hollegien
14 Mar 2025 | 06:06 PM
push_pin lock

Name of User defined filed

Trying to run following code snippet, that is found here: https://docs.superoffice.com/en/automation/crmscript/howto/custom-objects/udef.html   This returns a list of all User-defined fields on the company card, with the ProgID, with DisplayText and DisplayTooltip. How can i get the name of the field, instead of just the ProgID? I've tried using DisplayTooltip, but when changing this in Fields does not work, it is always blank for all fields.   

FL

Frederic Lien
2
2
12 Mar 2025 | 08:28 AM
Topic:
Service and CRMScript Discussion

Last reply

Thanks :)

FL

by Frederic Lien
12 Mar 2025 | 09:21 AM
push_pin lock

Creating an extra table in code

Hi All, Is it possible to create, and modify the structure of a table in code using REST API's, for easy deployment of a cusom application. Many thanks, Trevor
Trevor Sharp
3
6
10 Mar 2025 | 04:53 PM
Topic:
Online development and web service API's

Last reply

That's brilliant David, thank you.  I'll take a proper look at this tomorrow, but it looks pretty good.  Thanks for your help on this.
by Trevor Sharp
10 Mar 2025 | 06:00 PM
push_pin lock

Trigger double opt-in for newsletter subscriptions via API

  How can a double opt-in email be triggered via the SuperOffice API to confirm the newsletter registration? The background is that customers can register for the newsletter via an external form and subscribe to the newsletter there. When a customer registers for the newsletter, a new person is created via the SuperOffice API. How can I now also send a confirmation email to this person via the API to confirm their newsletter subscription? What options are there for this?    

RW

Ralf Weisser
2
6
12 Feb 2025 | 08:57 AM
Topic:
Online development and web service API's

Last reply

### Request 1 ### ### Set default values into a new ConsentPerson. ###   POST /SuperOffice/api/v 1 /Agents/Person/CreateDefaultConsentPerson HTTP/ 1.1 Content-Type: application/json Accept: application/json   ### Response 1 ### {     "ConsentPersonId" : 0 ,     "ConsentSource" : {         "ConsentSourceId" : 0 ,         "Name" : "" ,          "Tooltip" : "" ,         "Rank" : 0 ,         "Key" : "" ,         "MailTemplateId" : 0 ,         "Deleted" : false ,         "TableRight" : null ,         "FieldProperties" : {}     },     "LegalBase" : {         "LegalBaseId" : 0 ,         "Name" : "" ,         "Tooltip" : "" ,         "Rank" : 0 ,         "Key" : "" ,         "Deleted" : false ,         "TableRight" : null ,         "FieldProperties" : {}     },     "PersonId" : 0 ,     "ConsentPurpose" : {         "ConsentPurposeId" : 0 ,         "Name" : "" ,         "ConsentText" : "" ,         "FormText" : "" ,         "Key" : "" ,         "Tooltip" : "" ,         "Active" : 0 ,         "UpdatedDate" : "0001-01-01T00:00:00" ,         "UpdatedBy" : null ,         "Deleted" : false ,         "Rank" : 0 ,         "PrivacyStatementDesc" : "" ,         "PrivacyStatementUrl" : "" ,         "TableRight" : null ,         "FieldProperties" : {}     },     "Comment" : "" ,     "TableRight" : null ,     "FieldProperties" : {} }   ### Request 2 ### ### Updates the existing ConsentPerson or creates a new ConsentPerson if the id parameter is empty  ###   POST /SuperOffice/api/v 1 /Agents/Person/SaveConsentPerson HTTP/ 1.1 Content-Type: application/json Accept: application/json   {     "ConsentPersonId" : 0 ,     "ConsentSource" : {         "ConsentSourceId" : 5     },     "LegalBase" : {         "LegalBaseId" : 1     },     "PersonId" : 30336,     "ConsentPurpose" : {         "ConsentPurposeId" : 2     },     "Comment" : "" ,     "TableRight" : null ,     "FieldProperties" : {} }   ### Response 2 ###   {     "ConsentPersonId" : 33455 ,     "ConsentSource" : {         "ConsentSourceId" : 5 ,         "Name" : null ,         "Tooltip" : null ,         "Rank" : 0 ,         "Key" : null ,         "MailTemplateId" : 0 ,         "Deleted" : false ,         "TableRight" : null ,         "FieldProperties" : {}     },     "LegalBase" : {         "LegalBaseId" : 1 ,         "Name" : null ,         "Tooltip" : null ,         "Rank" : 0 ,         "Key" : null ,         "Deleted" : false ,         "TableRight" : null ,         "FieldProperties" : {}     },     "PersonId" : 30336 ,     "ConsentPurpose" : {         "ConsentPurposeId" : 2 ,         "Name" : null ,         "ConsentText" : null ,         "FormText" : null ,         "Key" : null ,         "Tooltip" : null ,         "Active" : 0 ,         "UpdatedDate" : "0001-01-01T00:00:00" ,         "UpdatedBy" : null ,         "Deleted" : false ,         "Rank" : 0 ,         "PrivacyStatementDesc" : null ,         "PrivacyStatementUrl" : null ,         "TableRight" : null ,         "FieldProperties" : {}     },     "Comment" : "" ,     "TableRight" : null ,     "FieldProperties" : {} }   ### Request 3 ### ### Send confirmation email to the provided person, email address (id), using the document template. ###   POST /SuperOffice/api/v 1 /Agents/Person/SendConsentConfirmationEmail HTTP/ 1.1 Content-Type: application/json Accept: application/json   {   "PersonId" : 30336 ,   "EmailTemplateId" : 5 ,   "EmailAddress" : maxmustermann@test.net }   ### Response 3 ###   {     "Error" : true ,     "ErrorType" : "InvalidOperationException" ,     "Message" : "Cannot create directory \\\\***\\SO_ARC\\WebConnect\\2025.1 because a file already exists with that name." ,     "FriendlyMessage" : "" ,     "ErrorSource" : "SoDataBase" ,     "InnerError" : {         "ErrorType" : "SoException" ,         "Message" : "Service call Person.SendConsentConfirmationEmail failed" ,         "ErrorSource" : "SuperOffice.Services.Implementation" ,         "InnerError" : {             "ErrorType" : "Exception" ,             "Message" : "Error occurred at creating the physical document E-mail.somail" ,             "ErrorSource" : "SoDataBase" ,             "InnerError" : {                 "ErrorType" : "InvalidOperationException" ,                 "Message" : "Cannot create directory \\\\***\\SO_ARC\\WebConnect\\2025.1 because a file already exists with that name." ,                 "ErrorSource" : "SoDataBase" ,                 "InnerError" : null             }         }     } }

RW

by Ralf Weisser
3 Mar 2025 | 05:19 PM
push_pin lock

How do I copy CustomFields from one company to another?

Hello everyone.  I want to copy all custom fields from one company to another, but I'm having a hard time understanding how the behind the scenes-logic work. I'm looking for someone who can help me understand it :)   The following code doesn't copy anything. Why? #setLanguageLevel 4; NSContactAgent ca; Integer origId = 8590; Integer newId = 8603; NSContactEntity origComp = ca.GetContactEntity(origId); NSContactEntity newComp = ca.GetContactEntity(newId); Map origUdef = origComp.GetCustomFields(); newComp.SetCustomFields(origUdef); ca.SaveContactEntity(newComp);   Adding the following line updates 'SuperOffice:18', but only 'SuperOffice:18' Map origUdef = origComp.GetCustomFields(); origUdef.insert("SuperOffice:18", "261"); //THIS LINE newComp.SetCustomFields(origUdef); ca.SaveContactEntity(newComp); ..but not if I write it like this: Map origUdef = origComp.GetCustomFields(); origUdef.insert("SuperOffice:18", "[I:261]");   And here comes the kicker. If I alter the previous code-snippet to the following, suddently '[I:261]' works again. Map origUdef; origUdef.insert("SuperOffice:18", "[I:261]");   I tried something like this, but this doesn't work either: Map origUdef = origComp.GetCustomFields(); Map newUdef; for(origUdef.first(); !origUdef.eof(); origUdef.next()) { newUdef.insert(origUdef.getKey(), decodeDBValue(origUdef.getVal())); } newComp.SetCustomFields(origUdef); ca.SaveContactEntity(newComp);          

KR

Kasper Rosenlund
2
2
28 Feb 2025 | 09:46 AM
Topic:
Service and CRMScript Discussion

Last reply

That seems to work. But I'm not still sure why my original code-snippet doesn't work.

KR

by Kasper Rosenlund
28 Feb 2025 | 10:23 AM
push_pin lock

Error 411 missing content-length when doing av http.Post

I get "HTTP Error 411. The request must be chunked or have a content length." when I do a post. It's working from Postman and JavaScript. But not from CRM-script. The header Content-Length is correct, but it seems that it does not "read" it.  Anyone? From debug log: => Send header POST /api/sale HTTP/1.1 Host: api.123.no Accept: */* Content-Type: application/json Authorization: xxxxxxxxxxxxxxxxxxxxxxxx Content-Length: 100 traceparent: 00-ed27b3cd060c4144a33c4a6f5e705d16-d6bbf292bd167881-01 => Send data {"OrderDate": "2024-09-06 13:53:13","OurRef": "Frode Folleras","CustomerNo": "12345", "Lines": [{}]} <= Recv header HTTP/1.1 411 Length Required

FF

Frode Follerås
4
6
6 Sep 2024 | 11:59 AM
Topic:
Service and CRMScript Discussion

Last reply

Thank you Frode! It was a new line in Authorization that fooled me. I removed it and then it worked against the API.

FF

by Frode Follerås
28 Feb 2025 | 08:13 AM
push_pin lock

How to trigger correct language and replyTemplate when triggering email sending

Hi, I'm wondering if there are any possibilities to trigger sending of the correct language in the replytemplate for Ticket email confirmation. I've set up everyting up as described in: https://docs.superoffice.com/no/request/reply-templates/learn/index.html https://docs.superoffice.com/no/admin/options/learn/custlang/update.html https://docs.superoffice.com/no/request/reply-templates/learn/new-language.html In my case, I've setup so that incoming ticket request on a danish service email account is replying in danish, the default setting is norwegian. I'm struggling on how to make the rest api behave in the same manner since we also have a customerportal using the api. https://docs.superoffice.com/en/api/reference/restful/agent/Ticket_Agent/v1TicketAgent_SendTicketMessage.html https://docs.superoffice.com/en/api/reference/restful/rest/TicketMessage/v1TicketMessageEntity_SendTicketMessage.html Do you have any suggestion?   Sincere regards   Truong  

TL

Truong Le
1
0
27 Feb 2025 | 10:36 AM
Topic:
Online development and web service API's