{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"fa49c8ca-f461-437e-9097-a00a964623dd","name":"Hermes SMP migration key API","description":"# Business Context\n\n- To boost generalization of e-invoicing in Belgium, the Government decided to set up Hermes (hrms), an xml to pdf gateway that brings Belgian enterprises not yet equipped with inbound e-invoicing tools within the reach of Peppol BIS invoice senders.\n    \n- A key component of hrms is HermeSMP (hsmp): this smp is dedicated to store only hrms receivers, ie all Belgian enterprises as long as they have not found a suitable Peppol Access Provider.\n    \n- This API provides a 'machine friendly exit' for participant by providing Peppol access point to get the necessary migration key to start the standard SMP migration process, as defined in Peppol specifications.\n    \n- Note that beside this API, there is also the possibility for an enterprise representative manually collects the migration key using a webform exposed by the Government. TODO : @Arnaud could you provide the url of the IWF\n    \n\n# API Documentation\n\nThis documentation describes the REST interface for the exchanges between the HSMP and a client wishing to retrieve a migration key in order to take over a Peppol participant.\n\nThis process is part of the\n\n<a href=\"https://github.com/OpenPEPPOL/documentation/blob/master/TransportInfrastructure/ICT-Transport-SML_Service_Specification-101.pdf\">Peppol SML specification</a>\n\n. But the actual exchange of the migration key part is left to specific implementation, as described in this extract of the SML specification:\n\n_Another set of steps relating to SMPs and the SML relates to the migration of the metadata about a participant from one SMP to another SMP (for example, the participant decides to change suppliers for this function). There are interfaces to the SML to support migrations of this kind, which imply following a sequence of steps along the lines shown in figure 4.__**In this sequence, the original SMP receives a request from a participant to migrate its metadata to a new SMP (a step that is done out-of-band: there are no interfaces defined in these specifications for this).**__The SMP generates a Migration Key which is a unique string containing characters and numbers only, with a maximum length of 24 characters.__**The original SMP invokes the PrepareToMigrate operation of the SML and then passes the migration key to the new SMP (the key passing is an out-of-band step not defined in these specifications).**__When the new SMP has created the relevant metadata for the participant, it signals that it is taking over by invoking the Migrate operation of the SML, which then causes the DNS record(s) for that participant ID to be updated to point at the new SMP.__Once this switch is complete, the original SMP can remove the metadata which it holds for the participant._\n\n## Mutual TLS authentication\n\nIn order to call the API, the access point must use a valid Peppol certificate to perform a mutual TLS authentication:\n\n- Production Access point certificate can be used for PROD and TEST Participants (SML and SMK)\n    \n- Test Access Point Certificate can only be used for TEST Participants (SMK)\n    \n\nSwagger is not able to specify security based on mutual TLS authentication, therefore the security part is left empty in the endpoint documentation.\n\n## User blacklisting\n\nHSMP allows a maximum of 1000 queries per day coming from a single certificate. If the limit is reached, the certificate is permanently baned. Access point may send a email request to BOSA support in order to to unblock the certificate.\n\n## API DNS and IP's\n\nThe DNS entries are done for the following domains:\n\n### TEST SMK : smp.acc-hermes-belgium.be\n\n- 91.198.243.18\n    \n- 91.198.243.19\n    \n\n### PROD SML : smp.hermes-belgium.be\n\n- 91.198.243.20\n    \n- 91.198.243.21\n    \n\n# Changes\n\n## 1.0.0\n\nThe first release was done as parto f the initial development of the HSMP. Its purpose was to enable the BOSA intelligent web form to gather and distribute the migration key.\n\n## 2.0.0beta\n\nFollowing up on Access Points feedback, BOSA decided to provide a public API for Access Point to automate Participant migration.\n\nHere is the list of changes:\n\n- The name of the API was changed to a more 'REST' friendly resource like name\n    \n- The xml elements names were adapted to be closer to the one used in the SML documentation\n    \n- The xml structure of the API request and response have been adapted in order to be fit in the capabilities of the swagger definition file.\n    \n- Authentication was change to leverage the Peppol PKI\n    \n- Error code were added. Note that due to swagger documentation, the error code are documented as x-000-HSMP-000. The API will respond a standard response code corresponding to the first 3 digits. The body of the response will contain the error code and message.\n    \n\n## 2.0.0CR\n\nAs part of the development few consistency changes were made.\n\nHere is the list of changes:\n\n- Change prefix to URL : /hermes-rw/migrationKey\n    \n- Few error codes (002 -> 012, 003 -> 013, 004 -> 811) were changed to insure consistency with the former SMP.Belgium.be","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":true,"owner":"11381713","team":1027686,"collectionId":"fa49c8ca-f461-437e-9097-a00a964623dd","publishedId":"T17FCUqp","public":true,"publicUrl":"https://documenter-api.postman.tech/view/11381713/T17FCUqp","privateUrl":"https://go.postman.co/documentation/11381713-fa49c8ca-f461-437e-9097-a00a964623dd","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"EF5B25"},"documentationLayout":"classic-double-column","customisation":null,"version":"8.10.1","publishDate":"2020-07-03T15:08:30.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{},"logos":{}},"statusCode":200},"environments":[],"user":{"authenticated":false,"permissions":{"publish":false}},"run":{"button":{"js":"https://run.pstmn.io/button.js","css":"https://run.pstmn.io/button.css"}},"web":"https://www.getpostman.com/","team":{"logo":"https://res.cloudinary.com/postman/image/upload/t_team_logo_pubdoc/v1/team/eb61a7d9b100cf126d78b2ef6f53f832de3974369ebda355c6b712fffec39755","favicon":""},"isEnvFetchError":false,"languages":"[{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"HttpClient\"},{\"key\":\"csharp\",\"label\":\"C#\",\"variant\":\"RestSharp\"},{\"key\":\"curl\",\"label\":\"cURL\",\"variant\":\"cURL\"},{\"key\":\"dart\",\"label\":\"Dart\",\"variant\":\"http\"},{\"key\":\"go\",\"label\":\"Go\",\"variant\":\"Native\"},{\"key\":\"http\",\"label\":\"HTTP\",\"variant\":\"HTTP\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"OkHttp\"},{\"key\":\"java\",\"label\":\"Java\",\"variant\":\"Unirest\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"Fetch\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"jQuery\"},{\"key\":\"javascript\",\"label\":\"JavaScript\",\"variant\":\"XHR\"},{\"key\":\"c\",\"label\":\"C\",\"variant\":\"libcurl\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Axios\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Native\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Request\"},{\"key\":\"nodejs\",\"label\":\"NodeJs\",\"variant\":\"Unirest\"},{\"key\":\"objective-c\",\"label\":\"Objective-C\",\"variant\":\"NSURLSession\"},{\"key\":\"ocaml\",\"label\":\"OCaml\",\"variant\":\"Cohttp\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"cURL\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"Guzzle\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"HTTP_Request2\"},{\"key\":\"php\",\"label\":\"PHP\",\"variant\":\"pecl_http\"},{\"key\":\"powershell\",\"label\":\"PowerShell\",\"variant\":\"RestMethod\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"http.client\"},{\"key\":\"python\",\"label\":\"Python\",\"variant\":\"Requests\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"httr\"},{\"key\":\"r\",\"label\":\"R\",\"variant\":\"RCurl\"},{\"key\":\"ruby\",\"label\":\"Ruby\",\"variant\":\"Net::HTTP\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"Httpie\"},{\"key\":\"shell\",\"label\":\"Shell\",\"variant\":\"wget\"},{\"key\":\"swift\",\"label\":\"Swift\",\"variant\":\"URLSession\"}]","languageSettings":[{"key":"csharp","label":"C#","variant":"HttpClient"},{"key":"csharp","label":"C#","variant":"RestSharp"},{"key":"curl","label":"cURL","variant":"cURL"},{"key":"dart","label":"Dart","variant":"http"},{"key":"go","label":"Go","variant":"Native"},{"key":"http","label":"HTTP","variant":"HTTP"},{"key":"java","label":"Java","variant":"OkHttp"},{"key":"java","label":"Java","variant":"Unirest"},{"key":"javascript","label":"JavaScript","variant":"Fetch"},{"key":"javascript","label":"JavaScript","variant":"jQuery"},{"key":"javascript","label":"JavaScript","variant":"XHR"},{"key":"c","label":"C","variant":"libcurl"},{"key":"nodejs","label":"NodeJs","variant":"Axios"},{"key":"nodejs","label":"NodeJs","variant":"Native"},{"key":"nodejs","label":"NodeJs","variant":"Request"},{"key":"nodejs","label":"NodeJs","variant":"Unirest"},{"key":"objective-c","label":"Objective-C","variant":"NSURLSession"},{"key":"ocaml","label":"OCaml","variant":"Cohttp"},{"key":"php","label":"PHP","variant":"cURL"},{"key":"php","label":"PHP","variant":"Guzzle"},{"key":"php","label":"PHP","variant":"HTTP_Request2"},{"key":"php","label":"PHP","variant":"pecl_http"},{"key":"powershell","label":"PowerShell","variant":"RestMethod"},{"key":"python","label":"Python","variant":"http.client"},{"key":"python","label":"Python","variant":"Requests"},{"key":"r","label":"R","variant":"httr"},{"key":"r","label":"R","variant":"RCurl"},{"key":"ruby","label":"Ruby","variant":"Net::HTTP"},{"key":"shell","label":"Shell","variant":"Httpie"},{"key":"shell","label":"Shell","variant":"wget"},{"key":"swift","label":"Swift","variant":"URLSession"}],"languageOptions":[{"label":"C# - HttpClient","value":"csharp - HttpClient - C#"},{"label":"C# - RestSharp","value":"csharp - RestSharp - C#"},{"label":"cURL - cURL","value":"curl - cURL - cURL"},{"label":"Dart - http","value":"dart - http - Dart"},{"label":"Go - Native","value":"go - Native - Go"},{"label":"HTTP - HTTP","value":"http - HTTP - HTTP"},{"label":"Java - OkHttp","value":"java - OkHttp - Java"},{"label":"Java - Unirest","value":"java - Unirest - Java"},{"label":"JavaScript - Fetch","value":"javascript - Fetch - JavaScript"},{"label":"JavaScript - jQuery","value":"javascript - jQuery - JavaScript"},{"label":"JavaScript - XHR","value":"javascript - XHR - JavaScript"},{"label":"C - libcurl","value":"c - libcurl - C"},{"label":"NodeJs - Axios","value":"nodejs - Axios - NodeJs"},{"label":"NodeJs - Native","value":"nodejs - Native - NodeJs"},{"label":"NodeJs - Request","value":"nodejs - Request - NodeJs"},{"label":"NodeJs - Unirest","value":"nodejs - Unirest - NodeJs"},{"label":"Objective-C - NSURLSession","value":"objective-c - NSURLSession - Objective-C"},{"label":"OCaml - Cohttp","value":"ocaml - Cohttp - OCaml"},{"label":"PHP - cURL","value":"php - cURL - PHP"},{"label":"PHP - Guzzle","value":"php - Guzzle - PHP"},{"label":"PHP - HTTP_Request2","value":"php - HTTP_Request2 - PHP"},{"label":"PHP - pecl_http","value":"php - pecl_http - PHP"},{"label":"PowerShell - RestMethod","value":"powershell - RestMethod - PowerShell"},{"label":"Python - http.client","value":"python - http.client - Python"},{"label":"Python - Requests","value":"python - Requests - Python"},{"label":"R - httr","value":"r - httr - R"},{"label":"R - RCurl","value":"r - RCurl - R"},{"label":"Ruby - Net::HTTP","value":"ruby - Net::HTTP - Ruby"},{"label":"Shell - Httpie","value":"shell - Httpie - Shell"},{"label":"Shell - wget","value":"shell - wget - Shell"},{"label":"Swift - URLSession","value":"swift - URLSession - Swift"}],"layoutOptions":[{"value":"classic-single-column","label":"Single Column"},{"value":"classic-double-column","label":"Double Column"}],"versionOptions":[],"environmentOptions":[{"value":"0","label":"No Environment"}],"canonicalUrl":"https://documenter.gw.postman.com/view/metadata/T17FCUqp"}