> For the complete documentation index, see [llms.txt](https://docs.aavso.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aavso.org/file-formats/solar-sff.md).

# Solar (SFF)

The file can be submitted as a standard comma-separated file (`.csv`) or an enhanced character-separated values format (`.ecsv`). For most users, the CSV file format should be sufficient. ECSV is intended for developers and observers who generate files programmatically.

Both formats share the same columns and data rows; an ECSV file is a CSV file with an additional commented header describing the schema.

#### Columns

All columns are required and must appear in the order shown below.

| Column     | Type    | Description                                                                                  |
| ---------- | ------- | -------------------------------------------------------------------------------------------- |
| `time_utc` | string  | Date and time of the observation in UTC, formatted as `YYYY-MM-DD HH:MM:SS` (24-hour clock). |
| `groups`   | integer | Total number of sunspot groups observed on the disk. Must equal `ng + cg + sg`.              |
| `sunspots` | integer | Total number of individual sunspots observed. Must equal `ns + cs + ss`.                     |
| `ng`       | integer | Number of groups in the **northern** zone of the disk.                                       |
| `ns`       | integer | Number of spots in the **northern** zone of the disk.                                        |
| `cg`       | integer | Number of groups in the **central** zone of the disk.                                        |
| `cs`       | integer | Number of spots in the **central** zone of the disk.                                         |
| `sg`       | integer | Number of groups in the **southern** zone of the disk.                                       |
| `ss`       | integer | Number of spots in the **southern** zone of the disk.                                        |
| `seeing`   | string  | Seeing quality at the time of observation. One of the codes below.                           |

The **Wolf number (W)** shown in the submission preview table is computed automatically as `W = 10 × groups + sunspots`. It is not included in the file.

#### Seeing codes

| Code | Meaning   |
| ---- | --------- |
| `E`  | Excellent |
| `G`  | Good      |
| `F`  | Fair      |
| `P`  | Poor      |

Seeing codes are case-insensitive; a single letter is required.

#### Validation

Files are validated when uploaded. A file is rejected if:

* The header row is missing, or column names do not match the specification exactly.
* `time_utc` is not in `YYYY-MM-DD HH:MM:SS` format, or the timestamp is in the future.
* Any count column is negative or non-integer.
* `groups` does not equal `ng + cg + sg`, or `sunspots` does not equal `ns + cs + ss`.
* `seeing` is not one of `E`, `G`, `F`, `P`.

If any row fails validation, the affected rows and reasons are shown in the submission form so they can be corrected before resubmitting.

### CSV

This is an example `.csv` file for submitting solar data.

```
time_utc,groups,sunspots,ng,ns,cg,cs,sg,ss,seeing
2026-06-04 05:57:18,5,42,2,18,2,15,1,9,G
2026-06-03 06:12:00,3,21,1,8,1,10,1,3,F
2026-06-02 05:45:30,7,68,3,30,2,22,2,16,E
2026-06-01 06:30:15,2,14,1,9,1,5,0,0,G
2026-05-31 05:50:00,4,33,1,11,2,14,1,8,P
```

### ECSV

The ECSV file format is useful for developers who wish to build their own parsers, validate data types before upload, or embed metadata directly in the file. The full schema is provided below. For more information about the format, see the [Astropy ECSV documentation](https://docs.astropy.org/en/stable/io/ascii/ecsv.html).

#### Metadata

The `meta` block must include:

| Key         | Description                                  |
| ----------- | -------------------------------------------- |
| `observer`  | Your AAVSO observer code (e.g., `OBS`).      |
| `equipment` | Your AAVSO equipment name.                   |
| `schema`    | The schema version. Currently `astropy-2.0`. |

**Note:** The Obscode and Equipment selected in the submission form are overridden by values in the `meta` block.&#x20;

#### Example

```
# %ECSV 1.0
# ---
# delimiter: ','
# datatype:
# - {name: time_utc, datatype: string}
# - {name: groups, datatype: int64}
# - {name: sunspots, datatype: int64}
# - {name: ng, datatype: int64}
# - {name: ns, datatype: int64}
# - {name: cg, datatype: int64}
# - {name: cs, datatype: int64}
# - {name: sg, datatype: int64}
# - {name: ss, datatype: int64}
# - {name: seeing, datatype: string}
# meta:
#   observer: OBS
#   equipment: My Telescope
#   schema: astropy-2.0
time_utc,groups,sunspots,ng,ns,cg,cs,sg,ss,seeing
2026-06-04 05:57:18,5,42,2,18,2,15,1,9,G
2026-06-03 06:12:00,3,21,1,8,1,10,1,3,F
2026-06-02 05:45:30,7,68,3,30,2,22,2,16,E
2026-06-01 06:30:15,2,14,1,9,1,5,0,0,G
2026-05-31 05:50:00,4,33,1,11,2,14,1,8,P
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.aavso.org/file-formats/solar-sff.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
