{
 "openapi": "3.1.0",
 "info": {
  "title": "Deep Almanac: Australian online stockbrokers",
  "version": "1.0.0",
  "summary": "Brokerage, CHESS sponsorship or custody, and who executes the orders, for the online brokers Australians use to buy ASX shares, each joined to its ASIC licence.",
  "description": "The online brokers open to new retail clients for ASX shares that have been found and checked against their own pages (not a guarantee that no other exists), each with its standard online brokerage as a tiered rule and priced at reference trade sizes, whether shares are held on the client's own CHESS HIN or by a custodian, and the market participant that executes its ASX orders. Each of those facts carries the URL and the sentence it was read from on the broker's own pages. Each broker is joined on AFS licence number to ASIC's licensee register for its licence, ABN and authorisations. Brokers: 88, of which 33 are open to new retail clients.\n\nEvery file is static JSON; no authentication, CORS open. This is reference data, not advice about which broker to use.",
  "termsOfService": "https://deepalmanac.com/terms",
  "contact": {
   "name": "Deep Almanac",
   "url": "https://deepalmanac.com"
  },
  "license": {
   "name": "Deep Almanac's own work CC BY 4.0; source data under its own terms, listed in licences in each index.json",
   "url": "https://deepalmanac.com/terms#data-licences"
  }
 },
 "servers": [
  {
   "url": "https://deepalmanac.com"
  }
 ],
 "security": [],
 "tags": [
  {
   "name": "stockbrokers",
   "description": "Australian online stockbrokers",
   "externalDocs": {
    "description": "Page",
    "url": "https://deepalmanac.com/au/finance/stockbrokers/"
   }
  }
 ],
 "paths": {
  "/au/finance/stockbrokers/v1/index.json": {
   "get": {
    "tags": [
     "stockbrokers"
    ],
    "operationId": "getStockbrokersIndex",
    "summary": "Dataset index",
    "description": "The dataset's files, timestamps, reference trade sizes and every broker with its page and JSON URL.",
    "responses": {
     "200": {
      "description": "Dataset index.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object",
         "properties": {
          "dataset": {
           "type": "string",
           "description": "Dataset name."
          },
          "page": {
           "type": "string",
           "description": "Human-readable page for the dataset.",
           "format": "uri"
          },
          "start_here": {
           "type": [
            "object",
            "null"
           ],
           "description": "The small file that answers most questions here: answer_file (a URL template), inputs (how to fill it), example (a filled-in URL) and sometimes also (the next file for a common variant).",
           "properties": {
            "answer_file": {
             "type": "string",
             "description": "URL template of the answer file."
            },
            "inputs": {
             "type": "string",
             "description": "What each placeholder takes."
            },
            "example": {
             "type": "string",
             "description": "A filled-in answer file URL.",
             "format": "uri"
            },
            "also": {
             "type": "string",
             "description": "Another file for a common variant of the question."
            },
            "lookup": {
             "type": "string",
             "description": "Where present: a /v1/lookup URL that takes the reader's own numbers, applies the bucket rules and redirects to the answer file.",
             "format": "uri"
            },
            "compare": {
             "type": "string",
             "description": "Where present: a /v1/compare URL that ranks every rate at the reader's exact amount and answers with JSON directly.",
             "format": "uri"
            }
           }
          },
          "generated_at": {
           "type": "string",
           "description": "When this index was written, UTC, YYYY-MM-DDTHH:MM:SSZ.",
           "format": "date-time",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"
          },
          "fetched_at": {
           "type": "string",
           "description": "When the source was last fetched, UTC, YYYY-MM-DDTHH:MM:SSZ.",
           "format": "date-time",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$"
          },
          "data_as_of": {
           "type": "string",
           "description": "How current the data is: a date (YYYY-MM-DD) or a UTC timestamp (YYYY-MM-DDTHH:MM:SSZ); data_as_of_basis says what it means here.",
           "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}:\\d{2}Z)?$"
          },
          "data_as_of_basis": {
           "type": "string",
           "description": "One sentence saying what data_as_of means for this dataset."
          },
          "source": {
           "type": "string",
           "description": "Data source statement."
          },
          "licence_note": {
           "type": "string",
           "description": "Terms of reuse and the not-advice note."
          },
          "licences": {
           "type": "array",
           "description": "What may be reused and on what terms, layer by layer: each layer's source, the fields it covers, its licence and the attribution it asks for. The last layer is Deep Almanac's own work (CC BY 4.0), covering every field no other layer names. Reusing a field means meeting the terms of the layer that covers it.",
           "items": {
            "type": "object",
            "required": [
             "layer",
             "covers",
             "licence",
             "licence_url",
             "attribution"
            ],
            "properties": {
             "layer": {
              "type": "string",
              "description": "The source."
             },
             "covers": {
              "type": "string",
              "description": "The fields it covers."
             },
             "licence": {
              "type": "string",
              "description": "Its licence, or why there is none."
             },
             "licence_url": {
              "type": [
               "string",
               "null"
              ],
              "format": "uri",
              "description": "The licence's own page, where it has one."
             },
             "attribution": {
              "type": "string",
              "description": "The credit the layer asks for."
             }
            }
           }
          },
          "questions": {
           "type": "string",
           "description": "This dataset's questions.json: what to ask the reader first and which file answers each.",
           "format": "uri"
          },
          "openapi": {
           "type": "string",
           "description": "This dataset's OpenAPI document.",
           "format": "uri"
          },
          "status": {
           "type": "string",
           "description": "https://deepalmanac.com/status.json: when every dataset was last fetched and when it counts as overdue.",
           "format": "uri"
          },
          "llms": {
           "type": "string",
           "description": "https://deepalmanac.com/llms.txt: the site's guide for language models.",
           "format": "uri"
          },
          "files": {
           "type": "array",
           "description": "Every top-level file this dataset publishes, as absolute URLs.",
           "items": {
            "type": "string",
            "format": "uri"
           }
          },
          "file_guide": {
           "type": "array",
           "description": "What each of those files holds, in the same order.",
           "items": {
            "type": "object",
            "properties": {
             "file": {
              "type": "string"
             },
             "url": {
              "type": "string",
              "format": "uri"
             },
             "description": {
              "type": "string"
             }
            }
           }
          },
          "brokers_checked": {
           "type": [
            "string",
            "null"
           ],
           "format": "date",
           "description": "The latest day a person re-read a broker's record against its own documents; each broker's checked gives its own day."
          },
          "brokers_checked_earliest": {
           "type": [
            "string",
            "null"
           ],
           "format": "date",
           "description": "The oldest of the brokers' own checked days."
          },
          "brokers_dir": {
           "type": "object",
           "properties": {
            "url_template": {
             "type": "string"
            },
            "page_template": {
             "type": "string"
            },
            "brokers": {
             "type": "array",
             "items": {
              "type": "object",
              "properties": {
               "slug": {
                "type": "string"
               },
               "name": {
                "type": "string"
               },
               "category": {
                "type": [
                 "string",
                 "null"
                ]
               },
               "url": {
                "type": "string",
                "format": "uri"
               },
               "page": {
                "type": "string",
                "format": "uri"
               }
              }
             }
            }
           }
          }
         },
         "required": [
          "dataset",
          "page",
          "start_here",
          "generated_at",
          "fetched_at",
          "data_as_of",
          "data_as_of_basis",
          "source",
          "licence_note",
          "licences",
          "questions",
          "openapi",
          "status",
          "llms",
          "files",
          "brokers_dir"
         ]
        }
       }
      }
     },
     "404": {
      "description": "Not published, or the path is wrong; static hosting returns the site's 404 page (HTML)."
     }
    }
   }
  },
  "/au/finance/stockbrokers/v1/questions.json": {
   "get": {
    "tags": [
     "stockbrokers"
    ],
    "operationId": "getStockbrokersQuestions",
    "summary": "What to ask a reader before answering a broker question",
    "description": "The questions this dataset answers and, for each, the inputs to collect first (trade size, CHESS or custodial, how often the reader trades, whether they want international shares) and the file that answers it; commentary on what is most often misread (GST, US-dollar brokerage, authorised representatives, pricing any size from the tiers); and what the dataset does not hold.",
    "responses": {
     "200": {
      "description": "What to ask a reader before answering a broker question.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "404": {
      "description": "Not published, or the path is wrong; static hosting returns the site's 404 page (HTML)."
     }
    }
   }
  },
  "/au/finance/stockbrokers/v1/stockbrokers.json": {
   "get": {
    "tags": [
     "stockbrokers"
    ],
    "operationId": "getStockbrokers",
    "summary": "Every broker",
    "description": "Every broker, including closed and merged ones with what became of them, with its brokerage tiers, prices at each reference size, any prepaid price (brokerage.prepaid) and plans in place of per-trade brokerage (plans), holding model, execution participant, quotes and licence.",
    "responses": {
     "200": {
      "description": "Every broker.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "404": {
      "description": "Not published, or the path is wrong; static hosting returns the site's 404 page (HTML)."
     }
    }
   }
  },
  "/au/finance/stockbrokers/v1/cheapest.json": {
   "get": {
    "tags": [
     "stockbrokers"
    ],
    "operationId": "getStockbrokersCheapest",
    "summary": "Cheapest brokers by trade size",
    "description": "Keyed by trade size in AUD; each an ordered list of the brokers open to new retail clients, cheapest first. A broker that charges in another currency is ranked on its price converted to AUD at the Reserve Bank's rate, recorded in its fx. Each row also carries the broker's prepaid price (prepaid_brokerage, for brokerage paid in advance) and the names of its plans, neither of which is ranked; prepaid and plans at the top level give their terms, and for a plan covering a value of orders a month, from how many trades a month at each size it costs less than the standard brokerage. For ETFs, cheapest-etf.json ranks the same brokers on their own ETF prices.",
    "responses": {
     "200": {
      "description": "Cheapest brokers by trade size.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "404": {
      "description": "Not published, or the path is wrong; static hosting returns the site's 404 page (HTML)."
     }
    }
   }
  },
  "/au/finance/stockbrokers/v1/cheapest-etf.json": {
   "get": {
    "tags": [
     "stockbrokers"
    ],
    "operationId": "getStockbrokersCheapestEtf",
    "summary": "Cheapest brokers for buying ETFs, by trade size",
    "description": "Keyed by trade size in AUD; the same brokers as cheapest.json, ranked for one ETF buy on the broker's own ETF price where it states one (etf_price_stated, applies_to) and its share brokerage otherwise, with the sell (sell_brokerage), which ETFs it trades (etf_coverage, etf_coverage_note) and any time-limited offer (offer, offer_until; not ranked) on each row. A row leaves out fields that would be null. etf_not_ranked lists the brokers left out and why.",
    "responses": {
     "200": {
      "description": "Cheapest brokers for buying ETFs, by trade size.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "404": {
      "description": "Not published, or the path is wrong; static hosting returns the site's 404 page (HTML)."
     }
    }
   }
  },
  "/au/finance/stockbrokers/v1/brokers/{slug}.json": {
   "get": {
    "tags": [
     "stockbrokers"
    ],
    "operationId": "getStockbroker",
    "summary": "One broker",
    "description": "One broker's record, as in stockbrokers.json.",
    "responses": {
     "200": {
      "description": "One broker.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "404": {
      "description": "Not published, or the path is wrong; static hosting returns the site's 404 page (HTML)."
     }
    },
    "parameters": [
     {
      "name": "slug",
      "in": "path",
      "required": true,
      "schema": {
       "type": "string"
      },
      "description": "Broker slug, as listed in index.json."
     }
    ]
   }
  },
  "/au/finance/stockbrokers/v1/openapi.json": {
   "get": {
    "tags": [
     "stockbrokers"
    ],
    "operationId": "getStockbrokersOpenApi",
    "summary": "This OpenAPI document",
    "description": "OpenAPI 3.1 description of this dataset (https://deepalmanac.com/openapi.json lists every dataset's document).",
    "responses": {
     "200": {
      "description": "This OpenAPI document.",
      "content": {
       "application/json": {
        "schema": {
         "type": "object"
        }
       }
      }
     },
     "404": {
      "description": "Not published, or the path is wrong; static hosting returns the site's 404 page (HTML)."
     }
    }
   }
  }
 }
}
