{"id":13758007,"url":"https://github.com/princemaple/extripe","last_synced_at":"2025-10-21T14:43:47.864Z","repository":{"id":4054188,"uuid":"51812259","full_name":"princemaple/extripe","owner":"princemaple","description":"Elixir Stripe API wrapper","archived":true,"fork":false,"pushed_at":"2022-11-22T22:40:29.000Z","size":135,"stargazers_count":27,"open_issues_count":1,"forks_count":4,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-09-24T01:46:02.297Z","etag":null,"topics":["elixir","stripe","stripe-api-wrapper"],"latest_commit_sha":null,"homepage":"http://hexdocs.pm/extripe/","language":"Elixir","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/princemaple.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}},"created_at":"2016-02-16T06:06:19.000Z","updated_at":"2023-09-01T11:25:42.000Z","dependencies_parsed_at":"2023-01-13T12:54:53.884Z","dependency_job_id":null,"html_url":"https://github.com/princemaple/extripe","commit_stats":null,"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/princemaple/extripe","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/princemaple%2Fextripe","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/princemaple%2Fextripe/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/princemaple%2Fextripe/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/princemaple%2Fextripe/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/princemaple","download_url":"https://codeload.github.com/princemaple/extripe/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/princemaple%2Fextripe/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278217052,"owners_count":25950032,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-03T02:00:06.070Z","response_time":53,"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":["elixir","stripe","stripe-api-wrapper"],"created_at":"2024-08-03T12:00:56.086Z","updated_at":"2025-10-03T19:30:32.195Z","avatar_url":"https://github.com/princemaple.png","language":"Elixir","funding_links":[],"categories":["Third Party APIs"],"sub_categories":[],"readme":"# Extripe\n\n[![Hex.pm](https://img.shields.io/hexpm/v/extripe.svg)](https://hex.pm/packages/extripe)\n[![Documentation](https://img.shields.io/badge/docs-hexpm-blue.svg)](https://hexdocs.pm/extripe/Extripe.html)\n\nStripe API wrapper in Elixir [Read Documentation](http://hexdocs.pm/extripe/)\n\n## Installation\n\nAdd extripe to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n  [{:extripe, \"~\u003e 1.0\"}]\nend\n```\n\n## Usage\n\n- Use with env var `stripe_secret_key`\n\n  ```elixir\n  stripe_secret_key=sk_test_abcdefg12345678 iex -S mix\n  ```\n\n- Or config it\n\n  ```elixir\n  config :extripe,\n    stripe_secret_key: \"sk_test_abcdefg12345678\"\n  ```\n\n### Features\n\n#### Simple CRUD\n\nUsing `Plan`, `Customer` and `Subscirption` in the following examples, all entities should be supported, if you find anything that is not supported or new endpoints coming out from stripe, don't hesitate to [file an issue](https://github.com/princemaple/extripe/issues/new)\n\n```elixir\niex(1)\u003e Extripe.Plan.index\n{:ok,\n %{\"data\" =\u003e [%{\"amount\" =\u003e 1500, \"created\" =\u003e 1455733031, \"currency\" =\u003e \"gbp\",\n      \"id\" =\u003e \"regular_gb\", \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1,\n      \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"name\" =\u003e \"Regular GB\",\n      \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n      \"trial_period_days\" =\u003e nil},\n    %{\"amount\" =\u003e 1000, \"created\" =\u003e 1455632453, \"currency\" =\u003e \"aud\",\n      \"id\" =\u003e \"regular_au\", \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1,\n      \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"name\" =\u003e \"Regular AU\",\n      \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n      \"trial_period_days\" =\u003e 15},\n    %{\"amount\" =\u003e 1000, \"created\" =\u003e 1455593353, \"currency\" =\u003e \"usd\",\n      \"id\" =\u003e \"regular\", \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1,\n      \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"name\" =\u003e \"REGULAR\",\n      \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n      \"trial_period_days\" =\u003e 15}], \"has_more\" =\u003e false, \"object\" =\u003e \"list\",\n   \"url\" =\u003e \"/v1/plans\"}}\n\niex(2)\u003e Extripe.Plan.show \"regular\"\n{:ok,\n %{\"amount\" =\u003e 1000, \"created\" =\u003e 1455593353, \"currency\" =\u003e \"usd\",\n   \"id\" =\u003e \"regular\", \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1,\n   \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"name\" =\u003e \"REGULAR\",\n   \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n   \"trial_period_days\" =\u003e 15}}\n\niex(3)\u003e Extripe.Plan.create %{id: \"test\", name: \"My Test Plan\", amount: 1999, interval: \"month\", currency: \"usd\"}\n{:ok,\n %{\"amount\" =\u003e 1999, \"created\" =\u003e 1455736111,\n   \"currency\" =\u003e \"usd\", \"id\" =\u003e \"test\", \"interval\" =\u003e \"month\",\n   \"interval_count\" =\u003e 1, \"livemode\" =\u003e false, \"metadata\" =\u003e %{},\n   \"name\" =\u003e \"My Test Plan\", \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n   \"trial_period_days\" =\u003e nil}}\n\n# or Extripe.Plan.update \"test_id\", %{name: \"MY TTTTEST PLAN\"}\niex(4)\u003e Extripe.Plan.update %{id: \"test_id\", name: \"MY TTTTEST PLAN\"}\n{:ok,\n %{\"amount\" =\u003e 1999, \"created\" =\u003e 1455736111,\n   \"currency\" =\u003e \"usd\", \"id\" =\u003e \"test\", \"interval\" =\u003e \"month\",\n   \"interval_count\" =\u003e 1, \"livemode\" =\u003e false, \"metadata\" =\u003e %{},\n   \"name\" =\u003e \"MY TTTTEST PLAN\", \"object\" =\u003e \"plan\",\n   \"statement_descriptor\" =\u003e nil, \"trial_period_days\" =\u003e nil}}\n\niex(5)\u003e Extripe.Plan.delete \"test\"\n{:ok, %{\"deleted\" =\u003e true, \"id\" =\u003e \"test\"}}\n```\n\n#### Response\n\nAll actions return either `{:ok, body :: map}` or `{:error, reason :: binary}`\n\n#### Nested resources\n\n```elixir\n# find a customer first\niex(1)\u003e Extripe.Customer.index\n{:ok,\n %{\"data\" =\u003e [%{\"account_balance\" =\u003e 0, \"created\" =\u003e 1455721994,\n      \"currency\" =\u003e \"usd\", \"default_source\" =\u003e nil, \"delinquent\" =\u003e false,\n      \"description\" =\u003e \"test self\", \"discount\" =\u003e nil,\n      \"email\" =\u003e \"chenpaul914@hotmail.com\", \"id\" =\u003e \"cus_7vNk0duWVulcPe\",\n      \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"object\" =\u003e \"customer\",\n      \"shipping\" =\u003e nil,\n      \"sources\" =\u003e %{\"data\" =\u003e [], \"has_more\" =\u003e false, \"object\" =\u003e \"list\",\n        \"total_count\" =\u003e 0,\n        \"url\" =\u003e \"/v1/customers/cus_7vNk0duWVulcPe/sources\"},\n      \"subscriptions\" =\u003e %{\"data\" =\u003e [], \"has_more\" =\u003e false,\n        \"object\" =\u003e \"list\", \"total_count\" =\u003e 0,\n        \"url\" =\u003e \"/v1/customers/cus_7vNk0duWVulcPe/subscriptions\"}}],\n   \"has_more\" =\u003e false, \"object\" =\u003e \"list\", \"url\" =\u003e \"/v1/customers\"}}\n\n# find the subscriptions that belong to the customer\niex(2)\u003e Extripe.Subscription.index customer: \"cus_7vNk0duWVulcPe\"\n{:ok,\n %{\"data\" =\u003e [], \"has_more\" =\u003e false,\n    \"object\" =\u003e \"list\",\n    \"url\" =\u003e \"/v1/customers/cus_7vNk0duWVulcPe/subscriptions\"}}\n\n# manipulations...\niex(3)\u003e Extripe.Subscription.create customer: \"cus_7vNk0duWVulcPe\", %{plan: \"regular\"}\n{:ok,\n %{\"application_fee_percent\" =\u003e nil,\n   \"cancel_at_period_end\" =\u003e false, \"canceled_at\" =\u003e nil,\n   \"current_period_end\" =\u003e 1457032418, \"current_period_start\" =\u003e 1455736418,\n   \"customer\" =\u003e \"cus_7vNk0duWVulcPe\", \"discount\" =\u003e nil, \"ended_at\" =\u003e nil,\n   \"id\" =\u003e \"sub_7vRdUiQQhv3M7u\", \"metadata\" =\u003e %{}, \"object\" =\u003e \"subscription\",\n   \"plan\" =\u003e %{\"amount\" =\u003e 1000, \"created\" =\u003e 1455593353, \"currency\" =\u003e \"usd\",\n     \"id\" =\u003e \"regular\", \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1,\n     \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"name\" =\u003e \"REGULAR\",\n     \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n     \"trial_period_days\" =\u003e 15}, \"quantity\" =\u003e 1, \"start\" =\u003e 1455736418,\n   \"status\" =\u003e \"trialing\", \"tax_percent\" =\u003e nil, \"trial_end\" =\u003e 1457032418,\n   \"trial_start\" =\u003e 1455736418}}\n\niex(4)\u003e Extripe.Subscription.delete \"sub_7vRdUiQQhv3M7u\"\n{:ok,\n %{\"application_fee_percent\" =\u003e nil,\n   \"cancel_at_period_end\" =\u003e false, \"canceled_at\" =\u003e 1455736452,\n   \"current_period_end\" =\u003e 1457032418, \"current_period_start\" =\u003e 1455736418,\n   \"customer\" =\u003e \"cus_7vNk0duWVulcPe\", \"discount\" =\u003e nil,\n   \"ended_at\" =\u003e 1455736452, \"id\" =\u003e \"sub_7vRdUiQQhv3M7u\", \"metadata\" =\u003e %{},\n   \"object\" =\u003e \"subscription\",\n   \"plan\" =\u003e %{\"amount\" =\u003e 1000, \"created\" =\u003e 1455593353, \"currency\" =\u003e \"usd\",\n     \"id\" =\u003e \"regular\", \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1,\n     \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"name\" =\u003e \"REGULAR\",\n     \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n     \"trial_period_days\" =\u003e 15}, \"quantity\" =\u003e 1, \"start\" =\u003e 1455736418,\n   \"status\" =\u003e \"canceled\", \"tax_percent\" =\u003e nil, \"trial_end\" =\u003e 1457032418,\n   \"trial_start\" =\u003e 1455736418}}\n```\n\n#### Pagination\n\n```elixir\niex(1)\u003e Extripe.Plan.index starting_after: \"regular_au\"\n{:ok,\n %{\"data\" =\u003e [%{\"amount\" =\u003e 1000, \"created\" =\u003e 1455593353, \"currency\" =\u003e \"usd\",\n      \"id\" =\u003e \"regular\", \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1,\n      \"livemode\" =\u003e false, \"metadata\" =\u003e %{}, \"name\" =\u003e \"REGULAR\",\n      \"object\" =\u003e \"plan\", \"statement_descriptor\" =\u003e nil,\n      \"trial_period_days\" =\u003e 15}], \"has_more\" =\u003e false, \"object\" =\u003e \"list\",\n   \"url\" =\u003e \"/v1/plans\"}}\n\niex(2)\u003e Extripe.Plan.index ending_before: \"regular_au\"\n{:ok,\n %{\"data\" =\u003e [%{\"amount\" =\u003e 1500,\n      \"created\" =\u003e 1455733031, \"currency\" =\u003e \"gbp\", \"id\" =\u003e \"regular_gb\",\n      \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1, \"livemode\" =\u003e false,\n      \"metadata\" =\u003e %{}, \"name\" =\u003e \"Regular GB\", \"object\" =\u003e \"plan\",\n      \"statement_descriptor\" =\u003e nil, \"trial_period_days\" =\u003e nil}],\n   \"has_more\" =\u003e false, \"object\" =\u003e \"list\", \"url\" =\u003e \"/v1/plans\"}}\n\niex(3)\u003e Extripe.Plan.index limit: 1\n{:ok,\n %{\"data\" =\u003e [%{\"amount\" =\u003e 1500,\n      \"created\" =\u003e 1455733031, \"currency\" =\u003e \"gbp\", \"id\" =\u003e \"regular_gb\",\n      \"interval\" =\u003e \"month\", \"interval_count\" =\u003e 1, \"livemode\" =\u003e false,\n      \"metadata\" =\u003e %{}, \"name\" =\u003e \"Regular GB\", \"object\" =\u003e \"plan\",\n      \"statement_descriptor\" =\u003e nil, \"trial_period_days\" =\u003e nil}],\n   \"has_more\" =\u003e true, \"object\" =\u003e \"list\", \"url\" =\u003e \"/v1/plans\"}}\n\niex(4)\u003e {:ok, events} = Extripe.Event.index created: [lt: 1455733031]\n{:ok,\n %{\"data\" =\u003e [%{\"api_version\" =\u003e \"2016-02-03\", \"created\" =\u003e 1455732840,\n      \"data\" =\u003e %{\"object\" =\u003e %{\"amount\" =\u003e 1000, \"created\" =\u003e 1455593353,\n          \"currency\" =\u003e \"usd\", \"id\" =\u003e \"regular\", \"interval\" =\u003e \"month\",\n          \"interval_count\" =\u003e 1, \"livemode\" =\u003e false, \"metadata\" =\u003e %{},\n          \"name\" =\u003e \"REGULAR\", \"object\" =\u003e \"plan\",\n          \"statement_descriptor\" =\u003e nil, \"trial_period_days\" =\u003e 15},\n        \"previous_attributes\" =\u003e %{\"name\" =\u003e \"Regular\"}},\n      \"id\" =\u003e \"evt_17fZoKEhB5xMvgQ7Fdl7krpl\", \"livemode\" =\u003e false,\n      \"object\" =\u003e \"event\", \"pending_webhooks\" =\u003e 0,\n      \"request\" =\u003e \"req_7vQfTWcjfnH7JW\", \"type\" =\u003e \"plan.updated\"},\n    %{\"api_version\" =\u003e \"2016-02-03\", \"created\" =\u003e 1455732634,\n      \"data\" =\u003e %{\"object\" =\u003e %{\"amount\" =\u003e 1500, \"created\" =\u003e 1455730831,\n          \"currency\" =\u003e \"gbp\", \"id\" =\u003e \"regular_gb\", \"interval\" =\u003e \"month\",\n          \"interval_count\" =\u003e 1, \"livemode\" =\u003e false, \"metadata\" =\u003e %{},\n          \"name\" =\u003e \"REGULAR GB\", \"object\" =\u003e \"plan\",\n          \"statement_descriptor\" =\u003e nil, \"trial_period_days\" =\u003e nil}},\n      \"id\" =\u003e \"evt_17fZl0EhB5xMvgQ7Ekqu42UQ\", \"livemode\" =\u003e false,\n      \"object\" =\u003e \"event\", \"pending_webhooks\" =\u003e 0,\n      \"request\" =\u003e \"req_7vQc2AYrZYzkv3\", \"type\" =\u003e \"plan.deleted\"},\n    %{\"api_version\" =\u003e \"2016-02-03\", \"created\" =\u003e 1455732348,\n      \"data\" =\u003e %{\"object\" =\u003e %{\"application_fee_percent\" =\u003e nil,\n          \"cancel_at_period_end\" =\u003e false, \"canceled_at\" =\u003e 1455732348,\n          \"current_period_end\" =\u003e 1457027674,\n          \"current_period_start\" =\u003e 1455731674,\n          \"customer\" =\u003e \"cus_7vNk0duWVulcPe\", \"discount\" =\u003e nil,\n          \"ended_at\" =\u003e 1455732348, \"id\" =\u003e \"sub_7vQMcLg9Qvbuzn\",\n          \"metadata\" =\u003e %{}, \"object\" =\u003e \"subscription\",\n          \"plan\" =\u003e %{\"amount\" =\u003e 1000, \"created\" =\u003e 1455593353,\n            \"currency\" =\u003e \"usd\", \"id\" =\u003e \"regular\", \"interval\" =\u003e \"month\",\n            \"interval_count\" =\u003e 1, \"livemode\" =\u003e false, \"metadata\" =\u003e %{},\n            \"name\" =\u003e \"Regular\", \"object\" =\u003e \"plan\",\n            \"statement_descriptor\" =\u003e nil, \"trial_period_days\" =\u003e 15},\n          \"quantity\" =\u003e 1, \"start\" =\u003e 1455731674, \"status\" =\u003e \"canceled\",\n          \"tax_percent\" =\u003e nil, \"trial_end\" =\u003e 1457027674,\n          \"trial_start\" =\u003e 1455731674}}, \"id\" =\u003e \"evt_17fZgOEhB5xMvgQ750S7kXaH\",\n      \"livemode\" =\u003e false, \"object\" =\u003e \"event\", \"pending_webhooks\" =\u003e 0,\n      \"request\" =\u003e \"req_7vQXJ6d8hVgjA5\",\n      \"type\" =\u003e \"customer.subscription.deleted\"},\n    ...]}}\n\niex(5)\u003e {:ok, events} = Extripe.Event.index created: [gt: 1455733031]\n# similar to the previous one\n# and you also have gte, lte\n# or you could just specify an integer unix timestamp for :created instead of a map or a keyword list\n```\n\n## Contributing\n\n```elixir\n# Adding a new resource\ndefmodule Extripe.NewResource do\n  # normal resource\n  # note: new_resource is probably plural\n  use Extripe.Actions.CRUD, resource: \"new_resource\"\n\n  # not fully CRUDable resource\n  use Extripe.Actions.CRUD, only: [:index, :show], resource: \"new_resource\"\n  # or\n  use Extripe.Actions.CRUD, except: [:delete], resource: \"new_resource\"\n\n  # nested resource\n  # when the scoping resource is plural, e.g. /v1/customers/customer_id/subscriptions\n  use Extripe.Actions.CRUD, scope: \"customers\", resource: \"subscriptions\"\n  # when the scoping resource is singular, e.g. /v1/balance/history\n  use Extripe.Actions.CRUD, scope: {\"balance\", :singular}, resource: \"history\"\n\n  # singluar resource\n  # currently only Balance is of this kind, /v1/balance\n  use Extripe.Actions.CRUD, only: [:show], resource: \"balance\", singular: true\n\n  # special case implementations\n  def pay(id), do: # pay bill\n\n  # special CRUD implementations\n  def list do\n    # special implementation of list\n  end\nend\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprincemaple%2Fextripe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprincemaple%2Fextripe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprincemaple%2Fextripe/lists"}