Chisle
The coding-agent plugin that bills 52% of a bare model across 20 live tasks. Terse persona + tool-output compressor + context diet.
翻訳待ち
The .NET SDK for the Anis Partner API — signed requests, verified responses, typed operations. NuGet: Anis.Partners
翻訳待ち
Loading the full README.
Read the full README ↗Version 2.3.0. 1.x is deprecated — upgrade.
The .NET client for the Anis Partner API. Targets net8.0 and net10.0.
Every request is signed, every answer Anis signs is verified, and the operations are typed. The parts that are easy to get dangerously wrong — the idempotency key, the credential-once rule, recovery after a timeout, response verification — are shaped so you cannot get them wrong quietly.
dotnet add package Anis.Partners --version 2.3.0
The Anis Partner API does not use an API key. Every request is signed with RFC 9421 HTTP Message
Signatures over P-256/SHA-256, the body is bound in with an RFC 9530 Content-Digest, and the
signature must be IEEE P1363 — the DER encoding of the same signature is refused. Every answer that moves
money, delivers card codes or establishes or stops access is signed too — orders, order reads, both reveals,
access stops, enrolment and
the signature self-check, the success and every refusal — and the contract requires clients to discard any of
those they cannot verify. The information reads (profile, wallets, catalogue, owned cards) are answered unsigned.
None of that fits an "auth provider" hook, which sets one header and never sees the method, authority,
path, query or body bytes. All of those are signed. Get one wrong and you get a 401 with — correctly — no
hint as to which.
builder.Services
.AddAnisPartners(builder.Configuration.GetSection("AnisPartners")) // Authority, SignatureLifetime, …
.WithSigner(EcdsaP256Signer.FromPemFile("/secure/partner-key.pem", keyId));
Then take IAnisPartnersClient from the container. Settings can also be given in code — see
Getting started. They are validated when the host starts.
WithSigner is a separate step on purpose: there is no default, because there is no safe guess about where
your private key lives. It can be any custody — IRequestSigner takes bytes and returns 64 bytes.
var profile = await anis.Profile.GetAsync(ct);
await foreach (var wallet in anis.Wallets.ListAsync(ct)) // cursor paging, handled
Console.WriteLine($"{wallet.Name} {wallet.Balance}");
await foreach (var card in anis.Catalogue.ListCardsAsync(walletId, subcategoryId, ct)) // every page, followed for you
Console.WriteLine($"{card.Name?.En} {card.UnitPrice}");
var catalogueCard = await anis.Catalogue.GetCardAsync(walletId, cardId, ct);
var ownedCard = await anis.OwnedCards.GetAsync(walletId, soldCardId, ct);
Console.WriteLine($"{ownedCard.SoldCardId} {ownedCard.Card?.FaceValue} {ownedCard.Card?.Category?.Name?.En}");
var credential = await anis.OwnedCards.RevealAsync(walletId, soldCardId, ct);
var credentials = await anis.OwnedCards.RevealInvoiceAsync(walletId, invoiceId, ct); // all or none, max 100
To stop access, supply a required reason (1–500 characters after trimming). These calls need no scope and verify their signed answers. Resumption is staff-only; revocation is terminal.
var suspended = await anis.Access.SuspendApplicationAsync("Pause while investigating an incident", ct);
To revoke one key while the application is admitted:
var revoked = await anis.Access.RevokeKeyAsync(keyId, "Key exposed", ct);
MaskedCard uses SoldCardId and OperationId; product details are in CardSummary (Card). The same summary
appears in reveals and order SoldCards. Catalogue cards include Logo and Category (Category.Type is local
or international); subcategories include CategoryType and Description. Wallet currency is Balance.Currency.
All amounts use Money, a decimal string at scale three
with an uppercase three-letter currency. A wallet balance is negative (for example -150.000) while the wallet uses
allowed debt; prices and totals are never negative. Owned-card routes use /owned-cards.
Signed answers require tag="anis-response-v2" and bind both request signature headers. The verifier refuses
compromised keys, signatures after a key's retirement and signatures before any published key's activation.
The key document is cached for five minutes by default and at most; an unknown key triggers a refresh at most
once every 30 seconds. Retired keys remain published for 90 days after retirement. See
Security for the closed verification failure vocabulary.
Buying is deliberately less convenient — see Orders and recovery:
This is the beginning of the README. Read the rest at the original. Read the full README ↗