Changelog

What changed in the Partner API, the SDKs and this website — newest first.

Partner API 1.4

Released 27 October 2026Meter charges, direct recharge and signed outcome notifications

  • 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

Released 27 October 2026Meter charges, direct recharge and signed outcome notifications

  • 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

Released 27 October 2026Meter charges, direct recharge and signed outcome notifications

  • 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

Released 27 October 2026Meter charges, direct recharge and signed outcome notifications

  • 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

Released 27 October 2026Meter charges, direct recharge and signed outcome notifications

  • 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

Released 19 October 2026Manage your own allowed addresses on your test environment

  • 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

Released 18 October 2026Subcategories and cards say whether their category is local or international

  • A subcategory carries categoryType — local or international — the kind of the category it belongs to, in the subcategory list and when you read one subcategory.
  • A catalogue card's category carries type with 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

Released 18 October 2026Read the category kind on subcategories and cards

  • 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

Released 18 October 2026Read the category kind on subcategories and cards

  • 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

Released 18 October 2026Read the category kind on subcategories and cards

  • 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

Released 18 October 2026Read the category kind on subcategories and cards

  • 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

Released 13 October 2026A wallet in debt can be read

  • 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.000 reads 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

Released 13 October 2026A wallet in debt can be read

  • 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.000 reads 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

Released 13 October 2026A wallet in debt can be read

  • 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.000 reads 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

Released 13 October 2026A wallet in debt can be read

  • 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.000 reads 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

Released 13 October 2026API v1 2026-10 / SDK 2.0.0 — Breaking changes

  • 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

Released 10 October 2026Answers that say more, and a safety code for new keys

  • The key submission answer carries safetyCode: 16 characters, written XXXX-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, quantity and your externalReference; once completed it carries total too. 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 minimumQuantity and maximumQuantity; subcategories carry a disclaimer to show your end customer.
  • A reveal names the card (card, invoiceId, purchasedAt) and gives the expiryDate; the expiryDate is also on the cards of an order answer.
  • Owned cards carry unitPrice, expiryDate, invoiceNumber, faceValue and subcategory. credentialAvailable is true only when a reveal would release a code; a refunded card reads false.
  • Every addition is optional: omitted when there is nothing to say.

Partner API 1.0

Released 10 October 2026First version of the Partner API

  • 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

Released 7 October 2026Information calls are no longer verified

  • 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

Released 7 October 2026Information calls are no longer verified

  • 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

Released 7 October 2026Information calls are no longer verified

  • 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

Released 7 October 2026Information calls are no longer verified

  • 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

Released 6 October 2026A page for every SDK

  • 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

Released 6 October 2026The PHP SDK

  • First release of anis-ly/partners for 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

Released 6 October 2026The TypeScript and Node.js SDK

  • First release of @anis-ly/partners for Node.js 22 and later: npm install @anis-ly/partners. ES module and CommonJS builds with full types; every call takes an AbortSignal; 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

Released 6 October 2026The Python SDK

  • First release of anis-partners for 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

Released 5 October 2026A safety code for every new key

  • 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.
  • SubmitKeyAsync checks the fingerprint the server returns against your own key before it sends anything else. If they differ it throws the new EnrollmentKeyMismatchException: do not continue, and write to support@anis.ly.
  • Nothing you have written stops compiling or changes behaviour.

.NET SDK 1.2.0

Released 4 October 2026More of what Anis knows about a card and an order

  • New Order.ExternalReference, Order.FailureCode and Order.CodesWithheld. OrderCompleted.CodesWithheld is now true when Anis says so or when the answer carries no codes, so the 1.1.0 behaviour still holds.
  • New CatalogueCard.MinimumQuantity and MaximumQuantity: check them before you order. New CatalogueSubcategory.Disclaimer: show it to your end customer before they buy.
  • New RevealedCredential.ExpiryDate; on a reveal also InvoiceId, Card and PurchasedAt.
  • New on MaskedCard: UnitPrice, ExpiryDate, InvoiceNumber (quote it to support), FaceValue and Subcategory. CredentialAvailable is now true only when a reveal would release a code; a refunded card reads false.
  • Every addition is optional: nothing you have written stops compiling or changes behaviour.

.NET SDK 1.1.0

Released 3 October 2026Order outcomes that never invite a second purchase

  • A rate-limited CreateAsync returns OrderOutcomeUnknown instead of OrderNotPlaced: resume the same id.
  • invalid_credentials, insufficient_scope and wallet_not_granted on an order return OrderOutcomeUnknown from CreateAsync too (suggested delay 60 seconds): restore access first, then resume the same id.
  • New OrderCompleted.CodesWithheld: true when 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 order CreateAsync returns it as OrderOutcomeUnknown: fix the signing, then resume the same id.

.NET SDK 1.0.0

Released 28 September 2026First release of the .NET SDK

  • 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

Released 24 September 2026First version of the developer website

  • 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.