{"id":23240734,"url":"https://github.com/skbkontur/extern-csharp-sdk","last_synced_at":"2026-05-25T11:01:08.294Z","repository":{"id":38192562,"uuid":"292237794","full_name":"skbkontur/extern-csharp-sdk","owner":"skbkontur","description":"SDK для работы с API Контур.Экстерна","archived":false,"fork":false,"pushed_at":"2026-05-04T05:21:58.000Z","size":2956,"stargazers_count":46,"open_issues_count":6,"forks_count":8,"subscribers_count":7,"default_branch":"master","last_synced_at":"2026-05-04T07:36:41.028Z","etag":null,"topics":["api","csharp","extern","extern-api","kontur","sdk"],"latest_commit_sha":null,"homepage":"https://developer.kontur.ru/doc/extern","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/skbkontur.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2020-09-02T09:25:02.000Z","updated_at":"2026-04-02T07:04:24.000Z","dependencies_parsed_at":"2023-12-22T15:30:13.419Z","dependency_job_id":"f0110f5f-28af-4257-84b6-5278b78a1b91","html_url":"https://github.com/skbkontur/extern-csharp-sdk","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/skbkontur/extern-csharp-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skbkontur%2Fextern-csharp-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skbkontur%2Fextern-csharp-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skbkontur%2Fextern-csharp-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skbkontur%2Fextern-csharp-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skbkontur","download_url":"https://codeload.github.com/skbkontur/extern-csharp-sdk/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skbkontur%2Fextern-csharp-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33471530,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-25T06:32:55.349Z","status":"ssl_error","status_checked_at":"2026-05-25T06:32:35.322Z","response_time":57,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["api","csharp","extern","extern-api","kontur","sdk"],"created_at":"2024-12-19T05:13:50.204Z","updated_at":"2026-05-25T11:01:08.230Z","avatar_url":"https://github.com/skbkontur.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SDK для интеграции с АПИ Контур Экстерн\n\n## Быстрый старт\n\n### Шаг 1. Создание и настройка объекта IExtern\n\nДля выполнения запросов необходимы реквизиты доступа, получить их можно обратившись по контактам, указанным в [соответствующем разделе  документации](https://developer.kontur.ru/Docs/extern-api/auth_oidc/api-key.html)\n\n#### Тестовая площадка\n\n```csharp\n    string apiKey = \"...\"; // Апи-ключ, назначенный вашему приложению, для использования на ТЕСТОВОЙ площадке\n    string someUserLogin = \"...\"; // Логин пользователя (на ТЕСТОВОЙ площадке), от имени которого выполняется аутентификация\n    string someUserPassword = \"...\"; // Пароль пользователя (на ТЕСТОВОЙ площадке), от имени которого выполняется аутентификация\n    string clientId = \"...\"; // Уникальное сервисное имя вашего приложения (на ТЕСТОВОЙ площадке)\n\n    IExtern externApi = new ExternBuilder()\n          .WithExternApiUrl(\n              new Uri(\"https://extern-api.testkontur.ru/\"), // урл ТЕСТОВОЙ площадки апи Экстерна\n              log)\n          .WithOpenIdAuthenticator(\n                builder =\u003e builder\n                .WithHttpConfiguration(new ExternalUrlHttpClientConfiguration(new Uri(\"https://identity.testkontur.ru\"))) // урл ТЕСТОВОЙ площадки сервиса аутентификации\n                .WithClientIdentification(clientId, apiKey)\n                .WithAuthenticationByPassword(someUserLogin, someUserPassword)\n                .Build())                \n           .Create();\n```   \n           \n#### Продуктовая площадка\n\n```csharp\n    // Значения параметров для продуктовой площадки не будут совпадать с аналогичными значениями для тестовой площадки\n    string apiKey = \"...\"; // Апи-ключ, назначенный вашему приложению, для использования на ПРОДУКТОВОЙ площадке\n    string someUserLogin = \"...\"; // Логин пользователя (на ПРОДУКТОВОЙ площадке), от имени которого выполняется аутентификация\n    string someUserPassword = \"...\"; // Пароль пользователя (на ПРОДУКТОВОЙ площадке), от имени которого выполняется аутентификация\n    string clientId = \"...\"; // Уникальное сервисное имя вашего приложения (на ПРОДУКТОВОЙ площадке)\n\n    IExtern externApi = new ExternBuilder()\n            .WithExternApiUrl(\n                new Uri(\"https://extern-api.kontur.ru/\"), // урл ПРОДУКТОВОЙ площадки апи Экстерна\n                log)\n            .WithPasswordAuthentication( // Дополнительно указывать урл ПРОДУКТОВОЙ площадки сервиса аутентификации не нужно, его значение используется по умолчанию.\n                                         // Для более гибкой настройки процесса аутентификации вместо вызова .WithPasswordAuthentication(...) можно воспользоваться\n                                         // .WithOpenIdAuthenticator(...), аналогично примеру для тестовой площадки. В этом случае в .WithHttpConfiguration(...) нужно\n                                         // будет передать урл ПРОДУКТОВОЙ площадки сервиса аутентификации - \"https://identity.kontur.ru\"\n                new Credentials(someUserLogin, someUserPassword),\n                clientId,\n                apiKey)\n            .Create();\n```\n            \n### Шаг 2. Выполнение запросов\n\nПосле создания и настройки объекта IExtern можно использовать его для выполнения запросов к АПИ. Например, загрузить все учетные записи, доступные аутентифицированному пользователю:\n\n```csharp\n    IReadOnlyList\u003cAccount\u003e accounts = await externApi.Accounts.List().SliceBy(100).LoadAllAsync();\n```\n\n## Аутентификация для выполнения запросов\n:warning: Дополнительно аутентифицироваться до выполнения запросов не нужно :warning:\n\n\nПри запросе сдк автоматически выполнит попытку аутентифицироваться.\n\n\nТакже сдк автоматически выполнит реаутентификакцию при истечении времени жизни токена. \n\n## Другие методы аутентификации\n\nДоступна аутентификация по сертификату, для этого вместо .WithPasswordAuthentication(...) нужно вызвать  .WithCertificateAuthentication(...).\n\nБолее подробно про процесс аутентификации можно прочитать [ в документации к АПИ](https://developer.kontur.ru/Docs/extern-api/index.html)\n\n## Примеры выполнения запросов\n\n### Загрузка контента документа в Сервис Контентов\n\n```csharp\n    Stream contentStream =  new MemoryStream(new byte[] {1, 2, 3});\n    Guid contentId = await externApi.Accounts.WithId(accountId).Contents.UploadAsync(contentStream);\n```\n\n### Создание черновика и документа с подписью в черновике\n\n```csharp\n    Draft draft = await externApi\n        .Accounts.WithId(accountId)\n        .Drafts.CreateDraftAsync(draftMetadata);\n\n    byte[] signature = new byte[] {1, 2, 3};\n    IDraftDocument document = DraftDocumentBuilder\n        .WithNewId()\n        .WithUploadedContent(contentId, \"application/xml\", signature)\n        .ToDocument();\n\n    await externApi\n        .Accounts.WithId(accountId)\n        .Drafts.WithId(draft.Id)\n        .SetDocumentAsync(document);\n```\n\n### Проверка черновика\n\n```csharp\n    ILongOperationAwaiter\u003cDraftCheckingStatus\u003e checkAwaiter = await externApi\n        .Accounts.WithId(accountId)\n        .Drafts.WithId(draft.Id)\n        .Check()\n        .StartAsync();\n    \n    DraftCheckingStatus draftCheckingStatus = await checkAwaiter.WaitForCompletion();\n```\n\n### Отправка черновика\n\n```csharp\n    ILongOperationAwaiter\u003cIDocflowWithDocuments, DraftSendingFailure\u003e sendAwaiter = await externApi\n        .Accounts.WithId(accountId)\n        .Drafts.WithId(draft.Id)\n        .TrySend()\n        .StartAsync();\n    \n    LongOperationResult\u003cIDocflowWithDocuments, DraftSendingFailure\u003e draftSendResult = await sendAwaiter.WaitForSuccessOrFailure();\n    IDocflowWithDocuments docflow = draftSendResult.GetSuccessResult();\n```\n\n### Получение ДО по идентификатору\n\n```csharp\n    IDocflowWithDocuments docflow = await externApi\n        .Accounts.WithId(accountId)\n        .Docflows.WithId(docflowId)\n        .GetAsync();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskbkontur%2Fextern-csharp-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskbkontur%2Fextern-csharp-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskbkontur%2Fextern-csharp-sdk/lists"}