funding.json

funding.json is an open manifest (JSON schema) that acts as a signaling and discovery mechanism for projects seeking funding. It is a self-contained manifest file that FOSS (Free and Open Source Software) projects, developers, and communities can host on their websites or repositories to describe their financial requirements in a structured, machine-readable manner. It acts like a robots.txt file or a progressive web app manifest, allowing it to be publicly crawled and indexed, to make projects in need of financial assistance discoverable.

See this example listing for a demonstration of how a manifest could be parsed and presented.

Schema

Current version is v1.0.0

{
    "version": "v1.0.0",

    // Required. The entity associated with the project, soliciting funds.
    // This can be an individual, organisation, community etc.
    "entity": {
        "type": "",                     // Required. [individual, group, organisation, other]. Use the closest approximation.
        "role": "",                     // Required. [owner, steward, maintainer, contributor, other]. Use the closest approximation.
        "name": "",                     // Required. Name of the entity. Max len 250.
        "email": "",                    // Required. Max len 250.
        "phone": "",                    // Optional. Generally suitable for organisations. Max len 32.
        "description": "",              // Required. Information about the entity. Max len 2000.
        "webpageUrl": {
            "url": "",                  // Required. Webpage with information about the entity. Starts with https:// or http://. Max len 250.
            "wellKnown": ""             // Optional. Required if the above url and the URL of the funding.json manifest do not have the same hostname. Starts with https:// or http://. Max len 250.
        }
    },

    // Optional. One or more projects for which the funding is solicited.
    "projects": [{
        "guid": "",                     // Required. A short unique ID for the project. Lowercase-alphanumeric-dashes only. eg: my-cool-project. Max len 32.
        "name": "",                     // Required. Name of the project. Max len 250.
        "description": "",              // Required. Description of the project. Max len 2000.
        "webpageUrl": {
            "url": "",                  // Required. Webpage with information about the project. Starts with https:// or http://. Max len 250.
            "wellKnown": ""             // Optional. Required if the above url and the URL of the funding.json manifest do not have the same hostname. Starts with https:// or http://. Max len 250.
        },
        "repositoryUrl": {
            "url": "",                  // Required. URL of the repository where the project's source code and other assets are available. Starts with https:// or http://. Max len 250.
            "wellKnown": ""             // Optional. Required if the above url and the URL of the funding.json manifest do not have the same hostname. Starts with https:// or http://. Max len 250.
        },
        "licenses": [],                 // Required. The project's licenses (up to 5). For standard licenses, use the license ID from the SDPX index prefixed by "spdx:". eg: "spdx:GPL-3.0", "spdx:CC-BY-SA-4.0"
        "tags": []                      // Required. Up to 10 general tags describing the project. Lowercase-alphanumeric-dashes (max 32 chars). eg: ["programming", "developer-tools"]. For reference, see tags.txt
    }],

    // Required.
    "funding": {
        // Required. This describes one or more channels via which the entity can receive funds.
        "channels": [{
            "guid": "",                 // Required. A short unique ID for the channel. Lowercase-alphanumeric-dashes only. eg: mybank, my-paypal. Max len 32.
            "type": "",                 // Required. [bank, payment-provider, cheque, cash, other].
            "address": "",              // Optional. A short unstructured textual representation of the payment address for the channel. eg: "Account: 12345 (branch: ABCX)", "[email protected]", "https://payment-url.com", or a physical address for cheques. Max len 250.
            "description": ""           // Optional. Any additional description or instructions for the payment channel. Max len 500.
        }],

        // Required. One or more funding and payment plans.
        "plans": [{
            "guid": "",                 // Required. A short unique ID for the plan. Lowercase-alphanumeric-dashes only. eg: mybank, paypal. Max len 32.
            "status": "",               // Required. [active, inactive]. Indicates whether this plan is currently active or inactive.
            "name": "",                 // Required. Name of the funding plan. eg: "Starter support plan", "Infra hosting", "Monthly funding plan".
            "description": "",          // Optional. Any additional description or instructions for the funding plan.
            "amount": 0,                // Required. The solicited amount for this plan. 0 is a wildcard that indicates "any amount".
            "currency": "",             // Required. Three letter ISO 4217 currency code. eg: USD
            "frequency": "",            // Required. [one-time, weekly, fortnightly, monthly, yearly, other]
            "channels": []              // Required. One or more channel IDs defined in channels[] via which this plan can accept payments.
        }],

        // Optional. A simple summary of funding history. Only include if at least one, either income or expenses, have to be communicated.
        "history": [{
            "year": 2024,               // Required. Year (fiscal, preferably).
            "income": 0,                // Optional.
            "expenses": 0,              // Optional.
            "taxes": 0,                 // Optional.
            "currency": "",             // Required. Three letter ISO 4217 currency code. eg: USD
            "description": ""           // Optional. Any additional description. Max length 500.
        }]
    }
}

Copy


Example

Assuming that the manifest is located at https://example.com/funding.json

{
    "version": "v1.0.0",
    "entity": {
        "type": "individual",
        "role": "maintainer",
        "name": "The One (demo)",
        "email": "[email protected]",
        "phone": "",
        "description": "I'm a developer interested in preserving digital freedoms and the decentralised and open nature of the internet. I like breaking down barriers in the cyberspace with FOSS technologies.\n\nSometimes I can't shake the feeling that the system we're living in isn't quite what it seems. That there is no spoon.\n\nPS: This is a dummy listing.",
        "webpageUrl": {
            "url": "https://example.com",
            "wellKnown": ""
        }
    },
    "projects": [{
        "guid": "zombo-app",
        "name": "Zombo App (demo)",
        "description": "The Zombo App is a database application that solves many problems and makes anything possible. Anything at all. Its possibilities are only limited by the user's own imagination.\n\nIt has been in active development for a decade and is used by millions of people worldwide. It is the next frontier.\n\nPS: This is a dummy demo listing.",
        "webpageUrl": {
            "url": "https://example.com/projects/zombo"
        },
        "repositoryUrl": {
            "url": "https://github.com/example/zombo-app",
            "wellKnown": "https://github.com/example/zombo-app/blob/main/.well-known/funding-manifest-urls"
        },
        "licenses": ["spdx:AGPL-3.0"],
        "tags": ["database", "columnar-database", "high-performance", "key-value-store"]
    },
    {
        "guid": "vb-gooey",
        "name": "VB Gooey IP tracer (demo)",
        "description": "Using quantum-entangled packet sniffers, this cutting-edge Visual Basic GUI IP Tracer employs hyper-threaded blockchain algorithms to decrypt the target's digital DNA signature. The system's neural network of overclocked RAM crystals generates a real-time holographic map of cyberspace, pinpointing the perp's location with nanosecond precision.\n\nIn addition, its turbo-encabulated flux capacitor and multi-dimensional firewall penetrator, allows any hyper-dimensional air-gapped network to be broken into with ease.\n\n\n\nPS: This is a dummy demo listing.",
        "webpageUrl": {
            "url": "https://vb-gooey-ip-tracer.net",
            "wellKnown": "https://vb-gooey-ip-tracer.net/.well-known/funding-manifest-urls"
        },
        "repositoryUrl": {
            "url": "https://github.com/example/vb-gooey-ip-tracer",
            "wellKnown": "https://github.com/example/vb-gooey-ip-tracer/blob/main/.well-known/funding-manifest-urls"
        },
        "licenses": ["spdx:MIT"],
        "tags": ["high-performance", "security", "gui", "networking"]
    }],
    "funding": {
        "channels": [
            {
                "guid": "mybank",
                "type": "bank",
                "address": "",
                "description": "Will accept direct bank transfers. Please e-mail me for details."
            },
            {
                "guid": "mypay",
                "type": "payment-provider",
                "address": "https://example.com/payme/@myid",
                "description": "Pay with your debit/credit card through this gateway and setup recurring subscriptions."
            }
        ],
        "plans": [
            {
                "guid": "hosting-monthly",
                "status": "active",
                "name": "Hosting support",
                "description": "This will cover the monthly server hosting costs for the projects.",
                "amount": 250,
                "currency": "USD",
                "frequency": "monthly",
                "channels": ["mypay"]
            },
            {
                "guid": "developer-time",
                "status": "active",
                "name": "Developer compensation",
                "description": "This will cover the cost of one developer working part-time on the projects.",
                "amount": 1000,
                "currency": "USD",
                "frequency": "monthly",
                "channels": ["mybank"]
            },
            {
                "guid": "angel-plan",
                "status": "active",
                "name": "Goodwill plan",
                "description": "Pay anything you wish to show your goodwill for the project.",
                "amount": 0,
                "currency": "USD",
                "frequency": "one-time",
                "channels": ["mybank", "mypay"]
            }
        ],
        "history": [
            {"year": 2020, "income": 10000, "expenses": 2000, "taxes": 200, "currency": "USD", "description": "Started accepting donations for the first time."},
            {"year": 2021, "income": 15000, "expenses": 5000, "taxes": 500, "currency": "USD", "description": ""},
            {"year": 2022, "income": 30000, "expenses": 10000, "taxes": 2000, "currency": "USD", "description": ""},
            {"year": 2023, "income": 25000, "expenses": 15000, "taxes": 1500, "currency": "USD", "description": "There was a dip, but we see this improving."}
        ]
    }
}

Copy


For repository hosting platforms like GitHub, the manifest can be checked into the project repository directly, eg: https://github.com/example/coolapp/blob/main/funding.json


wellKnown

If the manifest references URLs, such as a project's webpage, that are not on the same domain as the funding.json manifest itself, then the wellKnown URL must point to a /.well-known/funding-manifest-urls file. This file should contain URL (one or more) of the funding.json manifest URLs that reference it. This establishes provenance and verifies that that the publisher of the manifest is authorised to solicit funding on behalf of the URLs (entity, projects) described in the manifest. This follows the .well-known convention. An example scenario is described below.

Manifest locationhttps://example.com/funding.json
Project URL referenced in the manifesthttps://my-cool-project.net
Expected wellKnown along with the project URLhttps://my-cool-project.net/.well-known/funding-manifest-urls
Contents of the wellKnown filehttps://example.com/funding.json

tags

While the tags[] field under projects is meant for arbitrary lowercase-alphanumeric-dash strings to describe the projects, project-tags.txt can be used as a reference list for uniformity.


Tools