{"activeVersionTag":"latest","latestAvailableVersionTag":"latest","collection":{"info":{"_postman_id":"0fef8fdb-1ebd-4f4e-b5dc-1666bd4d5e7a","name":"Webservices100","description":"# WebServices100\n\nREST API over the Sage 100 business objects. This collection is **generated** from the WCF service\ncontracts — see `tools/postman-gen/README.md`. Edit the overlay files rather than the collection:\na regeneration overwrites hand edits made here.\n\nGenerated from 844 operations across 52 services.\n\n## Base URL\n\n    {{url_sage100}}/<Service>/rest/<operation>\n\n`url_sage100` already includes the product segment and the environment, e.g.\n`localhost:12345/Webservices100/BIJOU`. The two health endpoints sit outside any environment and\nuse `url_sage100_root` instead.\n\n## Path variables\n\nValues in the path are Postman path variables, editable in the **Params** tab rather than buried in\nthe URL string.\n\nThey are named after what they identify, which is not always what the contract calls them. Several\nplaceholders are named after the C# parameter — `Clients/{ctnum}`, `Catalogue/{id}`,\n`CategoriesComptableAchat/{indice}` — and in the Params tab that name is the only clue to what the\nvalue should be. So `:ctnum` is `:numeroTiers` here, `:id` is `:idCatalogue`, and each variable's\ndescription names its contract spelling. The name never reaches the server: WCF matches the URI\ntemplate by position, and Postman substitutes the value before sending.\n\n**A variable left empty is not the same as a segment left off.** Emptying `:numeroTiers` on\n`/Clients/:numeroTiers` produces `/Clients/`, which matches no route and returns 404 — it does not\nfall back to the list. Where both shapes exist they are two operations with two return types, and\nthis collection has one request for each: **Clients** for one, **ClientsList** for all.\n\n## Authentication\n\nEvery request sends `Authorization: {{token}}`, set once as collection-level auth — individual\nrequests inherit it and carry no auth header of their own. The token is per environment; put it in\na Postman environment, never in the collection.\n\nA wrong token and a missing `Authorization` header both give **401** `\"Invalid token\"`.\n\n### Integrator signature — only on a non-standalone host\n\nWhere the host's licence is not standalone, the token is not enough: five more headers are required,\nthe last of which signs the request.\n\n| Header | Value |\n|---|---|\n| `X-Sender-Id` | the integrator's name, as licensed — e.g. `YOOZ`, `SAGE`, `WEAVY` |\n| `X-Customer-Id` | must equal the licence's customer code |\n| `X-Timestamp` | Unix milliseconds, accepted within **±5 minutes** |\n| `X-Nonce` | single-use; replaying one is refused |\n| `X-Signature` | `hmac-sha256=<lowercase hex>` over the canonical string below |\n\nThe canonical string is seven values joined by `\\n`:\n\n    senderId \\n customerId \\n timestamp \\n nonce \\n METHOD \\n path \\n query\n\nwith two normalisations that are easy to get wrong:\n\n- **`path`** is the absolute path, trailing slash removed, **lowercased**.\n- **`query`** has its parameters sorted by key then value (ordinal), each key and value\n  percent-encoded afresh, and the whole thing **lowercased** — so `?rowsPerPage=3&pageNumber=1`\n  signs as `pagenumber=1&rowsperpage=3`, and `Chèque` as `ch%c3%a8que`.\n\n**The body is not signed.** WCF re-serialises it, so it could not be reproduced byte for byte; TLS\nand the single-use nonce cover it instead.\n\nThe collection's pre-request script does all of this for you as soon as `senderId` is set, and does\nnothing at all while it is empty — which is what a standalone host wants, since sending the headers\nthere is not merely unnecessary. Fill `senderId`, `customerId` and `senderSecretHex` (the licence's\nderived secret for that integrator, as hex) in your environment.\n\n**Every failure is a 401**, whatever the cause — never a 403. Only the numeric code in the body\ntells them apart:\n\n| Code | Meaning | Code | Meaning |\n|---|---|---|---|\n| 5856 | `X-Sender-Id` missing | 6534 | `X-Nonce` missing |\n| 1303 | sender id unknown to the licence | 7854 | nonce already used |\n| 1931 | `X-Customer-Id` missing | 7638 | `X-Signature` missing |\n| 2181 | customer id ≠ the licence's | 9087 | signature mismatch |\n| 2300 | timestamp not a number | 5490 | timestamp outside ±5 min |\n\nA 9087 usually means the canonical string differs, not the secret. The script logs the string it\nsigned to the Postman console; the server logs its own to the debug output, and comparing the two\nline by line is the quickest way through.\n\n## Verbs\n\nThe contract decides the verb, and there are three cases:\n\n| Contract | Verb | Route |\n|---|---|---|\n| `[WebGet]` | GET | its `UriTemplate` |\n| `[WebInvoke(Method = \"…\")]` | that verb | its `UriTemplate` |\n| no attribute | **POST** | the **operation name**, parameters wrapped in the JSON body |\n\nThe third case is the most common one and is easy to miss: an operation with no attribute is still\nreachable, as a POST named after the method.\n\n## V1 and V2\n\nMany operations come in two flavours. The V1 takes its parameters as a normal JSON object. The V2\ntwin — same route plus a `V2` suffix — takes a single `data` field holding **the base64 of that\nsame JSON**. 224 of the 844 operations are V2 twins; they live in a\n`V2 (base64 payload)` subfolder inside each service.\n\nThose requests keep the readable JSON in the body: a folder pre-request script strips the comments,\nencodes it and swaps in the `{\"data\": \"…\"}` wrapper at send time. Edit the readable body, not the\nwrapper.\n\n## Pagination\n\nList operations accept `pageNumber` and `rowsPerPage`. Both default to `0`, which means\n**no paging** — the full result set. On large tables that is what produces the multi-megabyte\nresponses, so pass a page size when exploring.\n\n## Request bodies\n\nEvery field the contract accepts is listed, with its type and, for enumerations, its accepted\nvalues. Commented-out fields are documentation: Postman strips `//` and `/* */` from a raw JSON\nbody before sending, so they cost nothing. Uncomment what you need.\n\n**The comma leads the line.**\n\n    {\n       \"numeroTiers\": \"CARAT\"      // REQUIRED\n      ,\"intitule\": \"Carat S.a.r.l\" // optional\n    //,\"qualite\": \"\"               // optional\n    }\n\nPostman removes the comments but not the commas. With trailing commas, switching a field off means\nalso deleting the comma it left on the line above — miss it and the payload is invalid JSON from a\nline that looks untouched. Leading, the separator belongs to its own line and travels with it: any\nline can be commented or uncommented on its own.\n\nOne line per block owns no comma — the first one. It is a field you would not turn off anyway,\nbecause an active one is put there on purpose. In the twelve blocks where every field is optional\nand none could be switched on for free, that line says so in its comment.\n\n**Required or optional is marked on each field**, not by grouping them. The contract's own order is\nkept, so it lines up with the C# you may be reading alongside.\n\nThree sources feed that mark, and one absence:\n\n| Mark | Comes from |\n|---|---|\n| `REQUIRED — must be supplied` | a guard clause in the service — the last word, and stricter than the signature: several parameters are declared `= 0` and then rejected for being `0` |\n| `REQUIRED` / `optional` | the contract, for a top-level parameter — whether it has a C# default |\n| *(nothing)* | **the contract does not say.** No model type declares `[DataMember(IsRequired = true)]`, so for a member of a DTO there is nothing to read. Unmarked means unknown, not optional |\n\nWhere a rule has been established by hand against a real folder, it is marked and dated.\n\n## Status codes do not mean what you expect\n\nVerified against a live host — this is the single most important section here.\n\n**There is no 404.** Asking for a record that does not exist returns **200 with an empty body**:\n`GET TiersService/rest/Clients/NEXISTEPAS` answers 200 and nothing else. The status code alone\ncannot tell a hit from a miss — check that the body is non-empty.\n\n**A rejected call is a 500, not a 400.** A missing required parameter or a broken business rule\ncomes back with a French message naming the problem:\n\n    500  \"Le paramètre \\\"refArticle\\\" est obligatoire [WebServices100 V1.17.6.0]\"\n    500  \"Le collaborateur 'X' doit avoir au moins un profil (Vendeur, Acheteur, …)\"\n\nSo a 500 here is usually *your* payload, not a broken server. Read the message.\n\n**401 is the one code that means what it says**, with the body `\"Invalid token\"` — for a wrong token\nand for no `Authorization` header at all. The two endpoints under `_Health` are the exception: they\nanswer without a token.\n\n**A 400 means the body never reached the service** — it failed in WCF's deserialiser, before any\nWebServices100 code ran. Two shapes, and the difference tells you where to look:\n\n| Body | Cause |\n|---|---|\n| `{\"error\":\"…__type…\"}` — JSON | the abstract-contract discriminator, missing or not first. The message names the fix |\n| an HTML page | anything else the deserialiser choked on: malformed JSON, or a value of the wrong type (`\"IdCategorieComptable\": \"abc\"` where an integer is expected) |\n\nA wrong HTTP verb gives **405**, also an HTML page, and an unknown route **404**, likewise.\n\n_Every row above re-checked on 2026-08-31 against Sage 12.25 / BIJOU._\n\n## What a write gives back\n\nNot the same thing everywhere, and it matters — of the 64 write operations:\n\n- **29 re-read the record from Sage** before answering. What comes back carries the values Sage\n  computed: assigned ids, numbers drawn from a counter, prices. `ArticleService.Insert`,\n  `TiersService.Update`, `DocumentService.ReplaceDocumentLines` and every bank-side\n  `Insert`/`Update` work this way.\n- **27 return what the manager handed back**, without re-reading — including\n  `CollaborateurService.Insert`, `DocumentService.InsertDocument` and every `EcritureService`\n  insert. The response reflects your payload more than the stored record; read it back if you need\n  what Sage actually kept.\n- **8 return nothing at all** — the `Appliquer…` operations, `InsertLignes`, `DefinirHistorique`.\n  Success is the absence of an error.\n\nWhen in doubt, read the record back. Each request says which of the three it is.\n\n## `__type` — the one that will cost you an afternoon\n\nSeven contracts are **abstract classes**. There is no such thing as a `Tiers` object: what exists is\na `Client`, a `Fournisseur`, a `Salarie` or an `AutresTiers`. The payload has to say which, through\na discriminator:\n\n    \"__type\": \"Client:http://www.proconsult.lu/WebServices100\"\n\n| Abstract contract | Send one of |\n|---|---|\n| `Criteria` | CriteriaComparison, CriteriaIn, CriteriaLogical |\n| `Tiers` | Client, Fournisseur, Salarie, AutresTiers |\n| `Article` | ArticleStandard, ArticleGamme |\n| `Document` | DocumentAchat, DocumentVente, DocumentStock, DocumentInterne, DocumentDepotDepot |\n| `LigneDocument` | LigneArticle, LigneTexte, LigneTotal, LigneDepotDepot, LigneArticleInsertNomenclature |\n| `AbonnementLigne` | AbonnementLigneArticle, AbonnementLigneTexte, AbonnementLigneTotal |\n| `Params` | AdditionalParams |\n\n`Criteria` is the one that catches everyone: it is the filter of nearly every `GetList`, so this\napplies to **reads**, not just writes.\n\n### Its position no longer matters\n\n`__type` is accepted anywhere in the object. Every body here still emits it first, which costs\nnothing and is the only form that also works against a host predating the fix.\n\nThat fix exists because the position used to decide everything, one step before the deserialiser.\nWCF turns the JSON body into an XML infoset first, and that mapping treats the discriminator\nspecially **only when it opens the object**:\n\n    {\"__type\": \"Client:…\", \"NumeroTiers\": \"CARAT\"}\n      -> <tiers type=\"object\" __type=\"Client:…\"> …          an ATTRIBUTE — this is what names the type\n\n    {\"NumeroTiers\": \"CARAT\", \"__type\": \"Client:…\"}\n      -> <tiers type=\"object\"><NumeroTiers …/><__type type=\"string\">Client:…</__type>\n                                                             an ordinary CHILD — names nothing\n\nOut of first place the discriminator was therefore not misplaced, it was *no longer a discriminator*,\nand the call failed exactly as if it had been left out — same status, same message.\n\n`WebServices100.Core` now carries a `TypeDiscriminatorInspector` that turns the stray element back\ninto an attribute before the deserialiser sees it. The same probe against Sage 12.25 / BIJOU, before\nand after that build reached the host:\n\n| `__type` at | before | after |\n|---|---|---|\n| first | 500 — reaches the service | 500 |\n| second, middle, last | **400** | **500 — reaches the service** |\n| absent | 400 | 400, unchanged |\n\nChecked on a real multi-level payload too, not only a flat one: `InsertDocumentEtLignes` carries five\ndiscriminators over three depths — the document, three lines in an array, and an `AdditionalParams`\nnested inside one of them. With all five moved to last place the call still reaches the service, and\na full insert of a document with its lines goes through.\n\n**Leaving it out is still refused**, with the JSON message above.\n\n**Omitting it is not a validation error you can catch.** The deserialiser cannot instantiate an\nabstract class, so it fails in WCF's dispatch formatter — before a single line of WebServices100 code\nruns, out of reach of `ExceptionHelper` and of the message inspectors.\n\nSince `WebServices100.Core` gained a `DeserializationErrorServiceBehavior`, that one failure comes\nback as JSON naming the fix:\n\n    400  {\"error\":\"Le corps de la requête n'a pas pu être désérialisé : un type abstrait ne peut\n          pas être instancié sans le discriminateur __type … Contrats abstraits : AbonnementLigne,\n          Article, Criteria, Document, LigneDocument, Params, Tiers.\"}\n\nOn a host without that build, the same call returns a bare HTML page.\n\nThe safe pattern is to read the record, change what you need, and post the whole object back — the\ndiscriminator comes along on its own. Every body below already carries it, and where there was no\nsample to copy the accepted values are listed in the comment.\n\n## Data types on the wire\n\nTwo of them do not look like their names suggest, and both bite silently:\n\n- **Enumerations travel as numbers.** The service answers `{\"TypeCompte\": 0}`, never `\"Detail\"`.\n  Every enum field in these bodies is annotated with the mapping — `0 = Detail, 1 = Total` — so the\n  payload stays valid without the reader having to guess what `0` meant.\n- **Dates are Microsoft's JSON literal**, `/Date(1549292100000+0100)/` — milliseconds since the\n  epoch plus a UTC offset. Not ISO 8601; an ISO string is not parsed.\n\nFields the service maintains itself (`Createur`, `DateCreation`, `DateModification`,\n`UtilisateurCreateur`) are **left out of the bodies**: sending them changes nothing. Confirmed by\ninserting a record with all three set and reading it back — Sage had replaced every one with its own\nvalue. Each request lists them under *Read-only fields*, so their absence reads as deliberate rather\nthan as an omission.\n\n## Examples\n\nSaved responses are real captures, never hand-written. They come from three places:\n\n- the previous collection — recorded in 2021 against a demo folder on an **older Sage**, so the data\n  is dated even though the shape is not;\n- a live **Sage V11 / BIJOU** host — the 401, and the rejection example on every write operation;\n- a live **Sage 12.25 / BIJOU** host — the newest captures, including the Peppol cases.\n\nThe product build is the same across those hosts (`WebServices100 1.17.6.0`), so what differs is\nthe data, not the contract. Large list responses were truncated, which the example name states. A missing\nerror example means that case was never captured, not that it cannot happen.\n\nThe status-code behaviours described above were checked on **both V11 and 12.25 and match**. The one\ndifference found: `JournalService.GetPeriodesJournal` reset the connection on V11 and answered\nnormally on 12.25.\n\nThe last full pass ran on **2026-08-31 against 12.25 only** — the V11 host no longer resolved, so its\ncaptures stand as recorded on 2026-08-28 rather than refreshed.","schema":"https://schema.getpostman.com/json/collection/v2.0.0/collection.json","isPublicCollection":false,"owner":"12189324","team":5313148,"collectionId":"0fef8fdb-1ebd-4f4e-b5dc-1666bd4d5e7a","publishedId":"2sBYAvtpJM","public":true,"publicUrl":"https://documenter-api.postman.tech/view/12189324/2sBYAvtpJM","privateUrl":"https://go.postman.co/documentation/12189324-0fef8fdb-1ebd-4f4e-b5dc-1666bd4d5e7a","customColor":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"},"documentationLayout":"classic-double-column","customisation":{"metaTags":[{"name":"description","value":""},{"name":"title","value":""}],"appearance":{"default":"light","themes":[{"name":"dark","logo":"https://content.pstmn.io/d0458eb4-3820-4c96-ba47-50283874005c/bG9nb19QUElfRGlnaXRhbFNvbHV0aW9uc19CTEFOQyByZWNhZHLDqS5wbmc=","colors":{"top-bar":"212121","right-sidebar":"303030","highlight":"FF6C37"}},{"name":"light","logo":"https://content.pstmn.io/ebaaaf7a-1111-4c15-86b5-94be71bfbb08/bG9nb19QUElfRGlnaXRhbFNvbHV0aW9uc19SVkIgcmVjYWRyw6kucG5n","colors":{"top-bar":"FFFFFF","right-sidebar":"303030","highlight":"FF6C37"}}]}},"version":"8.12.4","publishDate":"2026-09-01T10:15:51.000Z","activeVersionTag":"latest","documentationTheme":"light","metaTags":{"title":"","description":""},"logos":{"logoLight":"https://content.pstmn.io/ebaaaf7a-1111-4c15-86b5-94be71bfbb08/bG9nb19QUElfRGlnaXRhbFNvbHV0aW9uc19SVkIgcmVjYWRyw6kucG5n","logoDark":"https://content.pstmn.io/d0458eb4-3820-4c96-ba47-50283874005c/bG9nb19QUElfRGlnaXRhbFNvbHV0aW9uc19CTEFOQyByZWNhZHLDqS5wbmc="}},"statusCode":200},"environments":[{"name":"WS100Environnement","id":"51be6e11-3b9e-4c3d-b9c6-d4290de74c9a","owner":"12189324","values":[{"key":"url_sage100","value":"localhost:12345/Webservices100/BIJOU","type":"default","enabled":true},{"key":"url_sage100_root","value":"localhost:12345/Webservices100","type":"default","enabled":true},{"key":"token","value":"","type":"secret","enabled":true},{"key":"guidCial","value":"","type":"default","enabled":true},{"key":"guidCpta","value":"","type":"default","enabled":true},{"key":"senderId","value":"","type":"default","enabled":true},{"key":"customerId","value":"","type":"default","enabled":true},{"key":"senderSharedSecret","value":"","type":"secret","enabled":true}],"published":true}],"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/6060de20559111f61798a8140136cab6d66e2ae213d7141ee3d7b741c4d92c3a","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"},{"label":"WS100Environnement","value":"12189324-51be6e11-3b9e-4c3d-b9c6-d4290de74c9a"}],"canonicalUrl":"https://documenter.gw.postman.com/view/metadata/2sBYAvtpJM"}