{"id":47453044,"url":"https://github.com/AbacatePay/abacatepay-ruby-sdk","last_synced_at":"2026-04-07T02:00:42.619Z","repository":{"id":267889099,"uuid":"902665491","full_name":"AbacatePay/abacatepay-ruby-sdk","owner":"AbacatePay","description":"AbacatePay Ruby SDK for you to start receiving payments in seconds","archived":false,"fork":false,"pushed_at":"2026-03-30T17:31:47.000Z","size":88,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-03-30T19:03:13.518Z","etag":null,"topics":["abacatepay","abacatepay-sdk","ruby"],"latest_commit_sha":null,"homepage":"https://www.abacatepay.com/","language":"Ruby","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/AbacatePay.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","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},"funding":{"github":"AbacatePay","custom":"https://abacatepay.com"}},"created_at":"2024-12-13T02:51:21.000Z","updated_at":"2026-03-30T17:31:51.000Z","dependencies_parsed_at":"2024-12-13T03:48:57.131Z","dependency_job_id":"0745380a-0aa3-44d3-8222-6e7ed7b6c6aa","html_url":"https://github.com/AbacatePay/abacatepay-ruby-sdk","commit_stats":null,"previous_names":["abacatepay/abacatepay-ruby-sdk"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/AbacatePay/abacatepay-ruby-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbacatePay%2Fabacatepay-ruby-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbacatePay%2Fabacatepay-ruby-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbacatePay%2Fabacatepay-ruby-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbacatePay%2Fabacatepay-ruby-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AbacatePay","download_url":"https://codeload.github.com/AbacatePay/abacatepay-ruby-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AbacatePay%2Fabacatepay-ruby-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31496769,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-06T17:22:55.647Z","status":"online","status_checked_at":"2026-04-07T02:00:07.164Z","response_time":105,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["abacatepay","abacatepay-sdk","ruby"],"created_at":"2026-03-23T18:00:26.473Z","updated_at":"2026-04-07T02:00:42.611Z","avatar_url":"https://github.com/AbacatePay.png","language":"Ruby","funding_links":["https://github.com/sponsors/AbacatePay","https://abacatepay.com"],"categories":["SDKs"],"sub_categories":[],"readme":"# AbacatePay Ruby SDK\n\nRuby SDK for [AbacatePay](https://www.abacatepay.com/) payment gateway. Works with any Ruby application (Rails, Sinatra, Hanami, plain Ruby).\n\n## Installation\n\nAdd to your Gemfile:\n\n```ruby\ngem 'abacatepay-ruby'\n```\n\nThen run:\n\n```bash\nbundle install\n```\n\nOr install directly:\n\n```bash\ngem install abacatepay-ruby\n```\n\n## Configuration\n\n```ruby\nAbacatePay.configure do |config|\n  config.api_token = ENV['ABACATEPAY_TOKEN']\n  config.environment = :sandbox # or :production\n  config.timeout = 30 # optional, in seconds\nend\n```\n\nFor Rails, place this in `config/initializers/abacatepay.rb`.\n\n## Usage\n\nThe SDK provides a convenience facade for all resources:\n\n```ruby\nAbacatePay.customers.list\nAbacatePay.checkouts.create(data)\nAbacatePay.products.get(id)\n```\n\nOr instantiate clients directly:\n\n```ruby\nclient = AbacatePay::Clients::CheckoutClient.new\nclient.list\n```\n\nAll `list` methods accept optional pagination parameters:\n\n```ruby\nAbacatePay.customers.list(limit: 10, after: \"cursor_abc\")\n```\n\n---\n\n## Resources\n\n### Customers\n\n```ruby\n# List all customers\nAbacatePay.customers.list\n\n# Get a customer by ID\nAbacatePay.customers.get(\"cust_123\")\n\n# Create a customer\nAbacatePay.customers.create(\n  AbacatePay::Resources::Customers.new(\n    metadata: AbacatePay::Resources::Customers::Metadata.new(\n      name: 'Abacate Lover',\n      cellphone: '01912341234',\n      email: 'lover@abacate.com',\n      tax_id: '13827826837'\n    )\n  )\n)\n\n# Delete a customer\nAbacatePay.customers.delete(\"cust_123\")\n```\n\n### Products\n\n```ruby\n# List all products\nAbacatePay.products.list\n\n# Get a product\nAbacatePay.products.get(\"prod_123\")\n\n# Create a product\nAbacatePay.products.create(\n  AbacatePay::Resources::Products.new(\n    externalId: 'my-product-1',\n    name: 'Monthly Plan',\n    price: 2990, # R$ 29.90 in cents\n    currency: 'BRL',\n    description: 'Access to all features',\n    cycle: 'MONTHLY' # WEEKLY, MONTHLY, SEMIANNUALLY, ANNUALLY or nil for one-time\n  )\n)\n\n# Delete a product\nAbacatePay.products.delete(\"prod_123\")\n```\n\n### Coupons\n\n```ruby\n# List all coupons\nAbacatePay.coupons.list\n\n# Get a coupon\nAbacatePay.coupons.get(\"coup_123\")\n\n# Create a coupon\nAbacatePay.coupons.create(\n  AbacatePay::Resources::Coupons.new(\n    code: 'SAVE20',\n    discount: 20,\n    discountKind: 'PERCENTAGE', # or 'FIXED'\n    maxRedeems: 100\n  )\n)\n\n# Toggle coupon active/inactive\nAbacatePay.coupons.toggle(\"coup_123\")\n\n# Delete a coupon\nAbacatePay.coupons.delete(\"coup_123\")\n```\n\n### Checkouts\n\n```ruby\n# List checkouts (with optional filters)\nAbacatePay.checkouts.list\nAbacatePay.checkouts.list(status: \"PAID\", email: \"user@example.com\")\n\n# Get a checkout\nAbacatePay.checkouts.get(\"chk_123\")\n\n# Create a checkout with a new customer\nAbacatePay.checkouts.create(\n  AbacatePay::Resources::Checkouts.new(\n    frequency: 'ONE_TIME',\n    methods: ['PIX', 'CARD'],\n    products: [\n      AbacatePay::Resources::Billings::Product.new(\n        external_id: 'abc_123',\n        name: 'Product A',\n        description: 'Description of product A',\n        quantity: 1,\n        price: 100\n      )\n    ],\n    metadata: AbacatePay::Resources::Billings::Metadata.new(\n      return_url: 'https://yoursite.com/cancel',\n      completion_url: 'https://yoursite.com/success'\n    ),\n    customer: AbacatePay::Resources::Customers.new(\n      metadata: AbacatePay::Resources::Customers::Metadata.new(\n        name: 'Abacate Lover',\n        cellphone: '01912341234',\n        email: 'lover@abacate.com',\n        tax_id: '13827826837'\n      )\n    )\n  )\n)\n\n# Create a checkout with an existing customer\nAbacatePay.checkouts.create(\n  AbacatePay::Resources::Checkouts.new(\n    frequency: 'ONE_TIME',\n    methods: ['PIX'],\n    products: [...],\n    customer: AbacatePay::Resources::Customers.new(id: 'cust_DEbpqcN...')\n  )\n)\n\n# Create a reusable payment link\nAbacatePay.checkouts.create(\n  AbacatePay::Resources::Checkouts.new(\n    frequency: 'MULTIPLE_PAYMENTS',\n    methods: ['PIX'],\n    products: [...]\n  )\n)\n```\n\n### Subscriptions\n\n```ruby\n# List subscriptions\nAbacatePay.subscriptions.list\n\n# Create a subscription (requires exactly 1 product with a cycle)\nAbacatePay.subscriptions.create(\n  AbacatePay::Resources::Subscriptions.new(\n    methods: ['PIX'],\n    customer: AbacatePay::Resources::Customers.new(id: 'cust_123'),\n    products: [\n      AbacatePay::Resources::Billings::Product.new(\n        external_id: 'plan-monthly',\n        name: 'Monthly Plan',\n        price: 2990,\n        quantity: 1\n      )\n    ]\n  )\n)\n```\n\n### PIX Transparent Payments (QR Code)\n\n```ruby\n# List QR codes\nAbacatePay.transparents.list\n\n# Generate a PIX QR code\nAbacatePay.transparents.create(\n  AbacatePay::Resources::Transparents.new(\n    amount: 1000, # R$ 10.00\n    description: 'Payment for order #123',\n    expiresIn: 3600\n  )\n)\n\n# Check payment status\nAbacatePay.transparents.check(\"tr_123\")\n\n# Simulate payment (dev mode only)\nAbacatePay.transparents.simulate_payment(\"tr_123\")\n```\n\n### PIX Transfers\n\n```ruby\n# List transfers\nAbacatePay.pix.list\n\n# Get a transfer\nAbacatePay.pix.get(\"pix_123\")\n\n# Send PIX to an external key\nAbacatePay.pix.send_pix(\n  AbacatePay::Resources::PixTransfers.new(\n    amount: 500, # R$ 5.00\n    externalId: 'transfer-001',\n    description: 'Payment to vendor',\n    key: '12345678900',\n    keyType: 'CPF' # CPF, CNPJ, PHONE, EMAIL, RANDOM, BR_CODE\n  )\n)\n```\n\n### Payouts\n\n```ruby\n# List payouts\nAbacatePay.payouts.list\n\n# Get a payout\nAbacatePay.payouts.get(\"pay_123\")\n\n# Create a withdrawal (minimum R$ 3.50)\nAbacatePay.payouts.create(\n  AbacatePay::Resources::Payouts.new(\n    amount: 5000, # R$ 50.00\n    externalId: 'withdrawal-001',\n    description: 'Monthly withdrawal'\n  )\n)\n```\n\n### Store\n\n```ruby\n# Get account details (balance info)\nstore = AbacatePay.store.get\nstore.balance.available # =\u003e 10000\nstore.balance.pending   # =\u003e 500\nstore.balance.blocked   # =\u003e 0\n\n# Get merchant info\nAbacatePay.store.merchant_info\n\n# Get MRR metrics\nAbacatePay.store.mrr\n\n# Get revenue by period\nAbacatePay.store.revenue(start_date: '2026-01-01', end_date: '2026-03-30')\n```\n\n---\n\n## Webhooks\n\nVerify webhook signatures and parse events:\n\n```ruby\npayload = request.body.read\nsignature = request.headers['X-Webhook-Signature']\nsecret = ENV['ABACATEPAY_WEBHOOK_SECRET']\n\n# Verify signature (raises AbacatePay::Webhooks::SignatureError if invalid)\nAbacatePay::Webhooks.verify!(payload: payload, signature: signature, secret: secret)\n\n# Or use the boolean version\nif AbacatePay::Webhooks.valid?(payload: payload, signature: signature, secret: secret)\n  event = AbacatePay::Webhooks.parse(payload)\n\n  case event.type\n  when 'checkout.completed'\n    # handle successful payment\n  when 'checkout.refunded'\n    # handle refund\n  when 'subscription.renewed'\n    # handle subscription renewal\n  end\nend\n```\n\n### Webhook event types\n\n| Category | Events |\n|---|---|\n| Checkout | `checkout.completed`, `checkout.refunded`, `checkout.disputed` |\n| Transparent | `transparent.completed`, `transparent.refunded`, `transparent.disputed` |\n| Subscription | `subscription.completed`, `subscription.renewed`, `subscription.cancelled` |\n| Transfer | `transfer.completed`, `transfer.failed` |\n| Payout | `payout.completed`, `payout.failed` |\n\n---\n\n## Enums\n\nAvailable enum values for validation:\n\n| Enum | Values |\n|---|---|\n| `Billings::Methods` | `PIX`, `CARD` |\n| `Billings::Frequencies` | `ONE_TIME`, `WEEKLY`, `MONTHLY`, `SEMIANNUALLY`, `ANNUALLY`, `MULTIPLE_PAYMENTS` |\n| `Billings::Statuses` | `PENDING`, `EXPIRED`, `CANCELLED`, `PAID`, `REFUNDED` |\n| `Products::Cycles` | `WEEKLY`, `MONTHLY`, `SEMIANNUALLY`, `ANNUALLY` |\n| `Coupons::Statuses` | `ACTIVE`, `INACTIVE`, `EXPIRED` |\n| `Coupons::DiscountKinds` | `PERCENTAGE`, `FIXED` |\n| `Pix::KeyTypes` | `CPF`, `CNPJ`, `PHONE`, `EMAIL`, `RANDOM`, `BR_CODE` |\n| `Transfers::Statuses` | `PENDING`, `COMPLETE`, `CANCELLED`, `EXPIRED`, `REFUNDED`, `FAILED` |\n| `Payouts::Statuses` | `PENDING`, `COMPLETE`, `CANCELLED`, `EXPIRED`, `REFUNDED` |\n\n---\n\n## Error Handling\n\n```ruby\nbegin\n  AbacatePay.checkouts.create(data)\nrescue AbacatePay::ConfigurationError =\u003e e\n  # API token missing or invalid environment\nrescue AbacatePay::ApiError =\u003e e\n  # API request failed\nrescue AbacatePay::Webhooks::SignatureError =\u003e e\n  # Invalid webhook signature\nend\n```\n\n---\n\n## Documentation\n\nOfficial API documentation: https://abacatepay.readme.io/reference\n\n## Contribution\n\nContributions are welcome! To contribute:\n\n1. Fork the repository\n2. Create a branch: `git checkout -b feature/your-feature-name`\n3. Make your changes and commit\n4. Push to your branch: `git push origin feature/your-feature-name`\n5. Open a pull request\n\nPlease ensure your code:\n\n- Follows Ruby style guidelines\n- Includes appropriate tests\n- Passes all tests (`bundle exec rspec`)\n- Passes style checks (`bundle exec rubocop`)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAbacatePay%2Fabacatepay-ruby-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FAbacatePay%2Fabacatepay-ruby-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FAbacatePay%2Fabacatepay-ruby-sdk/lists"}