Changelog
What changed in the Partner API, the SDKs and this website — newest first.
Partner API 1.4
- Charge electricity meters: read meter packages at your wallet's price, charge a meter with an operation id you save first, and read receipts, tokens and refunds.
- Direct recharge: read products, their locations and quotes, and read your own direct recharges. Requesting a direct recharge and correcting its recipient open later.
- Webhooks: register one HTTPS endpoint, receive signed outcome notifications, inspect deliveries and request redelivery. Notifications come from one fixed address per deployment.
- Each product needs its own permission; Anis staff add it to your application.
.NET SDK 2.2.0
- Read meter packages, charge meters and list your own meter charges. Read direct recharge products, locations and quotes, request a direct recharge, list your own and correct its recipient fields.
- Register your webhook endpoint, inspect deliveries and request redelivery without repeating a purchase.
- Verify incoming webhook signatures with the separate webhook key purpose.
TypeScript and Node.js SDK 2.2.0
- Read meter packages, charge meters and list your own meter charges. Read direct recharge products, locations and quotes, request a direct recharge, list your own and correct its recipient fields.
- Register your webhook endpoint, inspect deliveries and request redelivery without repeating a purchase.
- Verify incoming webhook signatures with the separate webhook key purpose.
PHP SDK 2.2.0
- Read meter packages, charge meters and list your own meter charges. Read direct recharge products, locations and quotes, request a direct recharge, list your own and correct its recipient fields.
- Register your webhook endpoint, inspect deliveries and request redelivery without repeating a purchase.
- Verify incoming webhook signatures with the separate webhook key purpose.
Python SDK 2.2.0
- Read meter packages, charge meters and list your own meter charges. Read direct recharge products, locations and quotes, request a direct recharge, list your own and correct its recipient fields.
- Register your webhook endpoint, inspect deliveries and request redelivery without repeating a purchase.
- Verify incoming webhook signatures with the separate webhook key purpose.
Partner API 1.3
- List the addresses allowed for your application, including who added each one and how many more you may add.
- Add or remove one public address at a time. Changes apply from your next request; repeated changes are safe.
- This feature is available only in the test environment Anis gives you. Production answers 404
resource_not_found.
Partner API 1.2
- A subcategory carries
categoryType—localorinternational— the kind of the category it belongs to, in the subcategory list and when you read one subcategory. - A catalogue card's
categorycarriestypewith the same two values, in the card list and when you read one card. You no longer need to read the categories to learn it. - Both are absent if Anis has not set a kind for the category. Owned cards, reveals and orders are unchanged. Nothing is removed or renamed: an integration that ignores unknown members keeps working.
.NET SDK 2.1.0
- A catalogue subcategory has the kind of its category (local or international), and a catalogue card's category has its kind too. Both read as unknown when Anis sends none.
- A catalogue card's category has its own model; the category and subcategory of owned cards, reveals and orders are unchanged.
TypeScript and Node.js SDK 2.1.0
- A catalogue subcategory has the kind of its category (local or international), and a catalogue card's category has its kind too. Both read as unknown when Anis sends none.
- A catalogue card's category has its own model; the category and subcategory of owned cards, reveals and orders are unchanged.
Python SDK 2.1.0
- A catalogue subcategory has the kind of its category (local or international), and a catalogue card's category has its kind too. Both read as unknown when Anis sends none.
- A catalogue card's category has its own model; the category and subcategory of owned cards, reveals and orders are unchanged.
PHP SDK 2.1.0
- A catalogue subcategory has the kind of its category (local or international), and a catalogue card's category has its kind too. Both read as unknown when Anis sends none.
- A catalogue card's category has its own model; the category and subcategory of owned cards, reveals and orders are unchanged.
.NET SDK 2.0.1
- A wallet whose balance is below zero — while it uses allowed debt — can be read again; 2.0.0 failed on it. Amounts in Anis's answers may carry a leading minus (
-150.000);-0.000reads as zero. - Orders are unchanged: a unit price that is not greater than zero is refused before anything is sent.
TypeScript and Node.js SDK 2.0.1
- A wallet whose balance is below zero — while it uses allowed debt — can be read again; 2.0.0 failed on it. Amounts in Anis's answers may carry a leading minus (
-150.000);-0.000reads as zero. - Orders are unchanged: a unit price that is not greater than zero is refused before anything is sent.
Python SDK 2.0.1
- A wallet whose balance is below zero — while it uses allowed debt — can be read again; 2.0.0 failed on it. Amounts in Anis's answers may carry a leading minus (
-150.000);-0.000reads as zero. - Orders are unchanged: a unit price that is not greater than zero is refused before anything is sent.
PHP SDK 2.0.1
- A wallet whose balance is below zero — while it uses allowed debt — can be read again; 2.0.0 failed on it. Amounts in Anis's answers may carry a leading minus (
-150.000);-0.000reads as zero. - Orders are unchanged: a unit price that is not greater than zero is refused before anything is sent.
- A small negative amount prints correctly (
-0.075).
Partner API v1 2026-10 / SDK 2.0.0
- Breaking changes: response signatures require tag="anis-response-v2" and cover the raw request Signature as well as Signature-Input. SDK 2.0.0 checks revoked, active, next and retired signing keys; SDK 1.x is deprecated.
- Every signing key verifies only answers created at or after its notBefore; retired keys remain published for 90 days. SDK 2.0.0 keeps the key document for at most 5 minutes from its original fetch and refuses a longer cache; an unknown key triggers at most one refresh per 30 seconds, including failed fetches, and revoked keys never trigger a refresh. Information calls keep working during a signing-key incident. New test vectors RS-112 and RS-113 cover answers created before an active or retired key starts.
- Order bodies are limited to 8,192 bytes and must be UTF-8; others are refused as 422 validation_failed. New 429 spending_limit_exceeded: an order that would exceed the application's spending cap (default 5,000 LYD per day, UTC windows) is not placed; Retry-After gives the seconds until the window ends, and a new order needs a new Idempotency-Key.
- Breaking changes: owned-card paths use owned-cards; soldCardId replaces id and operationId replaces orderOperationId. CardSummary carries faceValue, logo, subcategory and category. Order soldCards contain the full revealed credential.
- Breaking changes: one non-negative Money shape with three decimals; wallet currency is balance.currency. Empty strings and localized text are omitted. minimumQuantity is always 1 and maximumQuantity is the platform limit of 100.
- New signed self-service application suspension and key revocation, with a reason, immediate effect and email notifications; resume is staff-only. New unsigned catalogue-card read. The Evidence and disputes terms are DRAFT pending legal review.
Partner API 1.1
- The key submission answer carries
safetyCode: 16 characters, writtenXXXX-XXXX-XXXX-XXXX. After the key is submitted, Anis staff phone your technical contact and ask for it before your key goes live. - The invitation to enrol a key is emailed to your technical contact from
no-reply@anis.ly— it is valid for 24 hours and Anis staff never ask for it. An email “Your key is live” follows once your key is confirmed. - Every answer for an order (the first, a repeat and a read) now carries
cardId,quantityand yourexternalReference; once completed it carriestotaltoo. Card codes are still only in the first answer. - A read of a failed order carries
failureCode: why it failed. - The answer that first reports a paid order whose codes were withheld carries
codesWithheld: true. - Cards in the catalogue carry
minimumQuantityandmaximumQuantity; subcategories carry adisclaimerto show your end customer. - A reveal names the card (
card,invoiceId,purchasedAt) and gives theexpiryDate; theexpiryDateis also on the cards of an order answer. - Owned cards carry
unitPrice,expiryDate,invoiceNumber,faceValueandsubcategory.credentialAvailableistrueonly when a reveal would release a code; a refunded card readsfalse. - Every addition is optional: omitted when there is nothing to say.
Partner API 1.0
- Profile, wallets, catalogue, orders, owned cards, reveals and the signature self-check.
- Enrolment of keys, replacement with an overlap, and revocation.
- Every request signed with your key; every answer that moves money, delivers cards or establishes your key signed by Anis (orders, reveals, enrolment and the signature self-check).
.NET SDK 1.4.0
- The information calls (profile, wallets, catalogue, owned cards) are no longer verified, because Anis does not sign their answers; the signed calls (orders, reveals, enrolment, the signature self-check) are verified as before. Earlier versions verify every answer and fail on the information calls — use 1.4.0 or later.
PHP SDK 1.1.0
- The information calls (profile, wallets, catalogue, owned cards) are no longer verified, because Anis does not sign their answers; the signed calls (orders, reveals, enrolment, the signature self-check) are verified as before. Earlier versions verify every answer and fail on the information calls — use 1.1.0 or later.
TypeScript and Node.js SDK 1.1.0
- The information calls (profile, wallets, catalogue, owned cards) are no longer verified, because Anis does not sign their answers; the signed calls (orders, reveals, enrolment, the signature self-check) are verified as before. Earlier versions verify every answer and fail on the information calls — use 1.1.0 or later.
Python SDK 1.1.0
- The information calls (profile, wallets, catalogue, owned cards) are no longer verified, because Anis does not sign their answers; the signed calls (orders, reveals, enrolment, the signature self-check) are verified as before. Earlier versions verify every answer and fail on the information calls — use 1.1.0 or later.
Developer website 1.1
- New guides for the PHP, TypeScript and Node.js, and Python SDKs, each with its install line, configuration, orders and refusals, and links to the package and its source code.
- Every SDK card on the home page opens its guide.
- Every SDK page says plainly that the SDKs are optional helpers provided as is, and that the API can be used directly.
PHP SDK 1.0.0
- First release of
anis-ly/partnersfor PHP 8.2 to 8.5:composer require anis-ly/partners. It works with any PSR-18 HTTP client, and a PSR-16 cache lets PHP-FPM workers share the signing-key document. - The same behaviour as the .NET SDK 1.3.0: every request signed, every answer verified before it is read, the five order outcomes, typed refusals for every error code, key enrolment with the safety code, paging, and traces, metrics and logs that never record a secret.
- Checked against the same signing test vectors as every Anis SDK, and verified end to end against a live Anis environment.
- Provided free of charge under the MIT License, as is. The source code is public.
TypeScript and Node.js SDK 1.0.0
- First release of
@anis-ly/partnersfor Node.js 22 and later:npm install @anis-ly/partners. ES module and CommonJS builds with full types; every call takes anAbortSignal; published with a signed provenance statement. - The same behaviour as the .NET SDK 1.3.0: every request signed, every answer verified before it is read, the five order outcomes, typed refusals for every error code, key enrolment with the safety code, paging, and traces, metrics and logs that never record a secret.
- Checked against the same signing test vectors as every Anis SDK, and verified end to end against a live Anis environment.
- Provided free of charge under the MIT License, as is. The source code is public.
Python SDK 1.0.0
- First release of
anis-partnersfor Python 3.11 to 3.14:pip install anis-partners. A synchronous and an asynchronous client with the same results, fully typed; the asynchronous client accepts a signer and a cache that are coroutines. - The same behaviour as the .NET SDK 1.3.0: every request signed, every answer verified before it is read, the five order outcomes, typed refusals for every error code, key enrolment with the safety code, paging, and traces, metrics and logs that never record a secret.
- Checked against the same signing test vectors as every Anis SDK, and verified end to end against a live Anis environment.
- Provided free of charge under the MIT License, as is. The source code is public.
.NET SDK 1.3.0
- New
EnrollmentKeyResult.SafetyCode: the 16-character safety code of the key you submitted, which Anis staff ask you to read out on the phone before your key goes live. The sample prints it. SubmitKeyAsyncchecks the fingerprint the server returns against your own key before it sends anything else. If they differ it throws the newEnrollmentKeyMismatchException: do not continue, and write to support@anis.ly.- Nothing you have written stops compiling or changes behaviour.
.NET SDK 1.2.0
- New
Order.ExternalReference,Order.FailureCodeandOrder.CodesWithheld.OrderCompleted.CodesWithheldis nowtruewhen Anis says so or when the answer carries no codes, so the 1.1.0 behaviour still holds. - New
CatalogueCard.MinimumQuantityandMaximumQuantity: check them before you order. NewCatalogueSubcategory.Disclaimer: show it to your end customer before they buy. - New
RevealedCredential.ExpiryDate; on a reveal alsoInvoiceId,CardandPurchasedAt. - New on
MaskedCard:UnitPrice,ExpiryDate,InvoiceNumber(quote it to support),FaceValueandSubcategory.CredentialAvailableis nowtrueonly when a reveal would release a code; a refunded card readsfalse. - Every addition is optional: nothing you have written stops compiling or changes behaviour.
.NET SDK 1.1.0
- A rate-limited
CreateAsyncreturnsOrderOutcomeUnknowninstead ofOrderNotPlaced: resume the same id. invalid_credentials,insufficient_scopeandwallet_not_grantedon an order returnOrderOutcomeUnknownfromCreateAsynctoo (suggested delay 60 seconds): restore access first, then resume the same id.- New
OrderCompleted.CodesWithheld:truewhen the order is paid and complete but its codes were withheld. Do not buy it again. - A unit price that is not greater than zero is refused before sending, with
ArgumentOutOfRangeException. - New
EnrollmentStatus.KeyExpiresAt: the date your active key stops working. - Removed
EnrollmentKeyRequest.Cidrs: tell Anis staff your calling networks when you ask for access. - New error code
malformed_signed_request(400): the signed request is badly built. On an orderCreateAsyncreturns it asOrderOutcomeUnknown: fix the signing, then resume the same id.
.NET SDK 1.0.0
- For .NET 8 and .NET 10.
- Signs every request and verifies every answer; every call of the API.
- Safe orders: your own operation id, five result types, and for every refused order whether it was placed.
- Enrolment of a new key, including the proof of possession.
- Several Anis applications in one host.
- Traces, metrics and logs under
Anis.Partners.Sdk, never recording a secret.
Developer website 1.0
- Guides: getting started, enrolling a key, signing requests, verifying answers, signing test vectors, orders and recovery, errors and limits, routes and permissions, security, observability, and building with an AI assistant.
- An API reference page for every call, and a permanent page for every error code.
- English and Arabic.
- Ready for AI assistants: every page as Markdown,
llms.txt, rules for AI assistants, an OpenAPI description, the error codes as data, and signing test vectors.