Skip to content

Zoya API Reference

The Zoya API offers data covering Shariah compliance information for global stocks. It is available in basic and advanced packages, where the advanced package includes additional data fields, screening methodologies, and global coverage. The basic package is limited to the US market using the AAOIFI methodology.

The API has two environments: sandbox and live. The sandbox environment is free to use and does not require an active subscription. All you need is a Zoya developer account and an API key that is available for free after registration. Data in the sandbox environment is randomized and does not reflect real-world data. The live environment requires an active subscription to use and has real data.

We are still actively expanding the API to add new capabilities. If you have specific ideas or feature requests that you would be interested in, please reach out to our team at support+api@zoya.finance.

You can sign up for a free account to try the sandbox API and subscribe to a live data plan at developer.zoya.finance.

Quickstart

Check a stock's Shariah compliance status in about a minute. The sandbox is free and does not require a subscription — all you need is a Zoya developer account.

Get a sandbox API key

Sign up at developer.zoya.finance and copy a key from your dashboard.

Send a request

Every call is an HTTP POST to the GraphQL endpoint with your key in the Authorization header.

curl https://sandbox-api.zoya.finance/graphql \
  -X POST \
  -H "Authorization: sandbox-YOUR_API_KEY_HERE" \
  -H "Content-Type: application/json" \
  --data '{"query":"query { basicCompliance { report(symbol: \"AMD\") { symbol name exchange status reportDate } } }"}'

Read the response

A successful request returns its payload under data.

{
  "data": {
    "basicCompliance": {
      "report": {
        "symbol": "AMD",
        "name": "Advanced Micro Devices Inc.",
        "exchange": "XNAS",
        "status": "COMPLIANT",
        "reportDate": "2026-08-07T00:00:00.000Z"
      }
    }
  }
}

When you are ready for real data, point the same request at https://api.zoya.finance/graphql and swap the key prefix to live-. From there, the Guides cover the common workflows, and the Concepts explain what the returned values mean.

Authentication

The Zoya API uses API keys to authenticate requests. You can create an API key by signing up for an account at developer.zoya.finance. Once you have an account, you can view your API keys from the dashboard page there. You can then use these API keys to authenticate requests by setting the Authorization header to live-YOUR_API_KEY_HERE for the live environment or sandbox-YOUR_API_KEY_HERE for the sandbox environment.

This API key should not be exposed publicly. If you need to make requests from a client-side application, you should proxy the requests through your own server. This will prevent your API key from being exposed to the public.

Environments

Zoya keeps testing and production traffic separate. The schema is identical in both, so you can build against the sandbox and switch by changing the endpoint and the key prefix.

Sandbox

Test data

Use while building and testing. No subscription required.

https://sandbox-api.zoya.finance/graphql

Key prefix sandbox-

Live

Real data

Returns real compliance data. Requires an active subscription.

https://api.zoya.finance/graphql

Key prefix live-

Do not treat sandbox data as real

Sandbox responses are randomized and must not be surfaced as investment or compliance information.

API Explorer

While the API documentation here serves as a reference, we recommend actually experimenting with the API using our API Explorer. You can find the API Explorer at developer.zoya.finance/explorer. The API Explorer allows you to run queries against the API and see the results in real-time. It also provides in-line documentation and auto-completion for API queries as you type, so you can learn about the API as you use it.

If you already have another GraphQL API explorer that you would prefer to use instead, the Zoya GraphQL API supports introspection. All you need to do is include your API key in the Authorization header for the introspection query.

The complete schema is also published as SDL at developer.zoya.finance/schema.graphql. It needs no API key and is republished on every deploy, so it always matches the live schema. Point your editor, code generator, or AI coding assistant at it to get accurate type and field names.

Plans and licensing

The API is available in two packages. Advanced contains everything in Basic and adds to it, so moving up is additive — nothing you already query stops working. Most integrations start with Basic and move to Advanced when they need markets beyond the US, or need to show users the screening detail behind a rating.

Basic

For US-market products that need a verdict per security. AAOIFI methodology, US stocks and US-listed ETFs, purification ratios.

Advanced

Everything in Basic, plus international markets and the screening detail behind a rating — per-screen results, revenue classification, and FIGI lookup.

Current pricing for both packages is listed on your dashboard at developer.zoya.finance.

Capability Basic Advanced
US stock compliance reports ✓ ✓
Overall compliance status ✓ ✓
Purification ratio ✓ ✓
Fund and ETF reports ✓ ✓
International markets – ✓
Business and financial screen breakdown – ✓
Revenue classification amounts – ✓
Lookup by FIGI – ✓
Zakat calculations – –

Fund and ETF reports come from basicCompliance.funds on both packages — advancedCompliance has no funds field, so an Advanced integration still reads fund coverage through the basic namespace.

Zakat calculation queries sit outside both packages. They are enabled for every account in the sandbox; live access is granted separately — contact support@zoya.finance.

Both packages carry distinct licensing models for personal and commercial use:

  • Personal Use License: For individuals such as investors and researchers for personal and non-public use. Public display of API data on forums, websites, social media, or other public mediums is prohibited.
  • Commercial Use License: For businesses and professional users. Allows broader use, including internal display within an organization. External display to third parties or the public requires Zoya's prior written approval, which can be requested by submitting a proposal detailing the intended use and presentation of the data. Approval is at Zoya's discretion.

Attribution

Attribution is required for all users. It is as simple as putting "Data provided by Zoya" somewhere near the data and linking that text to https://zoya.finance/api.

Example:

<a href="https://zoya.finance/api">Data provided by Zoya</a>

Terms of use

Use of the Zoya API, in both the sandbox and live environments, is governed by the Zoya Terms of Use. The personal and commercial licence models under Plans and licensing set out how the data itself may be displayed.

Read the Terms of Use

GraphQL

The API is modeled after the GraphQL specification. This allows you to query the API for exactly the data you need from our schema. GraphQL clients are available for most languages and frameworks. If you need assistance, reach out to our team for support.

In the end, this is an HTTP API that takes in a request according to the GraphQL request specification and returns a JSON response.

Queries are organized into top-level namespaces that map to what you have access to: basicCompliance and advancedCompliance, documented in full under Operations below. See Plans and licensing for what each one covers.

A third namespace, zakat, calculates zakat liability on a set of holdings. It is enabled for every account in the sandbox, so you can build against it without a subscription. Live access is granted separately — contact support@zoya.finance.

Compliance statuses

Compliance is an enum, not a boolean. Treat it as four possible values so that an unrated or ambiguous security does not silently render as non-compliant in your product.

Status Meaning
COMPLIANT The security passes the given screening methodology.
NON_COMPLIANT The security fails the given screening methodology.
QUESTIONABLE Revenue sources fall in an area of significant scholarly disagreement, or the financial reports do not contain enough information for a definitive judgement.
UNRATED No rating exists for this security under the given methodology.

A status is always relative to a screening methodology — the same security can be rated differently under different methodologies. New values may be added to this enum over time, so handle unrecognized statuses gracefully rather than assuming the set is closed.

The treatment above is the convention Zoya's own apps use. Reusing it is not required, but keeping QUESTIONABLE and UNRATED visually distinct from NON_COMPLIANT is: those two mean "we cannot tell you", not "no".

Screening methodology

Zoya screens securities in two stages, and the advanced package exposes each stage separately via the businessScreen and financialScreen fields alongside the overall status.

Business screen

Revenue

Analyses where the company's revenue comes from. The advanced report breaks this down into compliantRevenue, nonCompliantRevenue, and questionableRevenue.

Financial screen

Ratios

Analyses the company's debt and interest ratios. A financial screen never returns QUESTIONABLE — it is always COMPLIANT, NON_COMPLIANT, or UNRATED.

ScreeningMethodology currently has a single value, AAOIFI, which is the same methodology used in the Zoya mobile app. It is a required input on advanced queries so that adding methodologies later is not a breaking change.

The purificationRatio field is the portion of dividend income to donate to charity. Multiply it by the dividends received from that security to get the amount to donate; it does not apply to securities that pay no dividend. On fund reports this field is restricted and returns null unless it has been enabled for your account — contact support if you need it.

Symbols and identifiers

A ticker symbol on its own does not uniquely identify a security. Multiple distinct stocks across different markets can share the same symbol, so a symbol is only unambiguous when paired with its exchange.

Field Use
symbol The canonical symbol used by the Zoya API.
rawSymbol The ticker without any exchange suffix.
exchange Disambiguates securities sharing a symbol across markets. Nullable on some funds, such as mutual funds with no listing exchange.
figi A stable security identifier, available on advanced reports.

Advanced report lookups accept either symbol or figi. Prefer figi when you have it, since it survives ticker changes.

Markets and coverage

Coverage depends on your package. The basic package covers US equities and US-listed ETFs. The advanced package adds international markets.

Rather than hardcoding a list of markets, query advancedCompliance.regions for the set of regions that currently have reports available. Regions are always ISO 3166-1 alpha-2 country codes, such as US. Passing a region that is not in that list will not return results.

advancedCompliance.menaScreens is a separate endpoint covering Shariah-compliant stocks from MENA regions.

Data freshness

Zoya's dataset is refreshed regularly to incorporate newly available information across the market, including updated company financials, new listings, delistings, and other relevant changes.

Because companies publish new information on different schedules, the underlying data for any individual company may change less frequently. When new information becomes available, it is incorporated into subsequent dataset refreshes.

Fund reports carry holdingsAsOfDate, the latest date holdings information was available for that fund. Funds publish holdings at varying frequencies, and a fund's compliance status can change even when no new holdings data has been published, because the compliance status of its underlying holdings may have changed.

Responses are also cached at the edge for up to 15 minutes, so a newly published report can take that long to appear in your results.

Required vs optional fields

Some inputs in the API are required, while others are optional. Required inputs are suffixed with an exclamation point ! in the documentation. If you do not provide a required input, the API will return an error. Optional inputs are not marked with an exclamation point. If you do not provide an optional input, the API will use a default value for that input or ignore it altogether.

Similarly, the ! suffix in documented response types indicates that the field is always present in the response. If the field is not suffixed with a !, it is optional and may return null in the response.

Error handling

GraphQL requests always return JSON responses with HTTP code 200. Errors are returned in the errors field of the response body, while successful requests have their data surfaced in the data field. If there are any errors in your request, the errors property will be an array of error objects. Every error object will have at least a message and errorType field to signify the type of error that occurred. There are additional fields that may be useful for debugging, such as locations in your query that encountered the error and the path to the field that encountered the error. For more details, see the GraphQL Errors spec.

{
  "data": null,
  "errors": [
    {
      "message": "Not Authorized to access report on type BasicComplianceQuery",
      "errorType": "Unauthorized",
      "path": ["basicCompliance", "report"],
      "locations": [{ "line": 2, "column": 5 }]
    }
  ]
}

A response can carry both data and errors — a partial failure resolves the fields it can and reports the rest, so check errors even when data is present.

Rate limiting is the exception: exceeding the limit returns a 429 Too Many Requests HTTP response rather than a 200 with an errors array.

Rate limits

Requests to the Zoya API are rate limited to 10 requests per second. If you exceed this limit, you will receive a 429 Too Many Requests response. If you need a higher rate limit, please contact our team for assistance.

Guides

Each guide below is a complete, runnable query for a common task, with the response it returns. For the exact arguments, fields, and enums behind them, see the Operations reference further down.

Get Shariah compliance rating for a specific stock

To get the compliance report for a stock, you can query the basicCompliance.report field. The example below shows a query that retrieves the latest compliance report for AMD. To request a different stock, just set a different value for symbol.

Query

query GetReport {
  basicCompliance {
    report(symbol: "AMD") {
      symbol
      name
      exchange
      status
    }
  }
}

Response

{
  "data": {
    "basicCompliance": {
      "report": {
        "symbol": "AMD",
        "name": "Advanced Micro Devices Inc.",
        "exchange": "XNAS",
        "status": "COMPLIANT"
      }
    }
  }
}

Get all Shariah compliance ratings for the US market

To get a list of all compliance reports, you can query the basicCompliance.reports field. The example below fetches the first page of results.

Query

query ListReports {
  basicCompliance {
    reports {
      items {
        symbol
        name
        exchange
        status
      }
      nextToken
    }
  }
}

Response

{
  "data": {
    "basicCompliance": {
      "reports": {
        "items": [
          {
            "symbol": "A",
            "name": "Agilent Technologies Inc.",
            "exchange": "XNYS",
            "status": "COMPLIANT"
          },
          {
            "symbol": "AA",
            "name": "Alcoa Corp",
            "exchange": "XNYS",
            "status": "NON_COMPLIANT"
          },
          // ...
        ],
        "nextToken": "exampleNextPageToken"
      }
    }
  }
}

To fetch the next page of results, run the same query again, but with the nextToken passed along to the query input. Continue to do this until the nextToken field is null, at which point all pages will have been returned.

This example shows how to fetch the second page of results.

Query

query ListReports {
  basicCompliance {
    reports(input: { nextToken: "exampleNextPageToken" }) {
      items {
        symbol
        name
        exchange
        status
      }
      nextToken
    }
  }
}

Response

{
  "data": {
    "basicCompliance": {
      "reports": {
        "items": [
          {
            "symbol": "BAC",
            "name": "Bank Of America Corp.",
            "exchange": "XNYS",
            "status": "NON_COMPLIANT",
            "reportDate": "2023-12-12:08:03.420Z"
          },
          // ...
        ],
        "nextToken": "anotherNextPageToken"
      }
    }
  }
}

Get a list of all Shariah-compliant stocks in the US market

To get a list of just the compliant stocks, you can query the basicCompliance.reports field with a filter for the compliance status.

Query

query ListCompliantStocks {
  basicCompliance {
    reports(input: {
      filters: { status: COMPLIANT }
    }) {
      items {
        symbol
        reportDate
        name
        exchange
      }
      nextToken
    }
  }
}

Response

{
  "data": {
    "basicCompliance": {
      "reports": {
        "items": [
          {
            "symbol": "A",
            "reportDate": "2023-11-20T17:00:00.000Z",
            "name": "Agilent Technologies Inc.",
            "exchange": "XNYS"
          },
          {
            "symbol": "AACG",
            "reportDate": "2023-11-13T17:00:00.000Z",
            "name": "ATA Creativity Global - ADR",
            "exchange": "XNAS"
          },
          // ...
        ],
        "nextToken": "exampleNextPageToken"
      }
    }
  }
}

Like the example for fetching all Shariah compliance reports above, this query returns paginated results. To retrieve the next page of results, run the same query again, but with the nextToken from the response passed along to the query input. Continue to do this until the nextToken response is null, at which point all pages will have been returned.

Get the full Shariah compliance report for a specific stock

To get a detailed compliance report for a stock, you can query the advancedCompliance.report field. The example below shows a query that retrieves the latest compliance report for AMD. To request a different stock, just set a different value for symbol.

This query requires passing in a Shariah screening methodology as input. Currently, only the AAOIFI based screening methodology is supported, but there are plans to expand that in the near future.

Note that fetching detailed compliance reports requires an active subscription to our advanced data package.

Query

query GetAdvancedReport {
  advancedCompliance {
    report(input: {
      symbol: "AMD",
      methodology: AAOIFI
    }) {
      symbol
      rawSymbol
      name
      figi
      exchange
      status
      reportDate
      businessScreen
      financialScreen
      compliantRevenue
      nonCompliantRevenue
      questionableRevenue
      ... on AAOIFIReport {
        securitiesToMarketCapRatio 
        debtToMarketCapRatio 
      }
    }
  }
}

Response

{
  "data": {
    "advancedCompliance": {
      "report": {
        "symbol": "AMD",
        "rawSymbol": "AMD",
        "name": "Advanced Micro Devices Inc.",
        "figi": null,
        "exchange": "XNAS",
        "status": "COMPLIANT",
        "reportDate": "2023-11-01T16:00:00.000Z",
        "businessScreen": "COMPLIANT",
        "financialScreen": "COMPLIANT",
        "compliantRevenue": 99.7253443758979,
        "nonCompliantRevenue": 0.2746556241020874,
        "questionableRevenue": 0,
        "securitiesToMarketCapRatio": 0.03483800178616272,
        "debtToMarketCapRatio": 0.017235326034917495
      }
    }
  }
}

Get a Shariah compliance report for a non-US stock

To get a detailed compliance report for an international stock, you can query the advancedCompliance.report field with a specific symbol. Note that the symbol must be the raw symbol for the stock suffixed with the Bloomberg exchange code. For example, the TYT symbol listed on the London Stock Exchange should be queried using TYT-LN as the symbol input.

The example below shows a query that retrieves the latest compliance report for ticker 0R0K on the London Stock Exchange. To request a different stock, just set a different value for symbol.

This query requires passing in a Shariah screening methodology as input. Currently, only the AAOIFI based screening methodology is supported, but there are plans to expand that in the near future.

Note that fetching international compliance reports requires an active subscription to our advanced data package.

Query

query GetInternationalReport {
  advancedCompliance {
    report(input: {
      symbol: "0R0K-LN",
      methodology: AAOIFI,
    }) {
      symbol
      rawSymbol
      name
      figi
      exchange
      status
      reportDate
      businessScreen
      financialScreen
      ... on AAOIFIReport {
        debtToMarketCapRatio 
        securitiesToMarketCapRatio 
      }
    }
  }
}

Response

{
  "data": {
    "advancedCompliance": {
      "report": {
        "symbol": "0R0K-LN",
        "rawSymbol": "0R0K",
        "name": "Cisco Systems, Inc.",
        "figi": "BBG00QDG6DB5",
        "exchange": "XLON",
        "status": "COMPLIANT",
        "reportDate": "2023-12-10:08:03.420Z",
        "businessScreen": "COMPLIANT",
        "financialScreen": "COMPLIANT",
        "compliantRevenue": 98.34,
        "nonCompliantRevenue": 1.66,
        "questionableRevenue": 0,
        "debtToMarketCapRatio": 0.0416,
        "securitiesToMarketCapRatio": 0.1145
      }
    }
  }
}

Get all Shariah compliance reports for a region

To get detailed compliance report for a given region, can query the advancedCompliance.reports field with a specific symbol.

The example below shows a query that retrieves a page of compliance reports for the United Kingdom region. To request a different region, just set a different stock, just set a different value for region on the input to any ISO 3166-1 alpha-2 country code (e.g., "US", "CA", "GB", etc). The get a list of all supported regions, you can query the advancedCompliance.regions` field.

This query requires passing in a Shariah screening methodology as input. Currently, only the AAOIFI based screening methodology is supported, but there are plans to expand that in the near future.

Note that fetching international compliance reports requires an active subscription to our advanced data package.

Query

query ListInternationalReports {
  advancedCompliance {
    reports(input: {
      region: "GB"
      methodology: AAOIFI,
    }) {
      items {
        symbol
        rawSymbol
        name
        figi
        exchange
        status
        reportDate
        businessScreen
        financialScreen
        ... on AAOIFIReport {
          debtToMarketCapRatio 
          securitiesToMarketCapRatio 
        }
      }
      nextToken
    }
  }
}

Response

{
  "data": {
    "advancedCompliance": {
      "reports": {
        "items": [
          {
            "symbol": "0A02-LN",
            "rawSymbol": "0A02",
            "name": "Neoen S.A.",
            "figi": null,
            "exchange": "XLON",
            "status": "NON_COMPLIANT",
            "reportDate": "2023-07-27T08:00:00.000Z",
            "businessScreen": "COMPLIANT",
            "financialScreen": "NON_COMPLIANT",
            "debtToMarketCapRatio": 0.819055573095525,
            "securitiesToMarketCapRatio": 0.248412711875593
          },
          {
            "symbol": "0A05-LN",
            "rawSymbol": "0A05",
            "name": "Medacta Group SA",
            "figi": null,
            "exchange": "XLON",
            "status": "COMPLIANT",
            "reportDate": "2023-09-22T08:00:00.000Z",
            "businessScreen": "COMPLIANT",
            "financialScreen": "COMPLIANT",
            "debtToMarketCapRatio": 0.07924711603883236,
            "securitiesToMarketCapRatio": 0.011141837087433886
          },
          // ...
      ],
      "nextToken": "exampleNextPageToken"
    }
  }
}

Get all compliant stocks from MENA regions

To get a list of all compliant stocks from MENA regions, you can query the advancedCompliance.menaScreens field.

Note that fetching MENA compliance reports requires an active subscription to our advanced data package.

Query

query ListMENAScreens {
  advancedCompliance {
    menaScreens {
      rawSymbol
      name
      exchange
      region
      status
    }
  }
}

Response

{
  "data": {
    "advancedCompliance": {
      "menaScreens": [
        {
          "rawSymbol": "EIBK",
          "name": "Emirates Islamic Bank PJSC",
          "exchange": "XADX",
          "region": "AE",
          "status": "COMPLIANT"
        },
        {
          "rawSymbol": "NBK",
          "name": "National Bank of Kuwait S.A.K.P.",
          "exchange": "XKWD",
          "region": "KW",
          "status": "COMPLIANT"
        },
        // ...
      ]
    }
  }
}

Get a list of Shariah compliance reports for ETFs

To get a list of compliance reports for ETFs, you can query the basicCompliance.funds field with a filter for the compliance status.

Query

query ListFundReports {
  basicCompliance {
    funds {
      items {
        symbol
        name
        status
        reportDate
        holdingsAsOfDate
      }
      nextToken
    }
  }
}

Response

{
  "data": {
    "basicCompliance": {
      "funds": {
        "items": [
          {
            "symbol": "GLD",
            "name": "SPDR Gold Shares",
            "status": "COMPLIANT",
            "reportDate": "2025-06-04T08:00:00.000Z",
            "holdingsAsOfDate": "2025-06-03T08:00:00.000Z"
          },
          {
            "symbol": "BND",
            "name": "Vanguard Total Bond Market ETF",
            "status": "NON_COMPLIANT",
            "reportDate": "2025-05-30T08:00:00.000Z",
            "holdingsAsOfDate": "2025-05-29T08:00:00.000Z"
          },
          // ...
        ],
        "nextToken": "exampleNextPageToken"
      }
    }
  }
}

Get list of regions with available Shariah compliance reports

To list all available regions for which compliance reports are available, you can query the advancedCompliance.regions field.

Note that fetching international compliance reports requires an active subscription to our advanced data package.

Query

query ListRegions {
  advancedCompliance {
    regions
  }
}

Response

{
  "data": {
    "regions": [
      "CA", 
      "DE", 
      "FR", 
      "GB", 
      "IN", 
      "JP",
      // ...
    ]
  }
}

Calculate zakat due on a portfolio

The zakat.calculate field returns the zakat liability for a set of holdings. It is enabled for every account in the sandbox, so this guide runs without a subscription; live access is granted separately — contact support@zoya.finance.

Each holding carries a strategy, which is your statement of intent rather than a property of the security. Use ACTIVE for positions you intend to trade within a year, which are treated as cash, and PASSIVE for long-term holdings, where the calculation looks through to the company's share of current assets. For funds, PASSIVE is applied recursively across the fund's holdings.

Query

query CalculateZakat {
  zakat {
    calculate(
      holdings: [
        { symbol: "AAPL", strategy: PASSIVE, quantity: 100, unitPrice: 195.50 }
        { symbol: "AMD", strategy: ACTIVE, quantity: 40, unitPrice: 142.25 }
        { symbol: "GLD", strategy: PASSIVE, quantity: 25, unitPrice: 310.40 }
      ]
    ) {
      zakatLiableAmount
      zakatDue
      currency
      holdings {
        symbol
        strategy
        marketValue
        zakatLiableAmount
        zakatDue
        calculationMethod
      }
    }
  }
}

Response

{
  "data": {
    "zakat": {
      "calculate": {
        "zakatLiableAmount": 16166.45,
        "zakatDue": 404.16,
        "currency": "USD",
        "holdings": [
          {
            "symbol": "AAPL",
            "strategy": "PASSIVE",
            "marketValue": 19550.00,
            "zakatLiableAmount": 2716.45,
            "zakatDue": 67.91,
            "calculationMethod": "PASSIVE_INVESTMENT"
          },
          {
            "symbol": "AMD",
            "strategy": "ACTIVE",
            "marketValue": 5690.00,
            "zakatLiableAmount": 5690.00,
            "zakatDue": 142.25,
            "calculationMethod": "TREAT_AS_CASH"
          },
          {
            "symbol": "GLD",
            "strategy": "PASSIVE",
            "marketValue": 7760.00,
            "zakatLiableAmount": 7760.00,
            "zakatDue": 194.00,
            "calculationMethod": "TREAT_AS_CASH"
          }
        ]
      }
    }
  }
}

Read calculationMethod per holding rather than assuming the strategy you sent was applied. It is the method actually used, and the two can differ: GLD above was submitted as PASSIVE but returns TREAT_AS_CASH, because a precious metals spot fund is treated as cash for zakat purposes. A holding can also come back as FALLBACK_30 — 2.5% of 30% of market value — when outstanding share or current asset data is not reliable enough to look through the company. Surfacing the method is what lets a user understand a number they may be asked to justify.

zakatDue is always 2.5% of zakatLiableAmount, at both the holding and portfolio level, so you can display either without recomputing. Mixed-currency holdings are returned in USD.

One thing the API does not decide for you: whether zakat is owed at all. That depends on the nisab threshold applied to the user's total wealth, not to the holdings in a single request.

Basic Compliance Queries

funds

Description

Retrieves a list of funds and their compliance reports. Currently only covers US-based ETFs.

Response

Returns a BasicFundReportsPage!

Arguments

Name Description
input - BasicFundsInput Optional input for pagination and filtering options when listing funds. Currently, it is recommended to omit this. It is for forward-compatibility of additional filtering capabilities and fund types.

Example

Query

query Funds($input: BasicFundsInput) {
  funds(input: $input) {
    items {
      symbol
      name
      exchange
      status
      holdingsAsOfDate
      purificationRatio
      reportDate
    }
    nextToken
  }
}

Variables

{"input": BasicFundsInput}

Response

{
  "data": {
    "funds": {
      "items": [BasicFundReport],
      "nextToken": "xyz789"
    }
  }
}

report

Description

Retrieve the most recent Shariah compliance report for a given symbol based on the AAOIFI methodology. This endpoint is limited to US stocks only. If no report is found, this will return null.

Response

Returns a BasicComplianceReport

Arguments

Name Description
symbol - String! The symbol of the stock to retrieve a compliance report for (e.g., "AAPL" or "AMD").

Example

Query

query Report($symbol: String!) {
  report(symbol: $symbol) {
    symbol
    name
    exchange
    status
    purificationRatio
    reportDate
  }
}

Variables

{"symbol": "xyz789"}

Response

{
  "data": {
    "report": {
      "symbol": "xyz789",
      "name": "xyz789",
      "exchange": "abc123",
      "status": "COMPLIANT",
      "purificationRatio": 987.65,
      "reportDate": "2023-12-10:08:03.420Z"
    }
  }
}

reports

Description

Retrieve a list of Shariah compliance reports based on the AAOIFI methodology. Limited to US equities only.

Response

Returns a BasicComplianceReportsPage!

Arguments

Name Description
input - BasicReportsInput Optional input for pagination and filtering options when listing reports.

Example

Query

query Reports($input: BasicReportsInput) {
  reports(input: $input) {
    items {
      symbol
      name
      exchange
      status
      purificationRatio
      reportDate
    }
    nextToken
  }
}

Variables

{"input": BasicReportsInput}

Response

{
  "data": {
    "reports": {
      "items": [BasicComplianceReport],
      "nextToken": "abc123"
    }
  }
}

Advanced Compliance Queries

externalScreens

Use menaScreens instead.

Response

Returns [MENAScreens!]

Example

Query

query ExternalScreens {
  externalScreens {
    rawSymbol
    name
    exchange
    region
    status
    reportDate
  }
}

Response

{
  "data": {
    "externalScreens": [
      {
        "rawSymbol": "abc123",
        "name": "xyz789",
        "exchange": "xyz789",
        "region": "xyz789",
        "status": "COMPLIANT",
        "reportDate": "2023-12-10:08:03.420Z"
      }
    ]
  }
}

menaScreens

Description

Retrieve a list of stocks from MENA regions that are considered to be shariah compliant. The sandbox environment will just return a limited subset instead of mock data for this query.

Response

Returns [MENAScreens!]

Example

Query

query MenaScreens {
  menaScreens {
    rawSymbol
    name
    exchange
    region
    status
    reportDate
  }
}

Response

{
  "data": {
    "menaScreens": [
      {
        "rawSymbol": "xyz789",
        "name": "abc123",
        "exchange": "abc123",
        "region": "xyz789",
        "status": "COMPLIANT",
        "reportDate": "2023-12-10:08:03.420Z"
      }
    ]
  }
}

regions

Description

Retrieve the list of supported regions/markets that have compliance reports available. These will always be ISO 3166-1 alpha-2 country codes (e.g. "US").

Response

Returns [String!]!

Example

Query

query Regions {
  regions
}

Response

{"data": {"regions": ["abc123"]}}

report

Description

Retrieve the most recent advanced Shariah compliance report for a given symbol or FIGI identifier based on the given methodology. If the identifier is not recognized or no report is found, this will return null.

Response

Returns an AdvancedComplianceReport

Arguments

Name Description
input - AdvancedReportInput!

The input for retrieving a detailed compliance report for a given identifier and methodology. Both the methodolgy and some identifier (either symbol or figi) must be provided. If both are provided, figi will be used. An error will be thrown if neither are provided.

Different fields are returned depending on the screening methodology used. The AdvancedComplianceReport interface is the base type that contains all fields in common across different methodologies. GraphQL fragment queries can be used to retrieve fields unique to a specific methdology.

Example

Query

query Report($input: AdvancedReportInput!) {
  report(input: $input) {
    symbol
    rawSymbol
    name
    figi
    exchange
    status
    reportDate
    businessScreen
    financialScreen
    compliantRevenue
    nonCompliantRevenue
    questionableRevenue
    purificationRatio
  }
}

Variables

{"input": AdvancedReportInput}

Response

{
  "data": {
    "report": {
      "symbol": "0R0K-LN",
      "rawSymbol": "0R0K",
      "name": "Cisco Systems, Inc.",
      "figi": "BBG00QDG6DB5",
      "exchange": "XLON",
      "status": "COMPLIANT",
      "reportDate": "2023-12-10:08:03.420Z",
      "businessScreen": "COMPLIANT",
      "financialScreen": "COMPLIANT",
      "compliantRevenue": 98.34,
      "nonCompliantRevenue": 1.66,
      "questionableRevenue": 0,
      "purificationRatio": 123.45
    }
  }
}

reports

Description

Retrieve a list of advanced Shariah compliance reports for a given region and methodology.

Response

Returns an AdvancedComplianceReportsPage!

Arguments

Name Description
input - AdvancedReportsInput!

The input for querying for a list of detailed compliance reports under the advancedCompliance API package. The methodology and region fields must be provided. The filters field is optional.

This API is paginated. To retrieve the next page of results, pass the nextToken value from the previous API response as the nextToken parameter. When the last page of results is reached, the nextToken field will be null.

Example

Query

query Reports($input: AdvancedReportsInput!) {
  reports(input: $input) {
    items {
      symbol
      rawSymbol
      name
      figi
      exchange
      status
      reportDate
      businessScreen
      financialScreen
      compliantRevenue
      nonCompliantRevenue
      questionableRevenue
      purificationRatio
    }
    nextToken
  }
}

Variables

{"input": AdvancedReportsInput}

Response

{
  "data": {
    "reports": {
      "items": [AdvancedComplianceReport],
      "nextToken": "abc123"
    }
  }
}

Types

AAOIFIReport

Description

Report shape used for the AAOIFI methodology.

Fields

Field Name Description
symbol - String! The symbol Zoya uses to uniquely identify a stock. Exchange specific suffixes will be used for international exchanges outside the US.
rawSymbol - String! The symbol for the ticker without any exchange suffix included. Note that multiple distinct stocks may have identical symbols.
name - String! The name of the entity associated with this report.
figi - String The FIGI identifier for the entity associated with this report. This field may be null for some entities.
exchange - String! The exchange on which the stock is traded.
status - ComplianceStatus! The overall Shariah compliance status of the stock or security.
reportDate - AWSDateTime! The date the compliance report was last updated. Reports are updated based on company reports which are published at different times of the year.
businessScreen - ComplianceStatus! The Shariah compliance of the revenue sources of the associated entity.
financialScreen - ComplianceStatus! The Shariah compliance of financial ratios of the associated entity based on the screening methodology.
compliantRevenue - Float! Percentage of revenue earned that is considered Shariah compliant.
nonCompliantRevenue - Float! Percentage of revenue earned that is considered not Shariah compliant.
questionableRevenue - Float! Percentage of revenue earned that is considered questionable with regards to Shariah compliance. This may be due to broad differences of opinions among scholars or due to limited details published by the company for a given revenue segment.
purificationRatio - Float! The portion of profits to be donated to charity for purification. Multiply this number by dividends received or capital gains realized to determine the amount to donate.
debtToMarketCapRatio - Float! Ratio of interest-bearing debt relative to market capitalization.
securitiesToMarketCapRatio - Float! Ratio of interest bearing securities relative to market capitalization.

Example

{
  "symbol": "0R0K-LN",
  "rawSymbol": "0R0K",
  "name": "Cisco Systems, Inc.",
  "figi": "BBG00QDG6DB5",
  "exchange": "abc123",
  "status": "COMPLIANT",
  "reportDate": "2023-12-10:08:03.420Z",
  "businessScreen": "COMPLIANT",
  "financialScreen": "COMPLIANT",
  "compliantRevenue": 98.34,
  "nonCompliantRevenue": 1.66,
  "questionableRevenue": 0,
  "purificationRatio": 987.65,
  "debtToMarketCapRatio": 0.0416,
  "securitiesToMarketCapRatio": 0.1145
}

AWSDateTime

Description

An ISO8601 formatted datetime string.

Example

"2023-12-10:08:03.420Z"

AdvancedComplianceQuery

Description

Queries available for users with the advancedCompliance subscription package.

Fields

Field Name Description
report - AdvancedComplianceReport Retrieve the most recent advanced Shariah compliance report for a given symbol or FIGI identifier based on the given methodology. If the identifier is not recognized or no report is found, this will return null.

Arguments

input - AdvancedReportInput!

The input for retrieving a detailed compliance report for a given identifier and methodology. Both the methodolgy and some identifier (either symbol or figi) must be provided. If both are provided, figi will be used. An error will be thrown if neither are provided.

Different fields are returned depending on the screening methodology used. The AdvancedComplianceReport interface is the base type that contains all fields in common across different methodologies. GraphQL fragment queries can be used to retrieve fields unique to a specific methdology.

reports - AdvancedComplianceReportsPage! Retrieve a list of advanced Shariah compliance reports for a given region and methodology.

Arguments

input - AdvancedReportsInput!

The input for querying for a list of detailed compliance reports under the advancedCompliance API package. The methodology and region fields must be provided. The filters field is optional.

This API is paginated. To retrieve the next page of results, pass the nextToken value from the previous API response as the nextToken parameter. When the last page of results is reached, the nextToken field will be null.

regions - [String!]! Retrieve the list of supported regions/markets that have compliance reports available. These will always be ISO 3166-1 alpha-2 country codes (e.g. "US").
menaScreens - [MENAScreens!] Retrieve a list of stocks from MENA regions that are considered to be shariah compliant. The sandbox environment will just return a limited subset instead of mock data for this query.
externalScreens - [MENAScreens!] Use menaScreens instead.

Example

{
  "report": AdvancedComplianceReport,
  "reports": AdvancedComplianceReportsPage,
  "regions": ["xyz789"],
  "menaScreens": [MENAScreens],
  "externalScreens": [MENAScreens]
}

AdvancedComplianceReport

Description

Base interface used across a variety of Shariah compliance reports. Other reports may extend this interface with additional properties.

Fields

Field Name Description
symbol - String! The symbol Zoya uses to uniquely identify a stock. Exchange specific suffixes will be used for international exchanges outside the US.
rawSymbol - String! The symbol for the ticker without any exchange suffix included. Note that multiple distinct stocks may have identical symbols.
name - String! The name of the entity associated with this report.
figi - String The FIGI identifier for the entity associated with this report. This field may be null for some entities.
exchange - String! The exchange on which the stock is traded.
status - ComplianceStatus! The overall Shariah compliance status of the stock or security.
reportDate - AWSDateTime! The date the compliance report was last updated. Reports are updated based on company reports which are published at different times of the year.
businessScreen - ComplianceStatus! The Shariah compliance of the revenue sources of the associated entity.
financialScreen - ComplianceStatus! The Shariah compliance of financial ratios of the associated entity based on the screening methodology.
compliantRevenue - Float! Percentage of revenue earned that is considered Shariah compliant.
nonCompliantRevenue - Float! Percentage of revenue earned that is considered not Shariah compliant.
questionableRevenue - Float! Percentage of revenue earned that is considered questionable with regards to Shariah compliance. This may be due to broad differences of opinions among scholars or due to limited details published by the company for a given revenue segment.
purificationRatio - Float! The portion of profits to be donated to charity for purification. Multiply this number by dividends received or capital gains realized to determine the amount to donate.

Possible Types

AdvancedComplianceReport Types

AAOIFIReport

Example

{
  "symbol": "0R0K-LN",
  "rawSymbol": "0R0K",
  "name": "Cisco Systems, Inc.",
  "figi": "BBG00QDG6DB5",
  "exchange": "XLON",
  "status": "COMPLIANT",
  "reportDate": "2023-12-10:08:03.420Z",
  "businessScreen": "COMPLIANT",
  "financialScreen": "COMPLIANT",
  "compliantRevenue": 98.34,
  "nonCompliantRevenue": 1.66,
  "questionableRevenue": 0,
  "purificationRatio": 123.45
}

AdvancedComplianceReportsPage

Description

A page of advanced Shariah compliance reports. Use the nextToken field to retrieve the next page of results via subsequent API calls.

Fields

Field Name Description
items - [AdvancedComplianceReport!]! A list of advanced Shariah compliance reports.
nextToken - String The token to use to retrieve the next page of paginated results. This will be null if the last page has been reached and there are no more results.

Example

{
  "items": [AdvancedComplianceReport],
  "nextToken": "abc123"
}

AdvancedReportFilters

Description

Filters for limiting the list of Shariah compliance reports returned by the advancedCompliance/reports query.

Fields

Input Field Description
status - ComplianceStatus Set to a compliance status to filter for reports with that status.

Example

{"status": "COMPLIANT"}

AdvancedReportInput

Description

Input for querying for detailed compliance reports for a given identifier under the advancedCompliance API package.

Either symbol or figi must be provided. If both are provided, figi will be used. An error will be thrown if neither are provided.

Fields

Input Field Description
symbol - String

The symbol/ticker used to identify the stock on exchanges. For non-US symbols, the Bloomberg exchange suffix should be included (e.g., "TYT-LN" for "TYT" listing on the London Stock Exchange).

Either symbol or figi must be provided. If both are provided, figi will be used. An error will be thrown if neither are provided.

figi - String

The FIGI identifier for the entity whose compliance report is to be retrieved.

Either figi or symbol must be provided. If both are provided, figi will be used. An error will be thrown if neither are provided.

methodology - ScreeningMethodology! The screening methodology to use for Shariah compliance evaluation.

Example

{
  "symbol": "xyz789",
  "figi": "xyz789",
  "methodology": "AAOIFI"
}

AdvancedReportsInput

Description

Input for querying for a list of detailed compliance reports under the advancedCompliance API package.

This API is paginated. To retrieve the next page of results, pass the nextToken value from the previous API response as the nextToken parameter. When the last page of results is reached, the nextToken field will be null.

Fields

Input Field Description
region - String! The region to list reports from (e.g. "US", "GB", "CA"). Available regions can be discovered by querying the API by advancedCompliance/regions.
methodology - ScreeningMethodology! The screening methodology to use for Shariah compliance evaluation.
filters - AdvancedReportFilters Filters will be applied to the list of reports returned by this API. Currently, you can use this to only fetch reports with a specific shariah compliance status.
nextToken - String To retrieve the next page of results, pass the nextToken value from the previous API response as the nextToken parameter in the next API call.
limit - Int The maximum number of results to return per page. The default is 100 and the limit is 500.

Example

{
  "region": "xyz789",
  "methodology": "AAOIFI",
  "filters": AdvancedReportFilters,
  "nextToken": "abc123",
  "limit": 123
}

BasicComplianceQuery

Description

Queries available for users with the basicCompliance subscription package. Users with the advancedCompliance package also have permissions to these queries.

Fields

Field Name Description
report - BasicComplianceReport Retrieve the most recent Shariah compliance report for a given symbol based on the AAOIFI methodology. This endpoint is limited to US stocks only. If no report is found, this will return null.

Arguments

symbol - String!

The symbol of the stock to retrieve a compliance report for (e.g., "AAPL" or "AMD").

reports - BasicComplianceReportsPage! Retrieve a list of Shariah compliance reports based on the AAOIFI methodology. Limited to US equities only.

Arguments

input - BasicReportsInput

Optional input for pagination and filtering options when listing reports.

funds - BasicFundReportsPage! Retrieves a list of funds and their compliance reports. Currently only covers US-based ETFs.

Arguments

input - BasicFundsInput

Optional input for pagination and filtering options when listing funds. Currently, it is recommended to omit this. It is for forward-compatibility of additional filtering capabilities and fund types.

Example

{
  "report": BasicComplianceReport,
  "reports": BasicComplianceReportsPage,
  "funds": BasicFundReportsPage
}

BasicComplianceReport

Description

The Shariah compliance report available for a given security.

Fields

Field Name Description
symbol - String! The symbol/ticker used to identify the stock on exchanges.
name - String! The name of the company tied to the security.
exchange - String! The exchange on which the stock is traded.
status - ComplianceStatus! The Shariah compliance status of the security.
purificationRatio - Float! The portion of profits to be donated to charity for purification. Multiply this number by dividends received or capital gains realized to determine the amount to donate.
reportDate - AWSDateTime! The date the compliance report was generated. Different companies publish financial reports at different times of the year, but for any given security, this will usually update once a quarter.

Example

{
  "symbol": "xyz789",
  "name": "abc123",
  "exchange": "xyz789",
  "status": "COMPLIANT",
  "purificationRatio": 987.65,
  "reportDate": "2023-12-10:08:03.420Z"
}

BasicComplianceReportsPage

Description

A page of Shariah compliance reports. Use the nextToken field to retrieve the next page of results via subsequent API calls.

Fields

Field Name Description
items - [BasicComplianceReport!]! List of Shariah compliance reports.
nextToken - String The token to use to retrieve the next page of paginated results. This will be null if the last page has been reached and there are no more results.

Example

{
  "items": [BasicComplianceReport],
  "nextToken": "abc123"
}

BasicFundReport

Fields

Field Name Description
symbol - String! The symbol/ticker used to identify the fund on exchanges.
name - String! The name of the fund.
exchange - String The exchange on which the fund is traded. Nullable, as some funds may not have a specific exchange associated with them (e.g., some mutual funds).
status - ComplianceStatus! The Shariah compliance status of the fund.
holdingsAsOfDate - AWSDateTime! The latest date where fund holding information was available for the fund. Different funds publish updates at varying frequencies. Note that compliance report changes can occur even with no holdings information available due to compliance status changes of individual holdings.
purificationRatio - Float

NOTE: Only available for some customers. This value will be null by default. If you are interested in this field, please contact support.

The portion of profits to be donated to charity for purification. Multiply this number by dividends received or capital gains realized to determine the amount to donate.

reportDate - AWSDateTime! The date the compliance report was generated.

Example

{
  "symbol": "abc123",
  "name": "abc123",
  "exchange": "xyz789",
  "status": "COMPLIANT",
  "holdingsAsOfDate": "2023-12-10:08:03.420Z",
  "purificationRatio": 123.45,
  "reportDate": "2023-12-10:08:03.420Z"
}

BasicFundReportsPage

Description

A page of Shariah compliance reports for funds. The nextToken field can be used to retrieve the next page of results via subsequent API calls.

Fields

Field Name Description
items - [BasicFundReport!]! List of Shariah compliance reports of funds.
nextToken - String The token to use to retrieve the next page of paginated results. This will be null if the last page has been reached and there are no more results.

Example

{
  "items": [BasicFundReport],
  "nextToken": "xyz789"
}

BasicFundsInput

Description

Input for query/basicCompliance/funds field path. Currently, the API only returns ETFs, so this input can be omitted and all funds will be returned. The interface is structured for forward-compatibility with mutual funds and filter additions in the future.

Fields

Input Field Description
nextToken - String To retrieve the next page of results, pass the nextToken value from the previous API response as the nextToken parameter in the next API call. This field is optional.
limit - Int The maximum number of results to return per page. The default and maximum limit is 2000. This field is optional.

Example

{"nextToken": "abc123", "limit": 987}

BasicReportFilters

Description

Filters for limiting the list of Shariah compliance reports returned by the basicCompliance/reports query.

Fields

Input Field Description
status - ComplianceStatus Set to a compliance status to only return reports with that status.

Example

{"status": "COMPLIANT"}

BasicReportsInput

Description

Input for query/basicCompliance/reports field path. Supports filtering and pagination.

Fields

Input Field Description
filters - BasicReportFilters Filters will be applied to the list of reports returned by this API. Currently, you can use this to only fetch reports with a specific shariah compliance status. This field is optional.
nextToken - String To retrieve the next page of results, pass the nextToken value from the previous API response as the nextToken parameter in the next API call. This field is optional.
limit - Int The maximum number of results to return per page. The default is 100 and the maximum limit is 1000. This field is optional.

Example

{
  "filters": BasicReportFilters,
  "nextToken": "thisIsMyNextToken",
  "limit": 100
}

Boolean

Description

The Boolean scalar type represents true or false.

ComplianceStatus

Description

Possible Shariah compliance status for a given security or screen. Note that financial screens will never have a result of QUESTIONABLE.

Values

Enum Value Description

COMPLIANT

The security is shariah compliant with a given screening methodology.

NON_COMPLIANT

The security is not shariah compliant with a given screening methodology.

QUESTIONABLE

The revenue sources of the associated entity are either from an area where there is a great deal of difference of opinion among scholars as to their permissibility or the financial reports do not contain enough information to be able to make a definitive judgement.

UNRATED

The security has no rating for the given screening methodology.

Example

"COMPLIANT"

Float

Description

The Float scalar type represents signed double-precision fractional values as specified by IEEE 754.

Example

987.65

Int

Description

The Int scalar type represents non-fractional signed whole numeric values. Int can represent values between -(2^31) and 2^31 - 1.

Example

123

MENAScreens

Fields

Field Name Description
rawSymbol - String! The symbol for the ticker without any exchange suffix included. Note that multiple distinct stocks may have identical symbols, but a pair of symbol and exchange will uniquely identify a listing.
name - String! The name of the company tied to the security.
exchange - String! The exchange on which the stock is traded.
region - String! The region in which the stock is traded. Will always be an ISO 3166-1 alpha-2 country code (e.g. "KW" for Kuwait).
status - ComplianceStatus! The compliance status of the stock. Stocks in the MENA screened list will always be compliant.
reportDate - AWSDateTime! The date the compliance report was last updated. Reports are updated based on company reports which are published at different times of the year.

Example

{
  "rawSymbol": "abc123",
  "name": "xyz789",
  "exchange": "xyz789",
  "region": "xyz789",
  "status": "COMPLIANT",
  "reportDate": "2023-12-10:08:03.420Z"
}

ScreeningMethodology

Description

Possible screening methodologies for evaluating Shariah compliance. While all methodologies evaluate stocks based on impermissible income and exposure to interest, the specific forumulas to calculate results vary. Currently, only the AAOIFI methodology is supported, but we plan to add support for other methodologies in the future.

Values

Enum Value Description

AAOIFI

The methodology currently used today in the Zoya Mobile App.

Example

"AAOIFI"

String

Description

The String scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.

Example

"abc123"

ZakatCalculation

Description

The result of a zakat calculation for a set of holdings.

Fields

Field Name Description
zakatLiableAmount - Float! The sum of the calculated zakat liable amount for all holdings. The zakat due will be 2.5% of this number.
zakatDue - Float! The total zakat due for all given holdings.
currency - String! The ISO 4217 currency code for the zakat due amount. If holdings with mixed currencies were given as input, the results will be in USD.
holdings - [ZakatHoldingCalculation!]! The individual zakat calculations for each holding given as input.

Example

{
  "zakatLiableAmount": 987.65,
  "zakatDue": 987.65,
  "currency": "abc123",
  "holdings": [ZakatHoldingCalculation]
}

ZakatCalculationMethod

Description

Method used to calculate the zakatable amount and zakat due

Values

Enum Value Description

TREAT_AS_CASH

Treat holding as cash. The zakat due is 2.5% of the asset market value.

PASSIVE_INVESTMENT

The zakat liable amount is determined using a formula that considers the asset outstanding shares and total assets The zakat due is 2.5% of ((sharesHeld / outstandingShares) * currentAssets)

FALLBACK_30

Fallback of calculating the zakat on 30% of the asset market value The zakat due is 2.5% of 30% of the asset market value.

Example

"TREAT_AS_CASH"

ZakatHolding

Description

Input for zakat calculation of a holding

Fields

Input Field Description
symbol - String The symbol of the asset to calculate zakat for (e.g., "AAPL" or "AMD").
strategy - ZakatHoldingStrategy! The strategy to use for calculating zakat on this holding. ACTIVE should be used for holdings that are intended to be actively traded and held for less than 1 year. PASSIVE should be used for holdings that are intended to be held for more than 1 year.
quantity - Float! The number of shares or units of the asset held.
unitPrice - Float! The unit price of the asset in the currency it is denominated in.

Example

{
  "symbol": "abc123",
  "strategy": "ACTIVE",
  "quantity": 123.45,
  "unitPrice": 123.45
}

ZakatHoldingCalculation

Description

The result of a zakat calculation for a single holding.

Fields

Field Name Description
symbol - String The symbol of the asset that was used for the zakat calculation.
strategy - ZakatHoldingStrategy! The strategy used for calculating zakat on this holding.
currency - String! The ISO 4217 currency code for the asset.
marketValue - Float! The market value of the holding (quantity * unitPrice)
zakatLiableAmount - Float! The zakat liable amount for this holding. This will differ based on the zakat calculation strategy used for the holding.
zakatDue - Float! The zakat due for this holding. This will be 2.5% of the zakat liable amount.
calculationMethod - ZakatCalculationMethod! The zakat calculation method ultimately used for this holding. Some assets have special handling rules, such as how precious metals spot funds are treated as cash for zakat purposes. In cases where reliable data is not available for outstanding shares or current assets, a fallback method of taking 30% of the market value as the zakat liable amount is used.

Example

{
  "symbol": "abc123",
  "strategy": "ACTIVE",
  "currency": "abc123",
  "marketValue": 123.45,
  "zakatLiableAmount": 987.65,
  "zakatDue": 123.45,
  "calculationMethod": "TREAT_AS_CASH"
}

ZakatHoldingStrategy

Description

Enum of different strategies to use for calculating zakat on a holding. Actively traded holdings get treated as cash while passive investments factor in the percentage of shares owned relative to the current assets held by an entity as the basis for determining the zakat liable amount.

Values

Enum Value Description

ACTIVE

Should be used for holdings that are intended to be actively traded and held for less than 1 year. Active investments will be treated as cash for purposes of zakat calculation.

PASSIVE

Should be used for holdings that are intended to be held for more than 1 year. This approach factors in what percentage of a company you own and then looks at the proportional amount of current assets held by the company to determine the zakat liable amount. For ETFs and mutual funds, the calculation strategy is applied recursively over the holdings of the fund based on their weighted holdings.

Example

"ACTIVE"

ZakatQuery

Description

Queries available for users with the zakat subscription package. Users

Fields

Field Name Description
calculate - ZakatCalculation!

Arguments

holdings - [ZakatHolding!]!

Example

{"calculate": ZakatCalculation}

Ready to build

Start against the sandbox, read reportDate before you display any status, then switch the endpoint and key prefix to go live. The API Explorer is the quickest way to shape a query, and support@zoya.finance is the quickest way to get unstuck.