{"id":21976793,"url":"https://github.com/stuartapp/stuart-client-csharp","last_synced_at":"2025-04-28T16:43:10.382Z","repository":{"id":33368540,"uuid":"151693330","full_name":"StuartApp/stuart-client-csharp","owner":"StuartApp","description":null,"archived":false,"fork":false,"pushed_at":"2022-12-08T01:47:54.000Z","size":63,"stargazers_count":3,"open_issues_count":6,"forks_count":5,"subscribers_count":51,"default_branch":"master","last_synced_at":"2024-04-25T01:08:24.217Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/StuartApp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-10-05T08:40:59.000Z","updated_at":"2024-04-25T01:08:24.218Z","dependencies_parsed_at":"2023-01-15T00:37:20.669Z","dependency_job_id":null,"html_url":"https://github.com/StuartApp/stuart-client-csharp","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuartApp%2Fstuart-client-csharp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuartApp%2Fstuart-client-csharp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuartApp%2Fstuart-client-csharp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/StuartApp%2Fstuart-client-csharp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/StuartApp","download_url":"https://codeload.github.com/StuartApp/stuart-client-csharp/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251347768,"owners_count":21575144,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-29T16:12:19.012Z","updated_at":"2025-04-28T16:43:10.361Z","avatar_url":"https://github.com/StuartApp.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Stuart C# Client\nCreated and provided by [OrderYOYO](https://orderyoyo.com)\n\nFor a complete documentation of all endpoints offered by the Stuart API, you can visit [Stuart API documentation](https://api-docs.stuart.com).\n\n## Install\nVia NuGet Package Manager:\n\n``` bash\n$ PM\u003e Install-Package stuart-client-csharp -Version 1.3.4\n```\n\n## Usage\n\n1. [Initialize Client](#initialize-client)\n2. [Create a Job](#create-a-job)\n    1. [Minimalist](#minimalist)\n    2. [Complete](#complete)\n        1. [With scheduling at pickup](#with-scheduling-at-pickup)\n        1. [With scheduling at drop off](#with-scheduling-at-dropoff)\n        2. [With stacking (multi-drop)](#with-stacking-multi-drop)\n3. [Get a Job](#get-a-job)\n4. [Cancel a Job](#cancel-a-job)\n5. [Validate a Job](#validate-a-job)\n6. [Cancel a delivery](#cancel-a-delivery)\n7. [Get a pricing](#get-a-pricing)\n8. [Get a job eta to pickup](#get-a-job-eta-to-pickup)\n\n### Initialize client\n\n```c#\nvar clientId = \"\u003cput_your_ID_here\u003e\"; // can be found here: https://admin.sandbox.stuart.com/client/api\nvar clientSecret = \"\u003cput_your_secret_here\u003e\"; // can be found here: https://admin.sandbox.stuart.com/client/api\nvar environment = Environment.Sandbox;\nvar stuartApi = StuartApi.Initialize(environment, clientId, clientSecret);\n```\n\n### Create a Job\n\n**Important**: Even if you can create a Job with a minimal set of parameters, we **highly recommend** that you fill as many information as \nyou can in order to ensure the delivery process goes well.\n\n#### Minimalist\n\n##### Package size based\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\",\n                PackageType = PackageSizeType.small\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n##### Transport type based (France only)\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        TransportType = TransportType.bike\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\"\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n#### Complete\n\n##### Package size based\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\",\n                Comment = \"Wait outside for an employee to come.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Martin\",\n                    LastName = \"Pont\",\n                    Phone = \"+33698348756\",\n                    Company = \"KFC Paris Barbès\"\n                }\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                PackageType = PackageSizeType.small,\n                PackageDescription = \"Pizza box\",\n                ClientReference = \"12345678ABCDE\", // Must be unique\n                Address = \"42 rue rivoli, 75001 Paris\",\n                Comment = \"code: 3492B. 3e étage droite. Sonner à Durand.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Alex\",\n                    LastName = \"Durand\",\n                    Phone = \"+33634981209\",\n                }\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n##### Transport type based (France only)\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        TransportType = TransportType.bike\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\",\n                Comment = \"Wait outside for an employee to come.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Martin\",\n                    LastName = \"Pont\",\n                    Phone = \"+33698348756\",\n                    Company = \"KFC Paris Barbès\"\n                }\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                PackageDescription = \"Pizza box\",\n                ClientReference = \"12345678ABCDE\", // Must be unique\n                Address = \"42 rue rivoli, 75001 Paris\",\n                Comment = \"code: 3492B. 3e étage droite. Sonner à Durand.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Alex\",\n                    LastName = \"Durand\",\n                    Phone = \"+33634981209\",\n                }\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n#### With scheduling at pickup\n\nFor more information about job scheduling you should [check our API documentation](https://stuart.api-docs.io/v2/jobs/scheduling-a-job).\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUpAt = DateTime.UtcNow.AddHours(2),\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\",\n                PackageType = PackageSizeType.small\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n#### With scheduling at dropoff\n\nFor more information about job scheduling you should [check our API documentation](https://stuart.api-docs.io/v2/jobs/scheduling-a-job).\n\nPlease note that this feature can only be used with only one dropoff.\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        DropOffAt = DateTime.UtcNow.AddHours(2),\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\",\n                PackageType = PackageSizeType.small\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n#### With stacking (multi-drop)\n\n##### Package size based\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\",\n                Comment = \"Wait outside for an employee to come.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Martin\",\n                    LastName = \"Pont\",\n                    Phone = \"+33698348756\",\n                    Company = \"KFC Paris Barbès\"\n                }\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                PackageType = PackageSizeType.small,\n                PackageDescription = \"Red packet.\",\n                ClientReference = \"12345678ABCDE\", // Must be unique\n                Address = \"42 rue rivoli, 75001 Paris\",\n                Comment = \"code: 3492B. 3e étage droite. Sonner à Durand.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Alex\",\n                    LastName = \"Durand\",\n                    Phone = \"+33634981209\",\n                }\n            },\n            new DropOff\n            {\n                PackageType = PackageSizeType.small,\n                PackageDescription = \"Blue packet.\",\n                ClientReference = \"ABCDE213124\", // Must be unique\n                Address = \"156 rue de Charonne, 75011 Paris\",\n                Comment = \"code: 92A42. 2e étage gauche\",\n                Contact = new Contact\n                {\n                    FirstName = \"Maximilien\",\n                    LastName = \"Lebluc\",\n                    Phone = \"+33632341209\",\n                }\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n##### Transport type based (France only)\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        TransportType = TransportType.bike\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\",\n                Comment = \"Wait outside for an employee to come.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Martin\",\n                    LastName = \"Pont\",\n                    Phone = \"+33698348756\",\n                    Company = \"KFC Paris Barbès\"\n                }\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                PackageDescription = \"Red packet.\",\n                ClientReference = \"12345678ABCDE\", // Must be unique\n                Address = \"42 rue rivoli, 75001 Paris\",\n                Comment = \"code: 3492B. 3e étage droite. Sonner à Durand.\",\n                Contact = new Contact\n                {\n                    FirstName = \"Alex\",\n                    LastName = \"Durand\",\n                    Phone = \"+33634981209\",\n                }\n            },\n            new DropOff\n            {\n                PackageDescription = \"Blue packet.\",\n                ClientReference = \"ABCDE213124\", // Must be unique\n                Address = \"156 rue de Charonne, 75011 Paris\",\n                Comment = \"code: 92A42. 2e étage gauche\",\n                Contact = new Contact\n                {\n                    FirstName = \"Maximilien\",\n                    LastName = \"Lebluc\",\n                    Phone = \"+33632341209\",\n                }\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);\n```\n\n### Get a Job\n\nOnce you successfully created a Job you can retrieve it this way:\n\n```c#\nvar jobId = 126532;\nvar job = await StuartApi.Job.GetJob(jobId);\n```\n\nOr when you create a new Job:\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\",\n                PackageType = PackageSizeType.small\n            }\n        }\n    }\n};\n\nvar createdJob = await StuartApi.Job.CreateJob(job);    \ncreatedJob.Deliveries\n```\n\nThe Stuart API determine the optimal route on your behalf, \nthat's why the `createdJob.Deliveries` propery will be empty \n`List` when the Job has not been created yet. The `createdJob.Deliveries` \npropery will contain a `List` of `Delivery` as soon as the Job is created.\n\n### Cancel a job\n\nOnce you successfully created a Job you can cancel it in this way:\n\n```c#\nvar jobId = 126532;\nawait StuartApi.Job.CancelJob(jobId);\n```\n\nThe method `CancelJob();` will return only `Task` if the job was cancelled. If\nthere was an error, it will throw an exception with information about reason.\n\nFor more details about how cancellation works, please refer to our [dedicated documentation section](https://stuart.api-docs.io/v2/jobs/job-cancellation).\n\n### Validate a Job\n\nBefore creating a Job you can validate it (control delivery area \u0026 address format). Validating a Job is **optional** and does not prevent you from creating a Job.\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\",\n                PackageType = PackageSizeType.small\n            }\n        }\n    }\n};\n\nvar result = await StuartApi.Job.ValidateParameters(job);\n```\n\nThe result will hold the boolean value `true` if the job is valid. If\nthere was an error, it will throw an exception with information about reason.\n\n### Cancel a delivery\n\nOnce you successfully created a Delivery you can cancel it in this way:\n\n```c#\nvar deliveryId = 126532;\nawait StuartApi.Job.CancelDelivery(deliveryId);\n```\n\n\n### Get a pricing\n\nBefore creating a Job you can ask for a pricing. Asking for a pricing is **optional** and does not prevent you from creating a Job.\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\",\n                PackageType = PackageSizeType.small\n            }\n        }\n    }\n};\n\nvar result = await StuartApi.Job.RequestJobPricing(job);    \n    \nresult.Amount; // example: 11.5\nresult.Currency; // example: \"EUR\"\n```\n\n### Get a job ETA to pickup\n\nBefore creating a Job you can ask for an estimated time of arrival at the pickup location (expressed in seconds). \nAsking for ETA is **optional** and does not prevent you from creating a job.\n\n```c#\nvar job = new JobRequest\n{\n    Job = new Job\n    {\n        PickUps = new List\u003cPickUp\u003e\n        {\n            new PickUp\n            {\n                Address = \"12 rue rivoli, 75001 Paris\"\n            }\n        },\n        DropOffs = new List\u003cDropOff\u003e\n        {\n            new DropOff\n            {\n                Address = \"42 rue rivoli, 75001 Paris\",\n                PackageType = PackageSizeType.small\n            }\n        }\n    }\n};\n    \nvar eta = await StuartApi.Job.RequestEta(job);\neta; // example: 672\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstuartapp%2Fstuart-client-csharp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstuartapp%2Fstuart-client-csharp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstuartapp%2Fstuart-client-csharp/lists"}