{"action":"created","comment":{"url":"https://api.github.com/repos/interledger/rfcs/pulls/comments/128569075","pull_request_review_id":51262114,"id":128569075,"diff_hunk":"@@ -0,0 +1,1290 @@\n+# Five Bells Ledger API\n+\n+The Five Bells Ledger API is a RESTful API served by a ledger (or an adapter), which provides functionality necessary for ILP compatibility. The Five Bells Ledger API provides a single standard API that a ledger can serve in order to ease integration with other Interledger Protocol components and applications, such as the reference ILP Client and ILP Connector. This is not the only way a ledger can become ILP-enabled, but it provides a template that minimizes the integration work necessary for compatibility with ILP software.\n+\n+## Overview\n+\n+The Five Bells Ledger API defines the following data types and structures:\n+\n+- [Transfer resource][]\n+- [Account resource][]\n+- [Message resource][]\n+- [Crypto-Condition][] and [Crypto-Condition Fulfillment][]\n+- [Error Codes](#api-error-codes)\n+\n+The core operations of the API are:\n+\n+- [Get Ledger Metadata][]\n+- [Prepare Transfer][]\n+    - If the transfer is unconditional, it executes immediately.\n+    - If the transfer is conditional, it waits for a matching fulfillment.\n+- [Submit Fulfillment][]\n+    - Executes a conditional transfer, if the fulfillment matches the condition.\n+- [Reject Transfer][]\n+- [Get Transfer][] and check its status\n+- [Get Transfer Fulfillment][]\n+- [Get Account][] info including balance\n+- [Create or Update Account][]\n+- [Send Message][] to another account\n+- [Get Auth Token][] for [Authorization and Authentication](#authorization-and-authentication)\n+- [Websocket][] sub-API for subscribing to transfers and accounts\n+\n+The ledger MAY support additional methods, including but not limited to:\n+\n+- Health check status\n+- Look up transfers by account or by [Crypto-Condition][]\n+\n+\n+## Conventions\n+\n+The API is designed to be [RESTful](https://en.wikipedia.org/wiki/Representational_state_transfer), extensible, and modular. By design, every resource type contains links to other methods, so you can \"naturally\" discover other API paths by starting from any object. Clients SHOULD NOT hardcode any [URL][] other than the path to the [Get Ledger Metadata][] method. A ledger MAY host different objects and API methods at different hostnames or base URLs, as long as all client applications can dereference the URLs in the usual way.\n+\n+\n+### JSON\n+\n+All methods communicate both ways using [JavaScript Object Notation (JSON)](http://www.json.org/) unless otherwise specified. A ledger MUST use the `Content-Type: application/json` header in responses to indicate that the message body contains JSON. A ledger MAY honor the `Accept` header of the request and return the data in other formats if the client requests them. A ledger MAY interpret the message bodies of requests (PUT and POST methods) as JSON, even if the `Content-Type` header is missing or indicates a different format. The Five Bells Ledger API uses HTTP status codes to indicate the status of API operations; if the ledger encounters an error processing a request, it MUST NOT return an HTTP status code in the 200-299 range even if communication was successful.\n+\n+Field names in the JSON objects defined by this API never contain literal period (`.`) characters. By convention, this documentation uses the `.` character to indicate fields nested inside other Object-type fields. In some cases, field values contain literal period (`.`) characters. Additionally, this field contains some objects that can hold arbitrary data. Arbitrary-data objects can contain any legal JSON, including field names with literal period (`.`) characters. Arbitrary-data objects SHOULD NOT contain duplicate keys.\n+\n+\n+### Amounts\n+[amount]: #amounts\n+[Amounts]: #amounts\n+\n+The Five Bells Ledger API represents numeric currency amounts as strings rather than native JSON numbers. This is because many standard libraries automatically decode numbers to a [IEEE 754 double precision floating point](https://en.wikipedia.org/wiki/IEEE_floating_point) representation. Using IEEE 754 double floats can introduce a loss of precision and rounding errors that are unacceptable for financial services, depending on the range and use cases needed. (In particular, digital assets that are natively represented as 64-bit unsigned integers do not fit properly into IEEE 754 double precision floats.) Amounts in the Five Bells Ledger API MUST match the following regular expression:\n+\n+`^[-+]?[0-9]*[.]?[0-9]+([eE][-+]?[0-9]+)?$`\n+\n+Client applications can decode numeric strings to whatever representation provides sufficient precision for their specific needs. The ledger MUST report information about the precision it uses in the [Get Ledger Metadata][] response.\n+\n+\n+### Assets and Currency\n+\n+The Five Bells Ledger API provides access to a ledger containing a single currency or asset. The [Get Ledger Metadata][] method reports the type of asset or currency used.\n+\n+If a provider supports multiple currencies or assets, the provider can serve Five Bells Ledger APIs separately for each such asset by serving it from a different prefix. For example, the [Prepare Transfer][] method could be available at all the following locations:\n+\n+- `POST https://ledger.example.com/TZS/transfers`\n+- `POST https://ledger.example.com/KES/transfers`\n+- `POST https://ledger.example.com/stocks/MSFT/transfers`\n+\n+Any valid URL is a suitable prefix. However, only the same asset served by the same underlying ledger can be directly transferred.\n+\n+These instances could be served by the same underlying software and share infrastructure, but it would not be possible to transfer directly from one to the other, since the currency denominations are different. An **ILP Connector** could facilitate cross-currency payments.\n+\n+#### Adding Money to the Ledger\n+\n+There are several ways to \"add\" money to the ledger. A ledger MAY use any or all of the following:\n+\n+- When an account is created or updated by an administrator with the [Create or Update Account][] method, the administrator MAY set the balance of the account to any legal value.\n+- A ledger may be initialized in a state where its database contains accounts with positive balances.\n+- An administrator MAY create an \"issuer\" account whose balance can be negative. To give a positive balance to an account, execute a transfer from the issuer account. If you use this technique exclusively, the issuer account's total balance is equal to the negative of all balances in the ledger summed together.\n+\n+\n+### Scope\n+\n+The Five Bells Ledger API defines one way to implement sufficient functionality to operate a ledger. It is not intended to be an optimal or ideal ledger, especially since such a thing is subjective or at least hard to quantify. (Indeed, Interledger itself was conceived from the conclusion that no one ledger can serve the needs of every person in existence.) In general, this specification reflects to the existing [Five Bells Ledger reference implementation](https://github.com/interledgerjs/five-bells-ledger) so that others may implement compatible software.\n+\n+\n+### Authorization and Authentication\n+\n+The ledger MUST authenticate API clients. HTTP(S) methods MUST use one of the following systems for authentication:\n+\n+- [HTTP Basic Auth](https://tools.ietf.org/html/rfc2617#section-2)\n+- [TLS Client Certificates](https://tools.ietf.org/html/rfc5246#section-7.4.6)\n+\n+Additionally, the ledger MUST authenticate [WebSocket][] connections with token-based authentication. See also: [Get Auth Token][].\n+\n+The ledger MUST support authenticating a client in one of the following roles:\n+\n+- Administrator - Full control over all ledger operations.\n+- Account owner (for a specific account) - Can perform operations relating to one specific account, such as authorizing debits from or credits to the account, and viewing the account balance.\n+- Unauthorized. Read-only access to some global ledger data. A ledger MUST NOT allow an unauthorized user to make a change that modifies accounts or transfers in any way.\n+\n+A ledger MAY define additional authorization levels, especially for functions that extend this API.\n+\n+\n+## Data Types\n+\n+### Transfer Resource\n+[Transfer resource]: #transfer-resource\n+\n+A transfer represents money being moved around _within a single ledger_. A transfer debits one or more accounts and credits one or more accounts, such that the sum of all credits equals the sum of all debits. A transfer can be conditional upon a supplied [Crypto-Condition][], in which case it executes automatically when presented with the fulfillment for the condition. (Assuming the transfer has not expired or been rejected first.) If no Crypto-Condition is specified, the transfer is unconditional, and executes as soon as it is prepared.\n+\n+\n+A transfer object contains the fields from the following table. Some fields are _Ledger-provided_, meaning they cannot be set directly by clients. Fields that are \"Optional\" or \"Ledger-provided\" in the following table may be omitted by clients submitting transfer objects to the API, but **those fields are not optional to implement**. All fields, including the `memo` fields, must be implemented for the Five Bells Ledger API to work properly. Fields of nested objects are indicated with a dot (`.`) character; no field names contain a dot literal.\n+\n+| Name                   | Type                 | Description                  |\n+|:-----------------------|:---------------------|:-----------------------------|\n+| `id`                   | [UUID][]             | Client-provided UUID for this resource. MUST be unique within the ledger. The path to the [Get Transfer][] method includes this identifier. See [Transfer IDs][] for more information. |\n+| `credits`              | Array of Objects     | Array of objects defining which accounts receive how much in this transfer. A ledger MAY restrict this to length 1. |\n+| `debits`               | Array of Objects     | Array of objects defining which accounts send how much in this transfer. A ledger MAY restrict this to length 1. |\n+| `cancellation_condition` | [Crypto-Condition][] | _(Optional)_ The condition for canceling the transfer. This field is OPTIONAL to implement. (It is no longer used by other ILP reference implementations.) MUST NOT be present unless the transfer has an `execution_condition`.  |\n+| `execution_condition`  | [Crypto-Condition][] | _(Optional)_ The condition for executing the transfer. If omitted, the transfer executes unconditionally. |\n+| `expires_at`           | [Date-Time][]        | _(Optional)_ The date when the transfer expires and can no longer be executed. |\n+| `additional_info`      | Object               | _(Optional)_ Arbitrary fields attached to this transfer. (For example, the IDs of related transfers in other systems.) |\n+| `fulfillment`          | [URL][]              | _(Ledger-provided)_ Path to the fulfillment for this transfer. MUST be an HTTP(S) URL where the client can [submit the fulfillment][Submit Fulfillment] or [get the fulfillment][Get Transfer Fulfillment]. MUST be provided if and only if this transfer has an `execution_condition`. |\n+| `ledger`               | [URL][]              | _(Ledger-provided)_ Resource identifier for the ledger where the transfer occurs. MUST be an HTTP(S) URL where you can [get the ledger metadata][Get Ledger Metadata]. |\n+| `rejection_reason`     | String               | _(Ledger-provided)_ The reason the transfer was rejected. MUST appear if and only if `state` is `rejected`. |\n+| `state`                | String               | _(Ledger-provided)_ The current state of the transfer. Valid states are `proposed`, `prepared`, `executed`, and `rejected`. See [Transfer States][] for more information. |\n+| `timeline`             | Object               | _(Ledger-provided)_ Timeline of the transfer's state transitions. |\n+| `timeline.executed_at` | [Date-Time][]        | _(Ledger-provided)_ Time when the transfer was originally executed. MUST appear if and only if `state` is `executed`. This time MUST be equal to or later than the `prepared_at` time. |\n+| `timeline.prepared_at` | [Date-Time][]        | _(Ledger-provided)_ Time when the transfer was originally prepared. MUST appear, even if the transaction is unconditional. |\n+| `timeline.rejected_at` | [Date-Time][]        | _(Ledger-provided)_ Time when the transfer was originally rejected. MUST appear if and only if `state` is `rejected`. This time MUST be equal to or later than the `prepared_at` time. |\n+\n+[UUID]: http://en.wikipedia.org/wiki/Universally_unique_identifier\n+\n+The `credits` and `debits` fields contain objects defining how much to debit or credit to a particular account. The format for the objects in both arrays is as follows:\n+\n+| Field        | Type    | Description                                         |\n+|:-------------|:--------|:----------------------------------------------------|\n+| `account`    | [URL][] | An identifier for the account to credit or debit. This MUST be an HTTP(S) URL where the client can call the [Get Account][] method. |\n+| `amount`     | String  | Positive decimal amount of money to debit from or credit to this account. See [Amounts][] for formatting rules. |\n+| `memo`       | Object  | _(Optional)_ Arbitrary object with additional information about this credit or debit.  |\n+| `authorized` | Boolean | _(Optional, debit objects only)_ Whether this account has authorized this transfer. The ledger MUST NOT allow a request to set this value to `true` unless the client is authenticated as an Administrator or as the owner of this account. |\n+\n+**Note:** Ledgers MUST implement the `memo` field. ILP clients use this field to store the ILP Packet object. Specifically, the reference ILP Client puts the ILP Packet as a base64url-encoded string in the the `ilp` field of the `memo` of the credit to the Connector.\n+\n+\n+#### Transfer IDs\n+[Transfer IDs]: #transfer-ids\n+\n+The transfer's `id` field is one of the main ways of identifying the transfer; it is unique across the ledger, so implementations MAY use it as a primary unique key in a database. The client applications, not the ledger, generate the `id`, so the ledger SHOULD require that the field match the canonical form for a [UUID][], which is 32 lowercase hexadecimal digits, separated by hyphens into groups of 8-4-4-4-12.\n+\n+If a client attempts to create a transfer with an `id` that already exists, the attempt MUST fail. (This protects clients from accidentally submitting the same transfer twice or more.)\n+\n+Depending on what algorithm clients use to generate UUIDs, it may be possible for other account owners to guess in advance which UUIDs might be used, and could preemptively claim `id` values that other account owners might use. A ledger MAY discourage this \"squatting\" behavior by imposing a limit on how many new transfers an account can generate within a fixed period of time, or with other similar limits. (A ledger could also address this issue in other ways, such as charging a fee for preparing transfers.) Client applications SHOULD use a sufficiently hard-to-predict system for generating UUIDs, such as the random algorithm described in [RFC4122](https://www.ietf.org/rfc/rfc4122). Client applications SHOULD NOT use the same ID to indicate related transfers in multiple ledgers: such behavior can be easily exploited by third parties who claim an ID in a ledger as soon as it gets used in a different ledger.\n+\n+#### Transfer States\n+[Transfer States]: #transfer-states\n+\n+The following state diagram shows the possible transitions between a transfer's `state` values:\n+\n+[![Transfer state diagram](5BL-transfer-states.png)](5BL-transfer-states.png)\n+\n+The [Prepare Transfer][] method creates a new transfer. Unless creator of the transfer is the only account to be debited and the account sets the `authorized` field of the debit to `true`, the transfer is created in the `proposed` state.","path":"0012-five-bells-ledger-api/0012-five-bells-ledger-api.md","position":165,"original_position":165,"commit_id":"86d04dddab9e9c9a5a4831c9ba6c0d0c9e088c89","original_commit_id":"86d04dddab9e9c9a5a4831c9ba6c0d0c9e088c89","user":{"login":"dappelt","id":23212287,"avatar_url":"https://avatars1.githubusercontent.com/u/23212287?v=4","gravatar_id":"","url":"https://api.github.com/users/dappelt","html_url":"https://github.com/dappelt","followers_url":"https://api.github.com/users/dappelt/followers","following_url":"https://api.github.com/users/dappelt/following{/other_user}","gists_url":"https://api.github.com/users/dappelt/gists{/gist_id}","starred_url":"https://api.github.com/users/dappelt/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dappelt/subscriptions","organizations_url":"https://api.github.com/users/dappelt/orgs","repos_url":"https://api.github.com/users/dappelt/repos","events_url":"https://api.github.com/users/dappelt/events{/privacy}","received_events_url":"https://api.github.com/users/dappelt/received_events","type":"User","site_admin":false},"body":"In order to make FB-ledger resilient against DoS attacks, we should try to avoid that unauthenticated requests result in database operations.","created_at":"2017-07-20T16:44:14Z","updated_at":"2017-07-20T16:44:14Z","html_url":"https://github.com/interledger/rfcs/pull/237#discussion_r128569075","pull_request_url":"https://api.github.com/repos/interledger/rfcs/pulls/237","_links":{"self":{"href":"https://api.github.com/repos/interledger/rfcs/pulls/comments/128569075"},"html":{"href":"https://github.com/interledger/rfcs/pull/237#discussion_r128569075"},"pull_request":{"href":"https://api.github.com/repos/interledger/rfcs/pulls/237"}}},"pull_request":{"url":"https://api.github.com/repos/interledger/rfcs/pulls/237","id":129794366,"html_url":"https://github.com/interledger/rfcs/pull/237","diff_url":"https://github.com/interledger/rfcs/pull/237.diff","patch_url":"https://github.com/interledger/rfcs/pull/237.patch","issue_url":"https://api.github.com/repos/interledger/rfcs/issues/237","number":237,"state":"open","locked":false,"title":"Five Bells Ledger API","user":{"login":"mDuo13","id":7515597,"avatar_url":"https://avatars0.githubusercontent.com/u/7515597?v=4","gravatar_id":"","url":"https://api.github.com/users/mDuo13","html_url":"https://github.com/mDuo13","followers_url":"https://api.github.com/users/mDuo13/followers","following_url":"https://api.github.com/users/mDuo13/following{/other_user}","gists_url":"https://api.github.com/users/mDuo13/gists{/gist_id}","starred_url":"https://api.github.com/users/mDuo13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mDuo13/subscriptions","organizations_url":"https://api.github.com/users/mDuo13/orgs","repos_url":"https://api.github.com/users/mDuo13/repos","events_url":"https://api.github.com/users/mDuo13/events{/privacy}","received_events_url":"https://api.github.com/users/mDuo13/received_events","type":"User","site_admin":false},"body":"Replaces PR #125 and PR #90. In keeping with our current thinking, an updated \"Common Ledger API\" (with all our desired cosmetic / \"nice-to-have\" changes) may not be needed in the long run, but a formalization of the Five Bells Ledger API currently in use is helpful for those who want to build ledger interfaces that are compatible with [the existing ledger plugin](https://github.com/interledgerjs/ilp-plugin-bells).","created_at":"2017-07-10T23:24:07Z","updated_at":"2017-07-20T16:44:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"9e18e798c39152480b8bc598c7eee95a847247c3","assignee":null,"assignees":[],"requested_reviewers":[{"login":"adrianhopebailie","id":49902,"avatar_url":"https://avatars2.githubusercontent.com/u/49902?v=4","gravatar_id":"","url":"https://api.github.com/users/adrianhopebailie","html_url":"https://github.com/adrianhopebailie","followers_url":"https://api.github.com/users/adrianhopebailie/followers","following_url":"https://api.github.com/users/adrianhopebailie/following{/other_user}","gists_url":"https://api.github.com/users/adrianhopebailie/gists{/gist_id}","starred_url":"https://api.github.com/users/adrianhopebailie/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/adrianhopebailie/subscriptions","organizations_url":"https://api.github.com/users/adrianhopebailie/orgs","repos_url":"https://api.github.com/users/adrianhopebailie/repos","events_url":"https://api.github.com/users/adrianhopebailie/events{/privacy}","received_events_url":"https://api.github.com/users/adrianhopebailie/received_events","type":"User","site_admin":false},{"login":"sappenin","id":323659,"avatar_url":"https://avatars1.githubusercontent.com/u/323659?v=4","gravatar_id":"","url":"https://api.github.com/users/sappenin","html_url":"https://github.com/sappenin","followers_url":"https://api.github.com/users/sappenin/followers","following_url":"https://api.github.com/users/sappenin/following{/other_user}","gists_url":"https://api.github.com/users/sappenin/gists{/gist_id}","starred_url":"https://api.github.com/users/sappenin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sappenin/subscriptions","organizations_url":"https://api.github.com/users/sappenin/orgs","repos_url":"https://api.github.com/users/sappenin/repos","events_url":"https://api.github.com/users/sappenin/events{/privacy}","received_events_url":"https://api.github.com/users/sappenin/received_events","type":"User","site_admin":false},{"login":"sentientwaffle","id":461112,"avatar_url":"https://avatars0.githubusercontent.com/u/461112?v=4","gravatar_id":"","url":"https://api.github.com/users/sentientwaffle","html_url":"https://github.com/sentientwaffle","followers_url":"https://api.github.com/users/sentientwaffle/followers","following_url":"https://api.github.com/users/sentientwaffle/following{/other_user}","gists_url":"https://api.github.com/users/sentientwaffle/gists{/gist_id}","starred_url":"https://api.github.com/users/sentientwaffle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sentientwaffle/subscriptions","organizations_url":"https://api.github.com/users/sentientwaffle/orgs","repos_url":"https://api.github.com/users/sentientwaffle/repos","events_url":"https://api.github.com/users/sentientwaffle/events{/privacy}","received_events_url":"https://api.github.com/users/sentientwaffle/received_events","type":"User","site_admin":false},{"login":"sharafian","id":3362563,"avatar_url":"https://avatars0.githubusercontent.com/u/3362563?v=4","gravatar_id":"","url":"https://api.github.com/users/sharafian","html_url":"https://github.com/sharafian","followers_url":"https://api.github.com/users/sharafian/followers","following_url":"https://api.github.com/users/sharafian/following{/other_user}","gists_url":"https://api.github.com/users/sharafian/gists{/gist_id}","starred_url":"https://api.github.com/users/sharafian/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sharafian/subscriptions","organizations_url":"https://api.github.com/users/sharafian/orgs","repos_url":"https://api.github.com/users/sharafian/repos","events_url":"https://api.github.com/users/sharafian/events{/privacy}","received_events_url":"https://api.github.com/users/sharafian/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/interledger/rfcs/pulls/237/commits","review_comments_url":"https://api.github.com/repos/interledger/rfcs/pulls/237/comments","review_comment_url":"https://api.github.com/repos/interledger/rfcs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/interledger/rfcs/issues/237/comments","statuses_url":"https://api.github.com/repos/interledger/rfcs/statuses/86d04dddab9e9c9a5a4831c9ba6c0d0c9e088c89","head":{"label":"mDuo13:five_bells_ledger_api","ref":"five_bells_ledger_api","sha":"86d04dddab9e9c9a5a4831c9ba6c0d0c9e088c89","user":{"login":"mDuo13","id":7515597,"avatar_url":"https://avatars0.githubusercontent.com/u/7515597?v=4","gravatar_id":"","url":"https://api.github.com/users/mDuo13","html_url":"https://github.com/mDuo13","followers_url":"https://api.github.com/users/mDuo13/followers","following_url":"https://api.github.com/users/mDuo13/following{/other_user}","gists_url":"https://api.github.com/users/mDuo13/gists{/gist_id}","starred_url":"https://api.github.com/users/mDuo13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mDuo13/subscriptions","organizations_url":"https://api.github.com/users/mDuo13/orgs","repos_url":"https://api.github.com/users/mDuo13/repos","events_url":"https://api.github.com/users/mDuo13/events{/privacy}","received_events_url":"https://api.github.com/users/mDuo13/received_events","type":"User","site_admin":false},"repo":{"id":62777063,"name":"rfcs","full_name":"mDuo13/rfcs","owner":{"login":"mDuo13","id":7515597,"avatar_url":"https://avatars0.githubusercontent.com/u/7515597?v=4","gravatar_id":"","url":"https://api.github.com/users/mDuo13","html_url":"https://github.com/mDuo13","followers_url":"https://api.github.com/users/mDuo13/followers","following_url":"https://api.github.com/users/mDuo13/following{/other_user}","gists_url":"https://api.github.com/users/mDuo13/gists{/gist_id}","starred_url":"https://api.github.com/users/mDuo13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mDuo13/subscriptions","organizations_url":"https://api.github.com/users/mDuo13/orgs","repos_url":"https://api.github.com/users/mDuo13/repos","events_url":"https://api.github.com/users/mDuo13/events{/privacy}","received_events_url":"https://api.github.com/users/mDuo13/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mDuo13/rfcs","description":"A set of draft specifications for enabling interledger payments","fork":true,"url":"https://api.github.com/repos/mDuo13/rfcs","forks_url":"https://api.github.com/repos/mDuo13/rfcs/forks","keys_url":"https://api.github.com/repos/mDuo13/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mDuo13/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mDuo13/rfcs/teams","hooks_url":"https://api.github.com/repos/mDuo13/rfcs/hooks","issue_events_url":"https://api.github.com/repos/mDuo13/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/mDuo13/rfcs/events","assignees_url":"https://api.github.com/repos/mDuo13/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/mDuo13/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/mDuo13/rfcs/tags","blobs_url":"https://api.github.com/repos/mDuo13/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mDuo13/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mDuo13/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/mDuo13/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mDuo13/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/mDuo13/rfcs/languages","stargazers_url":"https://api.github.com/repos/mDuo13/rfcs/stargazers","contributors_url":"https://api.github.com/repos/mDuo13/rfcs/contributors","subscribers_url":"https://api.github.com/repos/mDuo13/rfcs/subscribers","subscription_url":"https://api.github.com/repos/mDuo13/rfcs/subscription","commits_url":"https://api.github.com/repos/mDuo13/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/mDuo13/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/mDuo13/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/mDuo13/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/mDuo13/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/mDuo13/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mDuo13/rfcs/merges","archive_url":"https://api.github.com/repos/mDuo13/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mDuo13/rfcs/downloads","issues_url":"https://api.github.com/repos/mDuo13/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/mDuo13/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/mDuo13/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/mDuo13/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mDuo13/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/mDuo13/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/mDuo13/rfcs/deployments","created_at":"2016-07-07T05:18:18Z","updated_at":"2016-07-07T05:18:19Z","pushed_at":"2017-07-10T23:19:21Z","git_url":"git://github.com/mDuo13/rfcs.git","ssh_url":"git@github.com:mDuo13/rfcs.git","clone_url":"https://github.com/mDuo13/rfcs.git","svn_url":"https://github.com/mDuo13/rfcs","homepage":null,"size":804,"stargazers_count":0,"watchers_count":0,"language":"HTML","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"interledger:master","ref":"master","sha":"71da2c3c4e6354ebfc4fb31f3d74c531875f5b1b","user":{"login":"interledger","id":14062960,"avatar_url":"https://avatars0.githubusercontent.com/u/14062960?v=4","gravatar_id":"","url":"https://api.github.com/users/interledger","html_url":"https://github.com/interledger","followers_url":"https://api.github.com/users/interledger/followers","following_url":"https://api.github.com/users/interledger/following{/other_user}","gists_url":"https://api.github.com/users/interledger/gists{/gist_id}","starred_url":"https://api.github.com/users/interledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/interledger/subscriptions","organizations_url":"https://api.github.com/users/interledger/orgs","repos_url":"https://api.github.com/users/interledger/repos","events_url":"https://api.github.com/users/interledger/events{/privacy}","received_events_url":"https://api.github.com/users/interledger/received_events","type":"Organization","site_admin":false},"repo":{"id":41705345,"name":"rfcs","full_name":"interledger/rfcs","owner":{"login":"interledger","id":14062960,"avatar_url":"https://avatars0.githubusercontent.com/u/14062960?v=4","gravatar_id":"","url":"https://api.github.com/users/interledger","html_url":"https://github.com/interledger","followers_url":"https://api.github.com/users/interledger/followers","following_url":"https://api.github.com/users/interledger/following{/other_user}","gists_url":"https://api.github.com/users/interledger/gists{/gist_id}","starred_url":"https://api.github.com/users/interledger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/interledger/subscriptions","organizations_url":"https://api.github.com/users/interledger/orgs","repos_url":"https://api.github.com/users/interledger/repos","events_url":"https://api.github.com/users/interledger/events{/privacy}","received_events_url":"https://api.github.com/users/interledger/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/interledger/rfcs","description":"A set of draft specifications for enabling interledger payments","fork":false,"url":"https://api.github.com/repos/interledger/rfcs","forks_url":"https://api.github.com/repos/interledger/rfcs/forks","keys_url":"https://api.github.com/repos/interledger/rfcs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/interledger/rfcs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/interledger/rfcs/teams","hooks_url":"https://api.github.com/repos/interledger/rfcs/hooks","issue_events_url":"https://api.github.com/repos/interledger/rfcs/issues/events{/number}","events_url":"https://api.github.com/repos/interledger/rfcs/events","assignees_url":"https://api.github.com/repos/interledger/rfcs/assignees{/user}","branches_url":"https://api.github.com/repos/interledger/rfcs/branches{/branch}","tags_url":"https://api.github.com/repos/interledger/rfcs/tags","blobs_url":"https://api.github.com/repos/interledger/rfcs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/interledger/rfcs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/interledger/rfcs/git/refs{/sha}","trees_url":"https://api.github.com/repos/interledger/rfcs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/interledger/rfcs/statuses/{sha}","languages_url":"https://api.github.com/repos/interledger/rfcs/languages","stargazers_url":"https://api.github.com/repos/interledger/rfcs/stargazers","contributors_url":"https://api.github.com/repos/interledger/rfcs/contributors","subscribers_url":"https://api.github.com/repos/interledger/rfcs/subscribers","subscription_url":"https://api.github.com/repos/interledger/rfcs/subscription","commits_url":"https://api.github.com/repos/interledger/rfcs/commits{/sha}","git_commits_url":"https://api.github.com/repos/interledger/rfcs/git/commits{/sha}","comments_url":"https://api.github.com/repos/interledger/rfcs/comments{/number}","issue_comment_url":"https://api.github.com/repos/interledger/rfcs/issues/comments{/number}","contents_url":"https://api.github.com/repos/interledger/rfcs/contents/{+path}","compare_url":"https://api.github.com/repos/interledger/rfcs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/interledger/rfcs/merges","archive_url":"https://api.github.com/repos/interledger/rfcs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/interledger/rfcs/downloads","issues_url":"https://api.github.com/repos/interledger/rfcs/issues{/number}","pulls_url":"https://api.github.com/repos/interledger/rfcs/pulls{/number}","milestones_url":"https://api.github.com/repos/interledger/rfcs/milestones{/number}","notifications_url":"https://api.github.com/repos/interledger/rfcs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/interledger/rfcs/labels{/name}","releases_url":"https://api.github.com/repos/interledger/rfcs/releases{/id}","deployments_url":"https://api.github.com/repos/interledger/rfcs/deployments","created_at":"2015-08-31T23:17:16Z","updated_at":"2017-07-18T16:13:45Z","pushed_at":"2017-07-20T15:17:07Z","git_url":"git://github.com/interledger/rfcs.git","ssh_url":"git@github.com:interledger/rfcs.git","clone_url":"https://github.com/interledger/rfcs.git","svn_url":"https://github.com/interledger/rfcs","homepage":null,"size":1395,"stargazers_count":65,"watchers_count":65,"language":"HTML","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":23,"mirror_url":null,"open_issues_count":44,"forks":23,"open_issues":44,"watchers":65,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/interledger/rfcs/pulls/237"},"html":{"href":"https://github.com/interledger/rfcs/pull/237"},"issue":{"href":"https://api.github.com/repos/interledger/rfcs/issues/237"},"comments":{"href":"https://api.github.com/repos/interledger/rfcs/issues/237/comments"},"review_comments":{"href":"https://api.github.com/repos/interledger/rfcs/pulls/237/comments"},"review_comment":{"href":"https://api.github.com/repos/interledger/rfcs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/interledger/rfcs/pulls/237/commits"},"statuses":{"href":"https://api.github.com/repos/interledger/rfcs/statuses/86d04dddab9e9c9a5a4831c9ba6c0d0c9e088c89"}}}}
{"actor":{"display_login":"dappelt"}}